web-dev-qa-db-fra.com

Méthode recommandée pour supprimer une requête en attente (dans pre_get_posts)?

Il semble que la requête principale d'un plug-in de commerce électronique ne me soit d'aucune utilité dans un modèle particulier; j'aimerais donc l'éliminer complètement au profit de mes propres boucles WP_Query dans le modèle. Ce n'est pas la requête principale, mais un appel à la boucle secondaire query_posts () que j'essaie de supprimer en aval.

wp remove query a quelques bonnes suggestions de SQL pur non-op, mais quel serait le moyen recommandé de coller l'une de celles-ci dans cette requête $ spécifique dans pre_get_posts ?

2
lkraav

Il n'y a pas vraiment de moyen "d'arrêter" la requête principale. Il existe de nombreux filtres pour le modifier, mais rien pour le désactiver complètement. Le mieux que vous puissiez faire est d’accroche dans posts_request, qui se déclenche juste avant que les données ne soient touchées, et de renvoyer une chaîne vide ou quelque chose de non sensuel. Cela va toujours frapper la base de données.

Exemple (non testé):

<?php
add_filter('posts_request', 'wpse83187_posts_request', 10, 2);
function wpse83187_posts_request($sql, $query)
{
    if (!$query->is_main_query() /* other conditionals here! */) {
        return;
    }

    return '';
}

Au lieu de créer votre propre WP_Query dans le modèle, pourquoi ne pas réinitialiser complètement la requête avec pre_get_posts?

Utilisez ensuite la boucle "principale" pour au moins une de vos boucles WP_Query. Les accès à la base de données n'interviennent que beaucoup plus tard. La seule surcharge "gaspillée" est donc WP remplissage des vars de requête. WP_Query a une méthode appelée init qui réinitialise fondamentalement tout. Appelez-le, puis définissez les variables de requête dont vous avez besoin. Ensuite, vous devrez appeler parse_query à nouveau pour configurer les différentes conditions.

<?php
add_action('pre_get_posts', 'wpse83187_reset_q');
function wpse83187_reset_q($query)
{
    if (!$query->is_main_query() /* other conditionals here! */) {
         return;
    }

    $query->init();

    // reset query vars here. eg:
    $query->set('post_type', 'product');

    // re-run validation and conditional set up.
    $query->parse_query();
}
3
chrisguitarguy