Visualizzazione dell'archivio delle categorie dei custom post type
Sono terribilmente in ritardo sulla festa dei Custom Post Type e ho iniziato a usarli solo di recente, quindi mi scuso se le mie domande sembrano idiote, ma non riesco a trovare una risposta alla mia domanda.
Ho impostato un custom post type chiamato actors con alcuni valori di campi personalizzati e (fondamentalmente) sto usando le categorie standard per separare questi attori in elenchi di uomini, donne e bambini:
'taxonomies' => array('category', 'post_tag')
...poiché pensavo che sarebbe stato un modo molto più pulito e ordinato di... beh, categorizzare gli attori. Tuttavia, sono completamente bloccato su come visualizzare effettivamente queste categorie in qualsiasi modo, forma o formato.
Ho un file personalizzato archive-actors.php
che visualizza tutti gli attori, ma voglio essere in grado di filtrarli per categoria; ad esempio visualizzare solo gli uomini. Tuttavia, se provo con un URL standard come mysite.com/category/actors/men
ottengo solo
Spiacenti, ma non ci sono ancora post nella categoria Uomini.
La stessa cosa accade se provo semplicemente mysite.com/category/men
- in nessuno dei due casi viene utilizzato il template archive-actors.php
.
Qualcuno può aiutarmi a dissipare la mia nebbia mentale e indicarmi la direzione giusta per poter filtrare questi fastidiosi attori?
Modifica:
Come accenna @mrwweb qui sotto (e ho dimenticato di menzionare che ci avevo provato), il seguente codice può essere aggiunto al file 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');
...come riferito qui che funziona, nel senso che visualizzerà i miei custom post type categorizzati nella pagina normale archive.php
, ma non utilizza il mio archive-actors.php
, che è fondamentale.

Puoi forzare l'uso del tuo template per le categorie con il filtro category_template
:
function wpa57439_category_template( $templates = '' ){
if( !is_array( $templates ) && !empty( $templates ) ) {
$templates = locate_template( array( 'archive-attori.php', $templates ), false );
}
elseif( empty( $templates ) ) {
$templates = locate_template( 'archive-attori.php', false );
}
else {
$new_template = locate_template( array( 'archive-attori.php' ) );
if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
}
return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );
adattato da Filter Hierarchy nel codex.

Questo è il comportamento previsto per gli archivi delle categorie. Come trovato qui nei forum di Supporto, il seguente snippet dovrebbe risolvere il tuo problema (basta cambiare "article" con il tuo tipo di post):
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;
}
}
AGGIORNAMENTO: Ops. Ho preso lo snippet sbagliato. Volevo usare questo.

Da solo quel frammento di codice non farà nulla; c'è una parentesi estranea alla fine e $query
non è definito. Avevo trovato il thread a cui ti riferivi prima e l'ho provato nel contesto di un filtro pre_get_posts
nel mio file functions.php
; questo sembra funzionare, ma non utilizza il mio template personalizzato archive-attori.php
, il che è frustrante.

In alternativa, puoi aggiungere una nuova regola wp_rewrite per creare una nuova struttura URL per visualizzare solo gli articoli in un determinato CPT e categoria. Qualcosa come il .gist che ho pubblicato qui:
[modifica: non posso incorporare .gists quindi ecco il codice e il link]
/**
* Questo potrebbe essere estrapolato e utilizzato per tag o qualsiasi altra tassonomia.
*/
add_action('init', 'category_cpt_rewrites');
function category_cpt_rewrites() {
$custom_post_types = array('video', 'audio', 'photo', 'file'); //alcuni esempi di post type
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');
}
}
//assicurati di svuotare le regole
//questo prenderà la seguente struttura URL (esempio con CPT video e categoria politica) -> video/category/politica e restituirà gli articoli appartenenti alla categoria politica che sono nel custom post type "video".
//nota che se vuoi che questo sia veramente efficace, dovrai creare una funzione template personalizzata "the_category()" o simile per restituire la corretta struttura URL per un elenco di categorie appartenenti a un articolo di custom post type.

Template per Tassonomie
https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy
Quando lo slug della tua tassonomia di categoria è "actors-category":
Crearlo dal template di categoria: taxonomy-actors-category.php
