Est-il possible de modifier la requête principale sur unpageen utilisant le filtre pre_get_posts
? J'ai essayé mais cela ne semble pas fonctionner.
function pre_wp_queries( $query ) {
// only trigger on main qyery
if ( !$query->is_main_query() )
return;
if (is_page_template('TEMPLATE_NAME.php')) {
$query->query_vars['pagename'] = null;
$query->query_vars['post_type'] = 'post';
$query->query_vars['posts_per_page'] = 3;
$query->query_vars['cat'] = 13;
}
}
add_action('pre_get_posts', 'pre_wp_queries', 9001);
Sur le header.php, j'utilise cette ligne pour vérifier si cela a fonctionné:
var_dump($GLOBALS['wp_query']->request);
Il affiche:
SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = 'post'
ORDER BY wp_posts.post_date DESC
Donc, cela a changé le posttype mais pas le reste. En outre, il passe à la page 404. En fait, le vidage du $GLOBALS['wp_query']->queried_object
restitue la page originale. J'ai essayé ceci sur 2 WP installe le même comportement sur les deux.
Est-ce que ce comportement est correct ou est-ce que je manque quelque chose?
Vous n'avez pas à manuellement forcer data dans ces propriétés de classe. L’ensemble de l’objet $wp_query
contient de nombreuses méthodes internes que vous devez utiliser poursetvalues. Voici un exemple:
public function query( $query )
{
if (
'SOME_POST_TYPE' !== $query->get( 'post_type' )
OR ! $query->is_main_query()
OR ! $query->is_archive()
OR ! $query->is_post_type_archive()
OR ! is_page_template( 'TEMPLATE_NAME.php' )
)
return $query;
$query->set( 'posts_per_page', -1 );
$query->set( 'numberposts', -1 );
return $query;
}
Si vous souhaitez interroger des catégories et les définir manuellement, la tâche est assez simple, car vous devezne pas/ avoir un tax_query
:
$query->set( 'category__in', 13 );
Si vous devez interroger plusieurs catégories:
$query->set( 'category__and', array( 12, 13 ) );
Vous pouvez en savoir plus à ce sujet sur la page du Codex pour la classe WP_Query
. Et bien sûr, vous avez les mêmes possibilités pour la taxonomie intégrée post_tag
/Tags.
Ici, les choses légèrement deviennent plus compliquées: vous devrez utiliser un tax_query
.N'oubliez pasque cela nécessite une array( array() )
. En termes simples: Un tableau environnant et à l'intérieur l'un de l'autre. Si vous ne le faites pas, WP échouera silencieusement . Exemple:
$tax_query = array(
array(
'taxonomy' => 'event_type_taxonomy'
,'field' => 'id'
,'terms' => array( 12, 13 )
,'operator' =>'IN'
)
);
$query->set( 'tax_query', $tax_query );
Explication étendue à nouveau sur la page Codex.