Afișarea arhivei de categorii pentru tipuri de postări personalizate
Am început să folosesc Custom Post Types destul de recent și îmi cer scuze dacă întrebarea mea pare stupidă, dar nu pot găsi un răspuns la întrebarea mea.
Am configurat un tip de postare personalizat numit actors cu câteva câmpuri personalizate și, (foarte important), folosesc categorii standard pentru a separa acești actori în listări de bărbați, femei și copii:
'taxonomies' => array('category', 'post_tag')
...deoarece am crezut că ar fi o modalitate mult mai curată și mai ordonată de... ei bine, categorizare a actorilor. Cu toate acestea, sunt complet blocat în ceea ce privește modul de afișare a acestor categorii în orice fel.
Am un fișier personalizat archive-actors.php
care afișează toți actorii, dar vreau să pot să îi filtrez după categorie; de exemplu să afișez doar bărbații. Totuși, dacă încerc un URL standard precum mysite.com/category/actors/men
primesc doar
Ne pare rău, dar nu există încă nicio postare în categoria Bărbați.
Același lucru se întâmplă dacă încerc doar mysite.com/category/men
- în niciunul dintre cazuri nu folosește template-ul archive-actors.php
.
Poate cineva să mă ajute să-mi clarific această confuzie și să mă îndrume în direcția corectă pentru a putea filtra acești actori încăpățânați?
Editare:
Așa cum sugerează @mrwweb mai jos (și am uitat să menționez că am încercat), următorul cod poate fi adăugat în fișierul functions.php
:
function query_post_type($query) {
$post_types = get_post_types();
if ( is_category() || is_tag()) {
$post_type = get_query_var('actors');
if ( $post_type ) {
$post_type = $post_type;
} else {
$post_type = $post_types;
}
$query->set('post_type', $post_type);
return $query;
}
}
add_filter('pre_get_posts', 'query_post_type');
...așa cum este menționat aici, care funcționează în sensul că va afișa tipurile mele de postări personalizate categorizate pe pagina regulată archive.php
, dar nu utilizează archive-actors.php
, care este esențial.

Puteți forța utilizarea șablonului personalizat pentru categorii folosind filtrul category_template
:
function wpa57439_category_template( $templates = '' ){
if( !is_array( $templates ) && !empty( $templates ) ) {
$templates = locate_template( array( 'archive-actors.php', $templates ), false );
}
elseif( empty( $templates ) ) {
$templates = locate_template( 'archive-actors.php', false );
}
else {
$new_template = locate_template( array( 'archive-actors.php' ) );
if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
}
return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );
adaptat după Filtrul ierarhiei din codex.

Acesta este comportamentul așteptat al arhivelor de categorii. După cum se poate vedea aici pe forumurile de Suport, următorul fragment de cod ar trebui să rezolve problema (doar schimbați "article" cu tipul postului dvs.):
add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
if(is_category() || is_tag()) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('post','articles','nav_menu_item');
$query->set('post_type',$post_type);
return $query;
}
}
ACTUALIZARE: Ups. Am luat fragmentul greșit. Voiam să folosesc acesta.

Singur, acel fragment de cod nu va face nimic; există o paranteză excesivă la sfârșit și $query
este nedefinit. Am găsit discuția la care te-ai referit mai devreme și am încercat-o în contextul unui filtru pre_get_posts
în fișierul meu functions.php
; acest lucru pare să funcționeze, dar nu utilizează șablonul meu personal archive-actors.php
, ceea ce este frustrant.

Alternativ, ceea ce poți face este să adaugi o nouă regulă wp_rewrite pentru a crea o structură de URL nouă pentru afișarea doar a postărilor dintr-un anumit CPT (tip de postare personalizată) și categorie. Ceva similar cu .gist-ul pe care l-am postat aici:
[edit: nu pot încorpora .gists așa că iată codul și link-ul ]
/**
* Acest exemplu poate fi extins și utilizat pentru etichete sau orice altă taxonomie.
*/
add_action('init', 'category_cpt_rewrites');
function category_cpt_rewrites() {
$custom_post_types = array('video', 'audio', 'photo', 'file'); // exemple de tipuri de postări personalizate
foreach ( $custom_post_types as $post_type ) {
$rule = '^' . $post_type . '/category/(.+?)/?$';
$rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
add_rewrite_rule($rule,$rewrite,'top');
}
}
// asigură-te că resetezi regulile
// acest cod va prelua următoarea structură de URL (exemplu cu CPT video și categorie politică) -> video/category/politics și va returna postări din categoria politics care aparțin tipului de postare personalizată "video".
// reține că dacă dorești ca această soluție să fie cu adevărat eficientă, va trebui să creezi o funcție personalizată "the_category()" sau similară pentru a returna structura corectă de URL pentru o listă de categorii aparținând unei postări de tip personalizat.

Șabloane de Taxonomie
https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy
Când slug-ul taxonomiei de categorie este "actors-category":
Creați-l din șablonul de categorie: taxonomy-actors-category.php
