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();
?>
Était-ce utile?

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 date_fin)

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top