2013-01-22 18 views
1

我使用WordPress博客,我想顯示帖子而不添加任何內容到數據庫。 我想說的是:如何注入虛擬帖子(即不將其添加到數據庫)

我在頁面加載時生成一個帖子,並在主頁上添加它。 我搜索並找到wp_insert_post()函數,但它也添加到數據庫。 我如何使用php來做到這一點?

例如: 有一個由查詢生成的post數組。如何在加載頁面之前將我的帖子插入到該數組中?

我想清除我的想法。在這裏我一步一步想要什麼。

* 1) *林產生這樣 $ ARR [ '的陣列標題] = 「我的標題」, $ ARR [' 內容'] = 「我的內容」,

* 2 ) * WP發送一個查詢到數據庫,並有我的帖子是吧?還有一個數組,用於顯示主題和主頁面? 在這一點上,我想我的外部陣列(在步驟1中生成的)添加到這個陣列(通過查詢由WP生成)

3)通過這種方式,我將能夠添加後不將其加入我的數據庫。

+1

WUT?這沒有任何意義 - WP在一個數據庫中管理它的帖子,所以沒有使用它就沒有辦法創建它。你想推薦的東西來自哪裏?難道不是將它添加到主頁模板的選項嗎? –

+0

我懷疑OP希望通過PHP注入一篇文章,而不是將其添加到數據庫中。即靜態帖子或隨機插入的廣告? – Gavin

+0

@Pekka웃我的內容將在頁面加載時生成,我想注入到posts數組中,並且它會顯示在主頁面上。 – saidozcan

回答

2

您可以簡單地將您的虛擬帖子添加到您的主題模板之一作爲原始HTML。

或者,如果你喜歡冒險的感覺,你可以修改主查詢結果,包括您的文章裏:

add_action('loop_start', function($query){ 

    // create the post and fill up the fields 
    $post = new WP_Post((object)array(
    'ID'   => -1, 
    'post_title' => 'Bla blah', 
    'post_content' => 'Your content', 
)); 

    // add it to the internal cache, so WP doesn't fire a database query for it 
    // -1 is the ID of your post 
    if(!wp_cache_get(-1, 'posts')) 
    wp_cache_set(-1, $post, 'posts'); 

    // prepend it to the query 
    array_unshift($query->posts, $post); 
}); 
+0

即時通訊不寫一個主題,即時通訊寫一個plugin.so我的插件應該與所有的主題。該代碼可以保證這一點? – saidozcan

+1

它應該工作,雖然你可能想要執行更多的檢查,比如'$ query-> is_main_query()'或'is_front_page()'等等。你有什麼理由不想將這篇文章添加到數據庫中嗎? –

+0

是的,有幾個邏輯reasons.But我不想分享。謝謝你的回答 – saidozcan

1

The currently accepted answer導致新的職位以刪除循環的最後一個帖子,因爲它不不更新帖子數量。這裏是我的修改版本,還包括:

  1. 支持空類別。
  2. 只有一個地方可以聲明新帖子的ID。
  3. 將is_main_query()添加爲最初回答中提到的人的評論。
  4. 一個設置來決定是應該添加還是附加新帖子。
  5. 隱藏帖子的日期,因爲否則你會得到像00000000.我可以使用動態日期,但它可能是不好的搜索引擎優化不斷更新日期而不更新內容。
  6. 隱藏帖子的評論鏈接,因爲它只是導致主頁。
  7. 用於控制帖子類型的設置。你可能更喜歡「頁面」,因爲「帖子」顯示一個通用類別,我發現無法繞過。假設這是一件好事,「頁面」在其他帖子中看起來更加出色。

下面是修改後的代碼:

function virtual_post($query) { 
    $post_type = 'page'; // default is post 
    if (get_class($query)=='WP') 
    $query = $GLOBALS['wp_query']; 
    if ($query->is_main_query()) { 
    $append = true; // or prepend 
    // create the post and fill up the fields 
    $post = new WP_Post((object)array(
     'ID'   => -1, 
     'post_title' => 'Dummy post', 
     'post_content' => 'This is a fake virtual post.', 
     'post_date' => '', 
     'comment_status' => 'closed' 
    )); 
    if ($post_type <> 'post') 
     $post->post_type = $post_type; 
    // add it to the internal cache, so WP doesn't fire a database query for it 
    if(!wp_cache_get($post->ID, 'posts')) { 
     wp_cache_set($post->ID, $post, 'posts'); 
     if ($query->post_count==0 || $append) 
     $query->posts[] = $post; 
     else 
     array_unshift($query->posts, $post); 
     $query->post_count++; 
    } 
    } 
} 

$virtual_post_settings = array('enable' => true, 'include_empty_categories' => true); 
if ($virtual_post_settings['enable']) { 
    if ($virtual_post_settings['include_empty_categories']) 
    add_action('wp', 'virtual_post'); 
    else 
    add_action('loop_start', 'virtual_post'); 
} 
相關問題