2013-10-02 23 views
2

我們有一個處理事件的插件。該插件不處理重複發生的事件,因此我們希望添加此功能。將自定義創建的帖子對象添加到Wordpress循環中

我有一個已經寫好的查詢,正在運行並拉動我們想要的事件。它看起來像這樣:

SELECT posts.*, metaStartDate.meta_value as EventStartDate, meta.meta_value as EventRepeats, metaTimeSpans.meta_value as EventTimeRanges 
FROM $wpdb->posts posts 
LEFT JOIN $wpdb->postmeta meta ON (posts.ID = meta.post_id AND meta.meta_key = '_EventRepeats') 
LEFT JOIN $wpdb->postmeta metaStartDate ON (posts.ID = metaStartDate.post_id AND metaStartDate.meta_key = '_EventStartDate') 
LEFT JOIN $wpdb->postmeta metaRepeatsUntil ON (posts.ID = metaRepeatsUntil.post_id AND metaRepeatsUntil.meta_key = '_EventRepeatsUntil') 
LEFT JOIN $wpdb->postmeta metaTimeSpans ON (posts.ID = metaTimeSpans.post_id AND metaTimeSpans.meta_key = '_EventTimeRanges') 
WHERE posts.post_type = 'tribe_events' 
AND posts.post_status = 'publish' 
AND meta.meta_value != 'once' 
AND '$queryDate 00:00:00' BETWEEN metaStartDate.meta_value AND metaRepeatsUntil.meta_value 

正如我所說,這是獲取我們想要的事件,但我怎麼然後將它們添加到WordPress的循環,使物像have_posts()the_post()工作?

編輯:它看起來像正確的答案是使用WP_Query,但有沒有辦法像WP_Query那樣做一個大的查詢?

回答

1

你是正確的:應該使用WP_Query每當處理本地WordPress的數據庫表,甚至爲你的自定義信息。儘管如此,WordPress provides the wpdb class(您需要必須閱讀此鏈接)用於數據庫操作,其中應該用於使用您自己的自定義數據庫表。

所以,如果你真的要執行該查詢,你應該使用wpdb's SELECT Generic Result,並添加一個小調整到"convert" it to a WordPress loop

<?php 
// Your custom query 
$querystr = " 
    SELECT posts.*, metaStartDate.meta_value as EventStartDate, meta.meta_value as EventRepeats, metaTimeSpans.meta_value as EventTimeRanges 
    FROM $wpdb->posts posts 
    LEFT JOIN $wpdb->postmeta meta ON (posts.ID = meta.post_id AND meta.meta_key = '_EventRepeats') 
    LEFT JOIN $wpdb->postmeta metaStartDate ON (posts.ID = metaStartDate.post_id AND metaStartDate.meta_key = '_EventStartDate') 
    LEFT JOIN $wpdb->postmeta metaRepeatsUntil ON (posts.ID = metaRepeatsUntil.post_id AND metaRepeatsUntil.meta_key = '_EventRepeatsUntil') 
    LEFT JOIN $wpdb->postmeta metaTimeSpans ON (posts.ID = metaTimeSpans.post_id AND metaTimeSpans.meta_key = '_EventTimeRanges') 
    WHERE posts.post_type = 'tribe_events' 
    AND posts.post_status = 'publish' 
    AND meta.meta_value != 'once' 
    AND '$queryDate 00:00:00' BETWEEN metaStartDate.meta_value AND metaRepeatsUntil.meta_value 
"; 

// Execute the query using wpdb and fetch results as objects 
$pageposts = $wpdb->get_results($querystr, OBJECT); 

if ($pageposts){ 
    global $post; 
    foreach ($pageposts as $post){ 

     // Here's the loop magic 
     setup_postdata($post); 

     // Now you are free to use any common loop functions, such as 
     // the_ID(); 
     // the_permalink(); 
     // the_title(); 
     // and all others. 
     ?> 

     <div class="post" id="post-<?php the_ID(); ?>"> 
      <h2> 
       <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> 
        <?php the_title(); ?> 
       </a> 
      </h2> 
      <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small> 
      <div class="entry"> 
       <?php the_content('Read the rest of this entry »'); ?> 
      </div> 
      <p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> 
      <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p> 
     </div> 
     <?php 
    } 
}else { 
    // No results found 
} 
?> 
+0

也許我需要重新說明我的問題,但有一個WP_Query對象已經存在,我只想在不更改模板文件(即通過新結果進行foreach檢查)的情況下添加到該對象中。任何方式來做到這一點? – tubaguy50035

+0

@ tubaguy50035那麼請發佈您的代碼,我會看看是否有可能解決方案。 – mathielo

0

@ turboguy50035您可以使用內置的部落活動日曆插件查詢機制鉤入'pre_get_posts'查詢過濾器。雖然在我看來,最好的選擇就是獲得PRO插件,它已經將重複添加到查詢中。

+0

同意,我希望我有這個選擇。它看起來像我可以重寫一個讓我悲傷的主題文件,所以我會繼續前進。 – tubaguy50035

+0

根據你對這個線程的另一個答案和你的原始問題的評論我仍然確定,如果你想修改查詢,然後鉤入pre_get_posts過濾器,核心部落插件用來修改你的查詢結果。 – codearachnid

相關問題