Requête entre deux valeurs de méta?
Question
Comment puis-je limiter la requête de deux champs de méta personnalisés, une date de début et une date de fin? C'est ce que mes regards de données comme:
meta_key | meta_value | ------------------------| start_date | 20100131 | //Jan 15, 2010 end_date | 20100206 | //Feb 6, 2010 ------------------------' $today = date(YYYYMMDD);
Le message montrera si start_date = $today
et il sera expire lorsque end_date = $today
.
mise à jour
Voici la structure de mon single.php
première requête J'utilise ici votre réponse
<?php
query_posts( $query_string );
if (have_posts()) : while (have_posts()) : the_post();
?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>
et deuxième requête avec la fonction régulière, mais cette wordpress seconde ne fonctionne pas correctement la requête
<?php
query_posts('showposts=5&meta_key=start_date&meta_compare=>&meta_value='.date("Ymd"));
if (have_posts()) : while (have_posts()) : the_post();
?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>
La solution
Edité à nouveau pour démontrer l'ajout et la suppression des filtres:
Inclure ces fonctions générales dans votre functions.php . Ce sont les filtres que vous appellerez pour les boucles où vous souhaitez limiter votre requête par ces deux valeurs méta:
function date_check_join( $join ) {
global $wpdb;
$join .= " JOIN ".$wpdb->postmeta." AS startdate ON
(".$wpdb->posts.".ID = startdate.post_id AND
startdate.meta_key = 'start_date')
JOIN ".$wpdb->postmeta." AS enddate ON
(".$wpdb->posts.".ID = enddate.post_id AND
enddate.meta_key = 'end_date')";
return $join;
}
function date_check_where( $where ) {
$today = date('Ymd');
$where .= " AND startdate.meta_value <= $today
AND enddate.meta_value >= $today";
return $where;
}
Maintenant, sur la page (s) où vous souhaitez inclure ces filtres, les ajouter avant les boucles que vous souhaitez filtrer et de les supprimer par la suite. Par exemple:
add_filter( 'posts_join', 'date_check_join' );
add_filter( 'posts_where', 'date_check_where' );
query_posts( "yourqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop will only includes where today is between start_date and end_date
endwhile; endif;
query_posts( "anotherqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop also only includes where today is between start_date and end_date
endwhile; endif;
remove_filter( 'posts_join', 'date_check_join' );
remove_filter( 'posts_where', 'date_check_where' );
query_posts( "thirdqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop is not affected by the filters, so you can query for posts
// where start_date is in the future, or end_date in the past, etc.
endwhile; endif;
Vous avez juste besoin d'ajouter vos conditions aux filtres « posts_join » et « posts_where » avant votre recherche, et les enlever par la suite (sinon ces conditions seront appliquées à tout sur votre site, y compris les pages, menus, etc.)
Si vous pouvez simplifier cela en ne comparant à un champ, vous pouvez utiliser le meta_compare
attribut intégré dans l'objet WP_Query. Vous pouvez programmer vos messages pour le start_date (ils ne montrent pas d'avance), puis comparer la date sur le champ personnalisé date_fin lorsque vous interrogez.
Autres conseils
La réponse à cette question: Comment changer de boucle à l'ordre de messages par Vues (en utilisant wp-PostViews plugin) vous montre comment trier par un champ personnalisé.
Jetez un oeil à la documentation du Codex pour query_posts (): http://codex.wordpress.org / Template_Tags / query_posts , et regardez une des sections de champs personnalisés.
Alors, tout ce que vous devez faire est notamment un test dans la boucle pour passer if ($ aujourd'hui