質問

クエリを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, 、そして、カスタムフィールドセクションを見てください。

次に、あなたがする必要があるのは、ループ内にテストを含めることです。

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top