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í.