2012-05-30 72 views
0

我被要求在wordpress網站上解決問題。問題是由於使用帖子而不是頁面而導致的。然而,該網站已啓動並運行,最快的選擇是使用各種黑客技術來解決問題。Wordpress未來頁面問題(未顯示)

該網站有一個事件部分,每個事件是一個頁面(這是問題,應該是一個職位)。爲了有即將到來的和過去的事件,使用了發佈日期,因此即將發生的事件具有「未來」的發佈狀態。

有一些事件的列表頁面,通過使用正確的query_post()來顯示它們很好。雖然點擊進入實際事件(這是未來頁面)時會出現問題。如果您以管理員身份登錄,則該頁面會顯示,但如果您未登錄,您將獲得404頁面。

現在,如果他們在帖子中發佈「未來就是現在!」插件可以解決這個問題。我有一種感覺,問題的唯一方法是重寫核心Wordpress文件的一部分。

任何建議將是偉大的,我有很多與WordPress的經驗,所以即使你可以指出我在正確的方向。

乾杯, 傑森

[更新]

感謝maiorano84爲您詳細的答覆。從長遠來看,我打算將他們轉移到帖子,但同時他們已經要求我們儘快修復它,而無需更改任何網址(今天,他們發送了包含事件列表的羣發電子郵件,而未檢查任何鏈接)

Your包含post_status future的解決方案在這種情況下不起作用,因爲wordpress沒有進入加載模板的階段。 wordpress核心中的某些東西阻止它變得那麼遠。理想情況下,如果他們是一個鉤子,我可以用它來覆蓋這個行爲,同時這將是優秀的,但如果涉及到它,我會暫時編輯核心文件。

[更新2]

我現在知道,需要編輯或使用,涉及到他們的鉤子這兩種功能。我們is_404()其中

首先需要改變不添加未來的網頁爲404

其次,我們有is_page()需要返回true,如果一個頁面是未來

[更新3]

我我發現如何在覈心中做到這一點。如果你去wp-includes/query.php行2682.複製這個,而不是舊的功能,它工作正確。如果你有更好的方法,請讓我知道。謝謝。

 /** Future Pages **/ 
    // Check post status to determine if post should be displayed. 
    if (!empty($this->posts) && ($this->is_single || $this->is_page)) { 
     $status = get_post_status($this->posts[0]); 
     $post_status_obj = get_post_status_object($status);; 
     if (!$post_status_obj->public) { 
       if ($post_status_obj->protected) { 
         $this->is_preview = true; 
         print_r($status); 
         if ('draft' != $status) { 
          $this->posts[0]->post_date = current_time('mysql'); 
          } else { 
          $this->posts = array(); 
         } 
       } elseif ($post_status_obj->private) { 
        if (! current_user_can($read_cap, $this->posts[0]->ID)) 
         $this->posts = array(); 
       } else { 
        $this->posts = array(); 
       } 
     } 
     /** END **/ 

回答

1

您實際上可以爲您的頁面查詢添加post_status參數'future'。你真的不應該修改你的核心文件來做你想做的事情。所以你的page.php和檔案。(這是控制你的事件顯示或其他相關的模板)PHP模板,你可以做這樣的事情:

<?php 
$params = array('posts_per_page'=>-1, 'post_status'=>'publish,future'); 
$query = new WP_Query($params); 
if($query->have_posts()) : while($query->have_posts()) : $query->the_post(); 
?> 
<!-- YOUR PAGE HTML HERE --> 
<?php 
endwhile;endif; 
wp_reset_postdata(); 
?> 

這是一個過於簡單化,但使用在相應的文件正確的查詢將使但是你顯示你的網頁你喜歡。

點擊此處瞭解詳情:http://codex.wordpress.org/Class_Reference/WP_Query

另一件事值得考慮的,我意識到這不是你的問題的一部分,但很可能解決您的問題:

爲什麼不上創建一個子域您的客戶端服務器,您可以在不中斷用戶體驗的情況下修復所有問題?您可以輕鬆地將現有數據庫導入到開發環境中,並在不影響實時版本的情況下進行所需的所有更改。

思考的食物。我的建議是儘快將這個問題扼殺,並儘快將這些頁面轉換爲帖子,否則網站會很快變成一個巨大的混亂,但這是你的呼叫。

希望這會有所幫助。

UPDATE:

我還是會建議不要改變核心文件,但如果它是最後的手段,直到一切都被固定,然後有它。這裏的是一個「WP友好」解決方案,我認爲可能會有所幫助:

add_action('wp','future_redirect', 0); 
function future_redirect($WP_Object) 
{ 
    $page = is_page() ? get_page(get_the_ID()) : false; 
    if($page && $page->post_status == 'future') 
    { 
     wp_redirect(/*YOUR REDIRECT URL*/); 
     exit(); 
    } 
    return $WP_Object; 
} 
+0

謝謝您的回覆,我已經更新了我的問題,以迴應,如果你有時間。 – dciso

+0

@dciso查看我的更新以瞭解可能的備用解決方案(未經測試)。如果有幫助,可以考慮將核心文件恢復原樣。否則,保持你的改變沒有任何壞處,直到一切都得到重組。儘管如此,請記住,如果執行了Wordpress更新,您將不得不再次破解核心文件,所以要小心。 – maiorano84

+0

@dciso爲了防止碰巧遇到我以前的例子,發現它不起作用,我已經將示例更新爲可行的方法。試試這個,讓我知道它是否有幫助。 – maiorano84