web-dev-qa-db-fra.com

Comment appeler correctement des dates de champ personnalisées dans un filtre posts_where à l'aide d'instructions SQL

Actuellement, la boucle liste les publications entre deux dates à l'aide du filtre posts_where:

 function filter_where( $where = '' ) {
  $where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
  return where;
 }
 add_filter('posts_where', 'filter_where');
 query_posts($query_string);
 while (have_posts()) :
   the_post();
   the_content();
 endwhile;

Dans un meta_key appelé original_date, j'ai stocké une date différente pour chaque publication que je souhaite utiliser à la place du post_date. Comment appeler correctement ce meta_key dans la requête $where afin de remplir le même objectif que le post_date?

$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";

Par exemple, la requête SQL suivante semble ne pas fonctionner, même si les valeurs correctes (2001-10-29, 2004-11-03, etc.) sont présentes dans le original_datemeta_key des publications:

global $wpdb;
 $where .= " AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) >= '2000-01-01' AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) <= '2004-12-31' ";

alors que ce qui suit fonctionne bien sur les mêmes messages en utilisant leur post_date comme référence:

$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";

Peut-être que le tableau meta_value doit être débarrassé de tout matériel étranger afin de formater les résultats sous la même forme que post_date? Comment pouvons-nous aborder cela?

7
maduroblanco

Merci à AmbitiousAmoeba pour la réponse. Le code amélioré suivant résout le problème:

function filter_where( $where = '' ) {
   global $wpdb;

   $where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
   return where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
while (have_posts()) :
   the_post();
   the_content();
endwhile;
6
maduroblanco

Si vous avez la colonne wp_postmeta.meta_key inconnue dans la clause where

Vous voulez probablement joindre la table $wpdb->postmeta à cette requête:

function custom_posts_join($join){
     global $wpdb;

     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

     return $join;
}
add_filter( 'posts_join' , 'custom_posts_join');
3
Robert Isaev