Come visualizzare post regolari e custom post types sotto una categoria usando solo il template generico category.php?

28 ago 2011, 11:37:50
Visualizzazioni: 14.5K
Voti: 5

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

0
Tutte le risposte alla domanda 6
1

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 ;)

28 ago 2011 12:15:11
Commenti

Ha funzionato! Grazie mille Maugly. Non riesco a esprimere abbastanza gratitudine... era così frustrante. Ti voglio bene... come ammiratore platonico, ovviamente :p

damx damx
30 ago 2011 10:18:41
0

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

22 gen 2013 15:07:27
1

► 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'));
    }
}
15 mar 2013 04:01:10
Commenti

Anche possibile: $query->set('post_type', 'any');

tivnet tivnet
15 mar 2013 05:53:12
0

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');
    }
}
13 dic 2017 18:43:37
0

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') ;)

13 dic 2018 20:10:56
0
/**
 * 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' );
11 gen 2019 11:08:53