Comment limiter la requête à deux champs méta personnalisés, une date de début et une date de fin? Voici à quoi ressemblent mes données:
meta_key | meta_value | ------------------------ | date_début | 20100131 | // 15 janvier 2010 Date_fin | 20100206 | // 6 févr. 2010 ------------------------ ' $ Aujourd'hui = date (AAAAMMJJ);
Le message montrera si start_date = $today
et il expirera quand end_date = $today
.
mettre à jour
Voici la structure sur mon single.php
Première question que 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 wordpress régulière, mais cette deuxième requête ne fonctionne pas correctement
<?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();
?>
Edité à nouveau pour démontrer l'ajout et la suppression de filtres:
Incluez ces fonctions générales dans votre functions.php. Ce sont les filtres que vous invoquerez pour les boucles où vous souhaitez limiter votre requête à ces deux méta-valeurs:
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 les pages où vous souhaitez inclure ces filtres, ajoutez-les avant les boucles que vous souhaitez filtrer et supprimez-les 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 devez simplement ajouter vos conditions aux filtres "posts_join" et "posts_where" avant votre recherche, puis les supprimer (sinon, ces conditions seront appliquées à tout ce qui se trouve sur votre site, y compris les pages, les menus, etc.).
Si vous pouvez simplifier cela en ne comparant qu'avec un seul champ, vous pouvez utiliser l'attribut meta_compare
intégré à l'objet WP_Query. Vous pouvez planifier vos publications pour la date_début (afin qu'elles ne s'affichent pas à l'avance), puis comparer la date au champ personnalisé date_fin lorsque vous interrogez.
La réponse à cette question: Comment changer de boucle en commandes d'ordre par vues (en utilisant le plugin wp-postviews) vous montre comment trier par un champ personnalisé.
Jetez un coup d'œil aux documents Codex pour query_posts (): http://codex.wordpress.org/Template_Tags/query_posts , et examinez les sections de champs personnalisés.
Ensuite, tout ce que vous avez à faire est d’inclure un test dans la boucle pour ignorer si ($ today <start_date ou $ today> end_date)