2013-04-29 30 views
0

我正在使用自定義字段和帖子類型在WP中創建一些事件類型帖子。每個事件(後類型:事件)包含以下字段:基於WordPress中的2個日期元鍵獲取事件

  • 標題(the_title)
  • 說明(the_content)
  • 開始日期(meta_key:起始日期)存儲時間戳meta_value
  • 結束日期(meta_key :END_DATE)存儲時間戳meta_value

我想是,得到落在日期之間的所有記錄。例如,我想顯示日曆(月視圖)。我想查詢所有在特定月份可能發生的事件。

如果事件是單日期(同一天)或短期(相同月份,跨越幾天)或相鄰月份之間的短距離(幾天,但日期介於四月之間),主要問題是, 2013年和2013年5月,假設)一切正常。但是,當一個事件跨越幾個月時,比如事件從2013年4月20日開始到2013年7月25日結束,它不會顯示。它僅在2013年4月和2013年7月可見 - 而我想在所有發生的月份(4月13日,5月13日,6月13日和7月13日)顯示此信息。

任何人都可以幫我建立一個WP的自定義查詢(WP_Query或直接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)。但我不想比較時間,我只是想挑選這兩個時間戳之間的所有記錄,即使事件的開始日期是上個月的,結束於下一個月或任何即將到來的月份 - 這在邏輯上是發生2013年4月也。

有關事件的例子,我有以下事件:

  • 測試賽1:啓動2013年3月1日結束2013年3月10日
  • 測試賽2:啓動2013年4月10日結束4月26日,2013
  • 測試賽3:啓動2013年4月10日結束2013年5月5日
  • 測試賽4:啓動2013年3月15日結束2013年6月10日

回答

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值都保存爲以下日期格式時纔有效:'Y-m-d' - 此查詢僅在日期進行過測試,並未與日期中的時間相結合。在最壞的情況下,這可能會給你一些東西來建立。

如果您需要更多幫助,請分享您的代碼。

+0

謝謝icethrill - 這是一個相當不錯的努力。爲了大家的方便,我添加了代碼和示例事件。請看看,並請幫助。再次感謝。 – 2013-04-29 12:44:37

+1

修改了我的WP_Query,以便它可能適合您的需要。試試看。 – MrZiggyStardust 2013-04-29 13:27:13

+0

嘿,你的解決方法非常好,幾乎接近,但我想把它縮小到僅僅是在當前月份發生這種事件時纔會出現。您的'end_date'> =當天返回的記錄也將在下個月開始記錄。我正在努力解決您的解決方案,以便根據需要進行修復。我也會和你分享。同時你能幫助更多的需要嗎?在此先感謝,並感謝您的幫助。 – 2013-04-29 14:32:40