web-dev-qa-db-fra.com

Ajouter un type de publication personnalisé à la requête en cours

J'essaie de créer un plug-in qui ajoute un nouveau type de publication personnalisé. Il doit être affiché aux mêmes emplacements qu'une publication normale (page de couverture, archives, etc.).

Existe-t-il des fonctions permettant de récupérer les types de publication actuellement appelés dans la requête afin de pouvoir modifier et ajouter mon CPT à la requête actuelle? (Exemple indiqué dans le 2ème commentaire si ma question me semble confuse)

Je ne peux pas utiliser le code ci-dessous (c'est-à-dire la liste des types de publication) car je ne peux pas prédire quels types de publication l'utilisateur aurait:

add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'album', 'movie', 'quote' ) );

return $query;
}

De même, je ne peux pas utiliser le code ci-dessous car cela renverrait les types all post, y compris ceux qui pourraient ne pas être affichés en première page:

if ( !is_admin() && empty( $query->query_vars['suppress_filters'] ) && $query->is_main_query() ) {
    $post_type = get_query_var('post_type');
    $post_types = get_post_types( array( 'public' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set('post_type',$post_type);
    return $query;
    }
}

Alors, y a-t-il des idées sur la manière d’ajouter mon CPT à la requête sans affecter d’autres types de publication? Merci pour ton aide!

4
Billy

En réalité, vous n’êtes pas si loin avec pre_get_posts, il vous suffit d’abord de saisir les types de publication en cours qui sont dans la requête avant d’ajouter les vôtres.

De plus, je vous recommande d’utiliser un $priority sur 99 pour que l’action soit accrochée après tout autre point d'ancrage pre_get_posts, ce qui signifie que si les utilisateurs ajoutent leurs propres CPT (ou types de publication intégrés), ils sont détectés et inclus par la fonction ci-dessous (mais vous peut changer cela au besoin).

add_action('pre_get_posts', 'djg_includ_my_cpt_in_query', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get('post_type');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(',', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = 'post';         
        $post_types[] = 'document';                         // Add your custom post type

        $post_types = array_map('trim', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set('post_type', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}

MODIFIER

Lors de la construction de la requête finale, WordPress vérifie si 'post_type' est vide et, dans l'affirmative, le code suivant est exécuté -

$where .= " AND $wpdb->posts.post_type = 'post'";
$post_type_object = get_post_type_object ( 'post' );

Donc, ce qui se passe lorsque nous ajoutons un CPT, c'est que WordPress estime que nous voulons ignorer les publications car elles ne sont pas explicitement déclarées. C’est-à-dire si mon scénario était différent - j’avais explicitement déclaré précédemment d’autres types de publication, qui ont donc été inclus dans l’appel $post_types = $query->get('post_type');.

Donc, dans votre cas, nous pouvons résumer de manière résumée que si $post_types est vide, l'utilisateur ne souhaite pas modifier cette partie de la requête afin que 'post' puisse être ajouté manuellement au tableau $post_types. Cela devrait (espérons-le!) Faire l'affaire.

4
David Gard