web-dev-qa-db-fra.com

Problème avec pre_get_posts sur des pages d'archive de type publication personnalisées

Vue d'ensemble

  1. Je crée un thème qui a 2 types de publication personnalisés (sous forme de plugins personnalisés):

    1. Des articles
    2. Avis
  2. J'ai également créé des modèles single-articles.php et archive-articles.php à l'intérieur du plugin. Idem pour les examens CPT.

  3. Les types de publication personnalisés utilisent les par défautTaxonomies WordPress (catégories et balises)

  4. Mes paramètres de lecture sont réglés sur "Une page statique"

    1. Première page: Accueil (un fichier front-page.php personnalisé que j'ai créé)

    2. Posts Page: La page "Site News" (que je veux montrerLES DEUXpostsET/ CPT)

Le problème

Après avoir créé un message régulieret/ basé sur les articles CPT, je suis allé à la page Principaux messages (Nouvelles du site) où j’ai fait pasvoir le type de message personnalisé (uniquement poste utilisant le type standard post).

Après quelques recherches (je suis un noob), j'ai compris que si je voulais afficher les CPT sur la page principale des articles, je devrais écrire un filtre en utilisant pre_get_posts.

Donc, pour récapituler: je souhaite montrer

  1. LES DEUX messages ordinaires ET les types de messages personnalisés (CPT) sur la page Messages principaux
  2. LES DEUX messages ordinaires ET les types de messages personnalisés (CPT) pour les pages Archives de catégories

Voici ce que j'ai fait

// Add custom post types to the default loop (ref: http://bit.ly/1bqeBJC)
function odigbs_add_custom_types( $query ) {
    if ( !is_admin()  && !is_preview() ) {
        if ( (is_home() || is_category() || is_tag() || is_archive()  || is_feed() ) && $query->is_main_query()  ) {
            $query->set( 'post_type', array( 'post', 'articles', 'reviews') );
            return $query;
        }
    }
}
add_filter( 'pre_get_posts', 'odigbs_add_custom_types' );

Je suis sûr que c’est pas la bonne façonde fabriquer ce filtre, mais je ne trouve aucun article qui explique ce concept de manière approfondie… donc je suiswingin il.

Les résultats

  1. Si je vais à: http://site.dev/the-site-news/la page principale des posts de Reading Settings), je suis maintenant _ (DO/ voir tous mes types de posts personnalisés etil utilise le fichier single-{post_type}.php à l'intérieur du plugin.
  2. Si je clique sur l'un des termes de taxonomie, la page se trouve dans: http://site.dev/category/{some term}/et/ il utilise le fichier archive-{post_type}.php à l'intérieur du plug-in.

mais ...

  1. Si je pointe mon navigateur sur http://site.dev/{custom_post_type}c’est-à-dire que je n’utilise pas la catégorie) pour voir les archives de ce CPT, le site génère toutes sortes d’erreurs.
  2. Mais si je désactive le filtre, alors je _ (canpasse maintenant à http://starter.dev/{custom_post_type}/, mais je suis de retour à l'endroit où j'ai commencé avec uniquement les publications par défaut affichées sur la page des publications principales. Types de poste.

Questions

  1. Est-ce que (comme je le soupçonne) le problème est dans le filtre?
  2. Si oui, comment devraitil être écrit?

J'espère avoir clairement articulé le drame ...

Merci d'avance

1
sleeper

Si nous regardons dans source , nous verrons dans quelles conditions is_archive est vrai:

if ( $this->is_post_type_archive
|| $this->is_date
|| $this->is_author
|| $this->is_category
|| $this->is_tag
|| $this->is_tax )
    $this->is_archive = true;

Le problème est que is_archive déclenche votre filtre sur votre archive de type publication. Si vous voulez les exclure, assurez-vous que c'estnotis_post_type_archive , ou ciblez les autres archives en vérifiant s'il s'agit d'un auteur ou d'une archive de date, ainsi que du tag et de la catégorie, et supprimez le fichier. vérifier pour is_archive.

3
Milo

Si je comprends bien, vous voulez que vos CPT s'affichent sur des pages d'archives régulières (cateogires, requête principale, etc.), mais lorsque vous recherchez uniquement vos CPT, vous récupérez vos CPT avec tous les messages normaux, etc.

Voici ce que j'ai fait et pour l'instant, comme je l'ai vu, cela fonctionne bien, mais vous ne savez jamais où vous pouvez obtenir une erreur, alors essayez-le et voyez si cela fonctionne bien pour vous.

changez YOURCPT pour votre cpt :)

add_action( 'pre_get_posts', 'wpstck_get_YOURCPT_into_posts' );
function wpstck_get_YOURCPT_into_posts($query){


    if ( !is_post_type_archive() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'YOURCPT' ) );
            return $query;
        }
}
0
Igor