0

カスタム フィールドと投稿タイプを使用して、WP でいくつかのイベント タイプの投稿を作成しています。各イベント (投稿タイプ: events) には次のフィールドが含まれます。

  • タイトル (the_title)
  • 説明 (the_content)
  • 開始日 (meta_key: start_date) はタイムスタンプを meta_value に格納します
  • 終了日 (meta_key: end_date) はタイムスタンプを meta_value に格納します

私が欲しいのは、日付の間にあるすべてのレコードを取得することです。例えば、カレンダー(月表示)を表示したい。特定の月に発生する/発生する可能性のあるすべてのイベントを照会したいと考えています。

主な問題は、イベントが単一の日付 (同じ日) または短い範囲 (同じ月、数日にまたがる) または隣接する月間の短い範囲 (数日、ただし日付が 2013 年 4 月から 2013 年 5 月までの範囲) である場合です。 ) すべて正常に動作します。しかし、イベントが 2013 年 4 月 20 日に開始し、2013 年 7 月 25 日に終了する場合のように、イベントが複数の月にまたがる場合、そのイベントは表示されません。2013 年 4 月と 2013 年 7 月にのみ表示されますが、発生するすべての月 (4 月 13 日、5 月 13 日、6 月 13 日、7 月 13 日) に表示したいと考えています。

この問題を解決するために、WP のカスタム クエリ ( WP_Query または Posts および Posts Meta テーブルに対する直接の MySQL クエリ) を作成するのを手伝ってくれる人はいますか? 開始日と終了日をタイムスタンプで保存する 2 つのメタ フィールド (上記のとおり) があることに注意してください。

- 編集 -

私が現在使用しているものを理解するために、以下は私が使用している SQL クエリです。

SELECT DISTINCT 
    wpmh_posts.* 
FROM 
    wpmh_posts, wpmh_postmeta 
WHERE 
    wpmh_posts.ID = wpmh_postmeta.post_id 
    AND wpmh_posts.post_status = 'publish' 
    AND wpmh_posts.post_type = 'events_calendar' 
    AND ( 
            ( 
                (
                    wpmh_postmeta.meta_key='wpcf-start_date' 
                    AND wpmh_postmeta.meta_value >= 1364774400
                ) OR (
                    wpmh_postmeta.meta_key='wpcf-end_date' 
                    AND wpmh_postmeta.meta_value >= 1364774400
                ) 
            ) OR ( 
                (
                    wpmh_postmeta.meta_key='wpcf-start_date' 
                    AND wpmh_postmeta.meta_value <= 1367366399
                ) OR (
                    wpmh_postmeta.meta_key='wpcf-end_date' 
                    AND wpmh_postmeta.meta_value <= 1367366399
                ) 
            ) 
    ) 
    ORDER BY 
        wpmh_postmeta.meta_value ASC

1364774400 は 2013 年 4 月 1 日のタイムスタンプで、1367366399 は 2013 年 4 月 30 日のタイムスタンプです (明らかに、それぞれ時刻 00:00:00 と 23:59:59 が含まれています)。しかし、私は時間を比較したくありません。イベントの開始日が前月であり、次の月または次の月のどこかで終了していても、これら 2 つのタイムスタンプの間にあるすべてのレコードを選択したいだけです。これは、論理的に発生するイベントです。 2013年4月も。

イベントの例として、次のイベントがあります。

  • テストイベント 1: 2013 年 3 月 1 日開始 2013 年 3 月 10 日終了
  • テストイベント 2: 2013 年 4 月 10 日開始 2013 年 4 月 26 日終了
  • テストイベント 3: 2013 年 4 月 10 日開始 2013 年 5 月 5 日終了
  • テストイベント 4: 2013 年 3 月 15 日開始 2013 年 6 月 10 日終了
4

1 に答える 1

1

編集:以下のWP_Queryを修正

独自のコードを共有しない場合、適切な支援を提供することはかなり困難です。

WordPress のカスタム カレンダーに次のコードを使用しました。

// Query arguments for upcoming events query
$args = array(
    'meta_query' => array(
        array(
            'key' => 'end_date',
            'value' => strtotime(date("Y-m-d")), // Uses current server timestamp now
            'compare' => '>=',
            'type' => 'NUMERIC' // I think you will need to use numeric here, instead of datestamp
        )
    ),
    'orderby' => 'meta_value_num', // Edit: Changed this so its sorted after numeric value
    'meta_key' => 'start_date', // Sort after 'start_date'
    'post_type' => 'events_calendar', // Change this value to your own 'post_type_name'
    'posts_per_page' => -1,
    'order' => 'ASC',
);

// The Query
$upcoming_events_query = new WP_Query( $args );

while ( $upcoming_events_query->have_posts() ) : $upcoming_events_query->the_post();
    // Your template code here!
endwhile;
wp_reset_query();

投稿は開始日以降に並べ替えられますが、終了日を過ぎたイベントはクエリから除外されます。

これは、すべてのイベントの start_date と end_date の値が次の日付形式で保存されている場合にのみ機能します: 'Ymd' - このクエリは日付でのみテストされており、日付の時刻とは結合されていません。最悪のシナリオでは、これにより何かを構築することができます。

さらにヘルプが必要な場合は、コードを共有してください。

于 2013-04-29T09:16:48.523 に答える