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