web-dev-qa-db-fra.com

Comment afficher les articles standard et les types d'articles personnalisés relevant d'une catégorie en utilisant uniquement le modèle de catégorie générique?

1) Mon site contient des publications et 2 types de publications personnalisées (actualités et essais) 2) Elles partagent toutes des catégories normales telles que sports et santé (aucune taxanomie personnalisée n'est impliquée). 3) Utilisation du modèle générique category.php, comment puis-je le configurer Ce modèle gère toutes les catégories tout en affichant tout le contenu correspondant, quel que soit le type de publication de contenu.

Ou simplement, j'aimerais que le modèle générique category.php gère tous les affichages de catégories, mais devrait également inclure des types de publication personnalisés.

C’est peut-être une question stupide mais je suis retourné à Wordpress après une longue interruption et je trouve les thèmes Wordpress par défaut difficiles à comprendre. Juste confus et frustré en ce moment.

S'il vous plaît aider

4
damx

Examinez la fonction query_posts () - votre meilleur moyen de modifier la requête principale/par défaut. Vous souhaitez appeler au préalable global $wp_query pour modifier la requête d'origine au lieu de la remplacer.

Quelque chose comme ça devrait faire l'affaire pour vous. Placez les quatre premières lignes dans votre category.php juste avant le début de la boucle principale:

// Modify the default loop, include custom post types
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'any' ) );
query_posts( $args );

// The beginning of the loop looks like this:
while ( have_posts() ) : the_post();

Si vous voulez être plus sélectif dans l'affichage de vos types d'article, vous pouvez fournir un tableau avec les types d'article souhaités au lieu de 'post_type'=>'any' générique:

$args = array_merge( $wp_query->query, array( 'post_type' => array('post','news','essays') ) );

Et bienvenue dans l’univers WordPress et la communauté WPSE.
Je suis sûr que la frustration aura bientôt disparu;)

6
Michal Mau

Au début, j'ai utilisé la solution de Maugly, mais j'ai trouvé celle-ci dans WordPress Codex:

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

J'espère que ça va aider quelqu'un .. peut-être que ce n'est pas le plus propre mais un peu plus propre que la solution de Maugly ..

2
Kower

Je voulais ajouter à cela, en référence à la réponse de @ tivnet. ( J'aurais aimé laisser un commentaire mais mon représentant n'est pas assez haut )

J'ai trouvé les solutions qui fonctionnaient, mais elles ont probablement eu pour conséquence involontaire d'affecter également la zone d'administration, ce qui signifie que la consultation des publications dans wp-admin (wp-admin/edit.php) afficherait également toutes les pages et tous les types de publication personnalisés. dans la liste des messages génériques. Peut-être déroutant pour les autres utilisateurs? Cependant, en ajoutant:

and !is_admin()

dans l’instruction if () semble résoudre ce problème tout en conservant l’amendement pre_get_posts au début du processus.

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');
    }
}
0
steveBeeSmart

► Voici ma version de la suggestion de @ Kower. Résout quelques problèmes d'administration.

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'));
    }
}
0
tivnet

Pour inclure un type de publication personnalisé dans la boucle normale (c'est-à-dire une page de publications), ajoutez simplement le code suivant à index.php avant la if ( have_posts() ) :

$args = array(
'post_type'   => array('post', 'custom_post_type'),
'post_status' => 'publish',
);
$new_post_loop = new WP_Query( $args );

puis modifiez les deux lignes suivantes:

if ( have_posts() ) : changez-le en if ( $new_post_loop -> have_posts() ) :

et

while ( have_posts() ) : the_post(); to while ( $new_post_loop -> have_posts() ) : $new_post_loop -> the_post();

Cette solution évite d'avoir le type de publication personnalisé répertorié dans l'écran de toutes les publications du backend, ce qui génère add_action ('pre_get_posts');)

0
Mangucha
function namespace_add_custom_types( $query ) 
{
 if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) 
 {
   $query->set( 'post_type', array(
  'post', 'nav_menu_item', 'your-custom-post-type-here'
   ));
  return $query;
}
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
0
Nikunj w3Nuts