Il existe un certain nombre de plugins de référentiel wp.org tiers qui 1) ajoutent des catégories et des balises aux pages, et 2) permettent d'afficher les pages avec les publications dans les pages d'archive.
Le code qu'ils utilisent pour la partie 2 utilise toujours:
$wp_query->set
par exemple:
if ( ! is_admin() ) {
add_action( 'pre_get_posts', 'category_and_tag_archives' );
}
// Add Page as a post_type in the archive.php and tag.php
function category_and_tag_archives( $wp_query ) {
$my_post_array = array('post','page');
if ( $wp_query->get( 'category_name' ) || $wp_query->get( 'cat' ) )
$wp_query->set( 'post_type', $my_post_array );
if ( $wp_query->get( 'tag' ) )
$wp_query->set( 'post_type', $my_post_array );
}
Ainsi, les plugins modifient tous les paramètres de wp_query puis les abandonnent - c’est-à-dire qu’ils ne annulent pas les modifications ni ne les réinitialisent.
Je suppose qu'ils ne peuvent pas réinitialiser wp_query, car wp_query n'est pas exécuté immédiatement après l'avoir modifié. Wp_query sera exécuté ultérieurement, lorsque la page d'archivage sera appelée. Comme ils n'exécutent pas wp_query dans leur code, ils ne peuvent pas le réinitialiser immédiatement après.
Puis quand j'utilise ce code dans un autre plugin, par exemple:
$the_query = new WP_Query( array( 'cat' => $categoryid, 'post_type' => 'page' ) );
Il renvoie les articles et les pages, alors qu'il ne devrait renvoyer que des pages.
Cela est dû au fait que la requête wp_query a été modifiée et non réinitialisée.
Je ne sais pas quoi faire dans ce cas pour que wp_query fonctionne pour le deuxième morceau de code.
La solution évidente serait de réinitialiser wp_query avant ma ligne de code, mais je ne suis pas sûr que cela affectera de manière négative le code d'autres plug-ins ou le noyau.
Toute aide est grandement appréciée.
Si le code présenté ci-dessus est celui que le plugin utilise, il affectera toutes les requêtes, car il ne vérifie pas is_main_query () ( https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts )
Ce que vous pouvez faire, c'est supprimer l'action, faire votre requête, puis rajouter l'action (si nécessaire)
remove_action( 'pre_get_posts', 'category_and_tag_archives' );
$myQuery = new WP_Query($queryArgs);
add_action( 'pre_get_posts', 'category_and_tag_archives' );
Si dans le plugin, la priorité est différente (la valeur par défaut est 10), assurez-vous de la spécifier.
Voici la référence de l'action de suppression https://codex.wordpress.org/Function_Reference/remove_action
J'espère que cela t'aides,
Lorsque le plugin modifie WP_Query
, il n'est pas modifié "pour de bon", mais uniquement l'objet unique en cours de modification.
Quand tu fais:
$the_query = new WP_Query( array( 'cat' => $categoryid, 'post_type' => 'page' ) );
Vous obtenez les deux pages et les messages, mais pas parce que la requête est modifiée et non réinitialisée (en fait, vous utilisez un autre objet). La vraie raison est que le filtre exécute again pour cela new object, en le modifiant également.
Ceci est dû au fait que le hook pre_get_posts
est exécuté pour les requêtes all , de sorte qu'il s'exécute également pour la requête original et pour votre .
Si le plug-in qui modifiait la requête avait été un peu plus sage, il avait vérifié is_main_query()
avant de modifier la requête, ainsi toute requête qui ne serait pas la requête principale ne serait pas affectée.
Par exemple, si le plugin:
function category_and_tag_archives( $wp_query ) {
// Only act on main query
if ( ! $wp_query->is_main_query() ) {
return;
}
$my_post_array = array('post','page');
if ( $wp_query->get( 'category_name' ) || $wp_query->get( 'cat' ) )
$wp_query->set( 'post_type', $my_post_array );
if ( $wp_query->get( 'tag' ) )
$wp_query->set( 'post_type', $my_post_array );
}
quand ensuite tu fais:
$the_query = new WP_Query( array( 'cat' => $categoryid, 'post_type' => 'page' ) );
cette requête étant une requête secondary , elle ne sera pas affectée et vous ne recevrez que les publications attendues.