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_date
meta_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?
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;
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');