Custom Post Types nelle Pagine delle Categorie
Sto lavorando con un custom post type che utilizza le normali categorie di WordPress.
Sono in grado di modificare il mio template di categoria per visualizzare i miei custom post types esattamente come voglio.
Il problema è che, una volta fatto questo, anche i normali post del blog vengono influenzati.
Naturalmente posso limitare sia i normali post del blog che il post type a una sola categoria e creare un category-ID.php per lavorare solo con quella categoria.
Ma mi chiedo se esiste una soluzione più flessibile?
È possibile creare template di categoria specifici per i diversi tipi di post, cioè uno per mostrare i post normali, uno per mostrare i custom post types, ecc?
È possibile tutto questo? Se no, qual è il modo migliore per aggirare questo problema?

Per i custom post type con tassonomia personalizzata, puoi creare un template specifico per quella tassonomia. Il tuo template per la tassonomia personalizzata dovrebbe chiamarsi taxonomy-{taxonomy}.php
. Ad esempio, se la tua tassonomia si chiama "categorie-cucina", dovresti nominare il tuo file taxonomy-categorie-cucina.php
.
Puoi trovare maggiori informazioni sui template file per gli archivi speciali di tassonomia nel codex qui: http://codex.wordpress.org/Template_Hierarchy#Custom_Taxonomies_display

Puoi basarti sul tipo di post in questo modo:
supponi di avere category.php
per i post regolari e your-custom-type-category.php
per i post del tuo tipo personalizzato, quindi aggiungi semplicemente questo al tuo category.php regolare all'inizio.
<?php if (have_posts()){
the_post();
if( 'your_custom_type' == get_post_type( $post ) ) {
rewind_posts();
get_template_part('your-custom-type-category');
exit();
}
rewind_posts();
}
?>
E ora ogni volta che viene richiesta una categoria, controllerà il tuo tipo di post personalizzato e, se trovato, utilizzerà your-custom-type-category.php
come template, mentre tutti i post regolari verranno visualizzati utilizzando category.php
senza modifiche.
Spero questo sia d'aiuto

Ciao @Kelvin Jayanoris:
C'è un motivo per cui non puoi semplicemente verificare il valore di $post->post_type
con un'istruzione if..elseif
all'interno del tuo Loop, in questo modo:
<?php if ($post->post_type=='foo'): ?>
Inserisci qui l'HTML per il post type 'foo'...
<?php else if ($post->post_type=='bar'): ?>
Inserisci qui l'HTML per il post type 'bar'...
<?php else if ($post->post_type=='post'): ?>
Inserisci qui l'HTML per il post type 'post'...
<?php endif; ?>
Oppure c'è un motivo per cui non puoi creare la tua gerarchia di nomi di template sotto forma di file come post-foo.php
, post-foo.php
, post-post.php
, sempre all'interno del tuo Loop?
Questo codice potrebbe farlo:
<?php include("post-{$post->post_type}.php"); ?>

Una soluzione più semplice se non vuoi creare nuovi file o passare attraverso il problema di modificare le tue query è usare questo nel tuo functions.php:
function sql_where_clause($sql) {
if (is_category()) {
$sql = str_replace("cms_posts.post_type = 'post'", "cms_posts.post_type='post' OR cms_posts.post_type = 'news' OR cms_posts.post_type='event'", $sql);
}
return $sql;
}
add_filter('posts_where', 'sql_where_clause');
Ovviamente, dovrai modificarlo in modo che includa i tuoi custom post type. Ho fatto questo in modo che il mio category.php rispondesse a tutti i custom post type che volevo come se dovessero normalmente essere lì. Risparmia un sacco di problemi.
Modifica: Fai attenzione alla versione di WP su cui usi questo codice. Sembra che le versioni più vecchie di WP utilizzassero wp_posts invece di cms_posts, quindi verifica quali nomi di tabelle devi usare o otterrai risultati strani (praticamente non verrà mostrato nulla)
