web-dev-qa-db-fra.com

Afficher les publications en modifiant la clause where uniquement pour ma requête

J'essaie d'afficher les messages datant de 7 jours. Pour cela, j'ai besoin de modifier la clause 'where' comme dans le code

//Hack found on the bottom of http://codex.wordpress.org/Template_Tags/query_posts
   function filter_where($where = '') {
        //posts in the last 7 days
    $where .= " AND post_date > '" . date('Y-m-d', strtotime('-7 days')) . "'";
    }
     ('posts_where', 'filter_where');
   query_posts($query_string);
   if ( have_posts() ) : while ( have_posts() ) : the_post();
      ... and the usual

Mais cela modifiera toutes les requêtes, je veux juste l'utiliser pour une requête dans mon plugin et je ne veux pas changer une autre requête sur mon site. Comment puis je faire ça?

3
Amna Ahmed

Si vous souhaitez ajouter le filtre à la clause where, assurez-vous simplement de le supprimer à l'aide de remove_filter () et de la signature identiqueimmédiatement après/ vous créez la requête.

Dans votre exemple, vous utilisez query_posts (), ajoutez donc le filtre, exécutez votre requête, puis supprimez votre filtre immédiatement après.

add_filter( 'posts_where', 'my_posts_where_filter', 10, 2 );
query_posts( $query_string );
remove_filter( 'posts_where', 'my_posts_where_filter', 10, 2 );

Il est à noter que lorsque vous utilisez la version à 2 arguments, le second argument peut s'avérer très utile pour limiter votre filtre aux seules requêtes qui vous intéressent.

add_filter( 'posts_where', 'my_posts_where_filter', 10, 2 );
function my_posts_where_filter( $where_clause, $query_object ){
  // check conditions on your query object...

  // ... then manipulate your $where_clause accordingly
  return $where_clause;
}

Si vous choisissez cette voie, vous pouvez probablement vous passer de remove_filter ().

De plus, vous pouvez probablement vous passer de query_posts() aussi, tant que vous y êtes. Si vous utilisez déjà les filtres get_posts(), qui sont exécutés à chaque requête, l'ajout d'une autre requête avec query_posts() ralentira simplement le temps de chargement de votre blog.

Trouvez donc un moyen d'identifier la page sur laquelle vous vous trouvez (examinez l'objet $ query_object à l'aide de print_r() pour voir les goodies qu'il contient ou utilisez un conditionnel tel que is_main_query() etc.), puis encapsulez vos conditions WHERE supplémentaires dans un grand bloc if{ }. Configurez votre filtre PAS à partir du modèle de page sur lequel vous vous trouvez, mais à partir de votre functions.php ou de certaines classes incluses. Et bien sûrtester, tester, testerpour vous assurer que vous n'affectez pas les autres pages de votre site, des widgets, votre flux RSS ou le back-end de l'administrateur.

2
Tom Auger