Come visualizzare post regolari e custom post types sotto una categoria usando solo il template generico category.php?
1) Il mio sito ha post normali e 2 custom post type (news e saggi) 2) Condividono tutte le categorie normali come sport e salute (nessuna tassonomia personalizzata coinvolta) 3) Utilizzando il template generico category.php, come posso fare in modo che questo template gestisca tutte le categorie mostrando tutti i contenuti che vi rientrano, indipendentemente dal tipo di contenuto.
O più semplicemente, vorrei che il template generico category.php gestisse tutte le visualizzazioni delle categorie ma dovrebbe includere anche i custom post type.
Questa potrebbe essere una domanda stupida ma sono tornato a WordPress dopo una lunga pausa e trovo difficile capire i temi predefiniti per fare questo. Sono solo confuso e frustrato al momento.
Per favore aiutami

Dai un'occhiata alla funzione query_posts() - il tuo amico per modificare la query principale/predefinita. Dovrai chiamare la variabile globale $wp_query
in anticipo per modificare la query originale invece di sostituirla.
Qualcosa come questo dovrebbe funzionare. Inserisci le prime quattro righe nel tuo category.php
appena prima che inizi il loop principale:
// Modifica il loop predefinito, includi i custom post type
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'any' ) );
query_posts( $args );
// L'inizio del loop sarà così:
while ( have_posts() ) : the_post();
Se vuoi essere più selettivo nel mostrare i tuoi post type, puoi fornire un array con i tipi di post desiderati invece del generico 'post_type'=>'any'
:
$args = array_merge( $wp_query->query, array( 'post_type' => array('post','news','essays') ) );
E bentornato nell'universo WordPress e nella comunità WPSE.
Sono sicuro che la frustrazione passerà presto ;)

Inizialmente ho utilizzato la soluzione di Maugly, ma poi ho trovato questa nel codex di WordPress:
add_action( 'pre_get_posts', 'add_my_custom_post_type' );
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type( $query ) {
if ($query->is_main_query())
$query->set( 'post_type', array( 'post', 'page', 'any_custom_type' ) );
return $query;
}
Spero possa essere utile a qualcuno.. forse non è la soluzione più pulita, ma è un po' più ordinata rispetto a quella di Maugly..

► Ecco la mia versione del suggerimento di @Kower. Risolve un paio di problemi nell'amministrazione.
add_action('pre_get_posts', 'add_my_custom_post_type');
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type($query) {
if(
empty($query->query['post_type'])
or $query->query['post_type'] === 'post'
){
$query->set('post_type', array('post', 'my_custom_type'));
}
}

Volevo aggiungere a questo, in riferimento alla risposta di @tivnet. (Avrei voluto lasciare un commento ma la mia reputazione non è abbastanza alta)
Ho scoperto che le soluzioni funzionavano, ma presumibilmente avevano la conseguenza non voluta di influenzare anche l'area di amministrazione, il che significa che visitare i post in wp-admin (wp-admin/edit.php) mostrava anche tutte le pagine e tutti i tipi di post personalizzati nell'elenco generico dei post. Forse confuso per altri utenti? Tuttavia, aggiungendo:
and !is_admin()
all'interno dell'istruzione if() sembra risolvere questo problema mantenendo la modifica pre_get_posts sul front end.
add_action('pre_get_posts', 'add_my_custom_post_type');
/**
* @param WP_Query $query
* @return WP_Query
*/
function add_my_custom_post_type($query) {
if(
empty($query->query['post_type'])
or $query->query['post_type'] === 'post'
and !is_admin()
){
$query->set('post_type', 'any');
}
}

Per includere un custom post type nel loop regolare (ad esempio nella pagina degli articoli) aggiungi il seguente codice in index.php prima di if ( have_posts() ) :
$args = array(
'post_type' => array('post', 'custom_post_type'),
'post_status' => 'publish',
);
$new_post_loop = new WP_Query( $args );
poi modifica le seguenti due righe:
if ( have_posts() ) :
cambialo in if ( $new_post_loop -> have_posts() ) :
e
while ( have_posts() ) : the_post();
in while ( $new_post_loop -> have_posts() ) : $new_post_loop -> the_post();
Questa soluzione evita il problema di avere il custom post type elencato nella schermata di tutti gli articoli nel backend, cosa che invece accade usando add_action('pre_get_posts') ;)

/**
* Aggiunge tipi di post personalizzati alla query principale
* per farli apparire negli archivi di categoria e tag
*/
function namespace_add_custom_types( $query )
{
// Verifica se è una pagina di categoria o tag e i filtri non sono soppressi
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) )
{
// Imposta i tipi di post da includere nella query
$query->set( 'post_type', array(
'post', // Post standard
'nav_menu_item', // Voci di menu
'your-custom-post-type-here' // Sostituire con il vostro custom post type
));
return $query;
}
}
// Aggiunge il filtro per modificare la query prima che venga eseguita
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
