web-dev-qa-db-fra.com

Requête entre deux méta valeurs?

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();
?>
2
Gerald

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.

3
goldenapples

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)

0
anu