web-dev-qa-db-fra.com

$ query-> défini dans pre_get_posts affecte involontairement le backend

Donc, j'ai un type de message personnalisé, "propriétés".

J'utilise archive-properties.php et j'ai besoin de définir certains paramètres sur le $query.

Je ne veux pas utiliser new WP_Query car j'ai rencontré quelques problèmes dans lesquels un plugin de pagination essayait de paginer le $query qui existait déjà depuis que nous étions sur une page d'archive, si cela a du sens.

Alors maintenant, mon problème est que, si je règle posts_per_page à 2 par exemple, et que je me connecte au serveur, il n’affiche que 2 posts.

Donc, j'ai besoin de cela pour changer la requête sur le frontend, mais pas le backend. Je ne sais pas quoi inclure dans la déclaration if.

function set_query_parameters($query) {

    if( is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION  ) {           
        $query->set('posts_per_page', 12);
        $query->set('orderby', array(
            'date' => 'DESC',
        ));
    }
    return $query;
}

add_action( 'pre_get_posts', 'set_query_parameters' );
3
Joel M

En ce qui concerne votre décision de ne pas utiliser WP_Query, pre_get_posts est en fait un excellent choix à faire, plutôt que de créer une nouvelle instance de WP_Query. En fait, pre_get_posts est exactement ce que vous devriez utiliser lorsque vous souhaitez modifier la requête principale. Plutôt que d'exécuter une requête distincte à chaque chargement de page, il modifie les paramètres de la requête principale avant qu'il exécute. Beaucoup plus efficace!

Tu y es presque. Vous devez simplement ajouter !is_admin() à votre déclaration if. Vous devez également appeler spécifiquement is_main_query()sur l'objet $query transmis à votre fonction .

Avec ces deux modifications, votre déclaration if se lirait désormais comme suit:

if( !is_admin() && $query->is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION  ) {

Il convient également de noter qu'il n'est pas nécessaire de renvoyer une valeur à une action Wordpress, par opposition à un filtre. Avec pre_get_posts, l'argument est transmis par référence afin que toute modification apportée à votre variable $query prenne effet automatiquement.

4
Tim Malone