web-dev-qa-db-fra.com

pre_get_posts sur une page

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?

2
janw

Expliquer l'objet.

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

Taxonomies intégrées: Catégories et balises

Un terme/catégorie/taxon unique

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 );

Termes/catégories/taxons multiples

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.

Taxonomies personnalisées

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.

2
kaiser