2つのメタ値の間のクエリ?
質問
クエリを2つのカスタムメタフィールド、開始日と終了日で制限するにはどうすればよいですか?これが私のデータがどのように見えるかです:
meta_key | meta_value | ------------------------| start_date | 20100131 | //Jan 15, 2010 end_date | 20100206 | //Feb 6, 2010 ------------------------' $today = date(YYYYMMDD);
投稿にはifが表示されます start_date = $today
そして、それはいつ失効します end_date = $today
.
アップデート
これが私のsingle.phpの構造です
最初に私があなたの答えをここで使用します
<?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();
?>
通常のWordPress関数を使用した2番目のクエリですが、この2番目のクエリは正しく機能しません
<?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();
?>
解決
フィルターの追加と削除を示すために再び編集しました:
これらの一般的な機能をあなたに含めます functions.php. 。これらは、これらの2つのメタ値でクエリを制限するループに呼び出すフィルターです。
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;
}
ここで、これらのフィルターを含めるページに、フィルタリングするループの前にそれらを追加して、その後それらを削除します。例えば:
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;
検索前に条件を「post_join」および「posts_where」フィルターに条件を追加し、その後それらを削除する必要があります(そうでない場合、これらの条件は、ページ、メニューなどを含むサイトのすべてに適用されます)
1つのフィールドと比較するだけでこれを簡素化できる場合は、 meta_compare
属性 wp_queryオブジェクトに組み込まれています。 start_dateの投稿をスケジュールすることができます(スケジュールよりも早く表示されないため)。クエリ時に日付をEND_DATEカスタムフィールドと比較できます。
他のヒント
この質問への答え: ループを変更する方法ビューで投稿を注文する方法(WP-PostViewsプラグインを使用) カスタムフィールドでソートする方法を示します。
query_posts()for codex docsをご覧ください。 http://codex.wordpress.org/template_tags/query_posts, 、そして、カスタムフィールドセクションを見てください。
次に、あなたがする必要があるのは、ループ内にテストを含めることです。