Hromadná změna typu příspěvků ve WordPress

WordPress Buttons sent by community team to our WordCamp

Někdy je na webu článků tolik, že ani rozdělení do kategorií nestačí a v tu chvíli se může hodit rozdělení do samostatných typů příspěvků (post type). Obzvláště pak, když mají některé kategorie i vlastní meta pole. Ruční úprava může být docela otravná a tak si v tomhle návodu ukážeme, jak si práci usnadnit pomocí několika řádků kódu.

Příprava argumentů pro načtení příspěvků, kterým změníme typ příspěvku

Příspěvky si načteme pomocí třídy WP_Query. Tato třída umožňuje načíst příspěvky všech typů podle mnoha argumentů, které najdete na stránce dokumentace. V téhle ukázce si ale ukážeme, jak najít příspěvky typu post, s kategorií událost. Argumenty pro vyhledání příspěvků si připravíme do array pod proměnnou $args.

Základ argumentů bude vypadat nějak takto.

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
);

Tyto argumenty nám zajistí zobrazení všech příspěvků typu post. My však chceme vybrat jednu konkrétní kategorii. Toho můžeme dosáhnout několika různými argumenty.

  • cat (int) – tento argument můžeme použít, když známe id, pod kterou je kategorie v databázi
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'cat'            => 1,
);
  • category_name (string) – slug kategorie, neboli její název bez háčků a čárek
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'category_name'  => 'novinky',
);
  • category__in (array) – pole s id kategorií, které mají být zahrnuté. Vezme příspěvky, které mají alespoň jednu z těchto kategorií.
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'category_in'    => [1, 3, 8],
);
  • category__not_in (array) – podobně jako předchozí, ale vybere články, které nejsou v ani jedné ze zadaných kategorií
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'category_not_in'    => [2, 4, 7],
);
  • category__and (array) – vybere příspěvky, které jsou ve všech ze zadaných kategorií.
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'category_and'   => [1, 2],
);

Celý kód pro změnu typu příspěvků

Pozor: před spuštěním úpravy si nezapomeňte zálohovat váš web, aby nedošlo ke ztrátě v případě, že se něco postaví do cesty vašemu záměru!

Celý kód pro změnu post typu zabalíme do funkce, kterou zavěsíme na hook init. Hned na úvod vložíme podmínku, kterou zamezíme spuštění kódu jinému uživateli, než administratorovi. Jakmile máme kód uložený do functions.php souboru šablony. Tak pouze otevřeme nějakou stránku na našem webu. Názvy nalezených příspěvků se nám zobrazí na horní části stránky. Když pak stránku načteme znovu, tak by se nám už neměly zobrazit žádné názvy příspěvků, protože byl typ příspěvků už změněn a tady už žádné příspěvky neodpovídají zadaným argumentům.

function ceskepluginycz_ti_zmeni_post_type() {
  if(!current_user_can( 'administrator' )) return;
    // Získejte všechny články s post typem "post"
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => -1,
        'category_name'  => 'udalosti'
    );

    $query = new WP_Query( $args );

    // Pokud jsou nalezeny články
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();

            // pro kontrolu můžete nechat zobrazit názvy příspěvků, které budou změněny
            the_title(); 

            // Změňte post type na "udalosti"
            set_post_type( get_the_ID(), 'udalosti' );
        }
    }

    // Obnovte původní nastavení dotazu
    wp_reset_postdata();
}

// Spusťte funkci při inicializaci WordPressu
add_action( 'init', 'ceskepluginycz_ti_zmeni_post_type' );

Po dokončení kód ze souboru functions.php zase odstraňte, nebo zakomentujte pro pozdější použití.

MĚJTE PŘEHLED, CO SE DĚJE NA
ČESKÝCH PLUGINECH

A navíc získejte slevu 10 % na váš první nákup!

Nespamujeme! Další informace naleznete v našich zásadách ochrany osobních údajů.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

17 + šestnáct =