問題描述

我得到一個奇怪的錯誤 – 白色屏幕在特定的自定義帖子類型的帖子列表 (只為那一個)

  • 嘗試停用所有插件

  • 嘗試檢查錯誤 (debug = true)

仍然沒有什麼頁面只是不回應任何東西…(源也沒有)

我正在談論這樣一個 url 在管理員:http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

這是我正在使用的 register_post_type 部分:

function register_submodelcpt() {
    $labels = array(
        'name'                  => __('Sub Models', THEME_NAME),
        'singular_name'         => __('Sub Models', THEME_NAME),
        'add_new'               => __('New Model', THEME_NAME),
        'add_new_item'          => __('Add new Model', THEME_NAME),
        'edit_item'             => __('Edit Model', THEME_NAME),
        'new_item'              => __('New Model', THEME_NAME),
        'all_items'             => __('All Sub Models', THEME_NAME),
        'view_item'             => __('Watch Model', THEME_NAME),
        'search_items'          => __('Search Models', THEME_NAME),
        'not_found'             =>  __('No Models found', THEME_NAME),
        'not_found_in_trash'    => __('No Models found in trash', THEME_NAME),
        'parent_item_colon'     => '',
        'menu_name'             => __('Sub Models', THEME_NAME),

    );

    $args = array(
        'labels'                => $labels,
        'public'                => true,
        'publicly_queryable'    => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'query_var'             => true,
        'rewrite'               => array('slug' => 'submodels'),
        'capability_type'       => 'post',
        'has_archive'           => true,
        'hierarchical'          => true,
        'menu_position'         => 5,
        'menu_icon'             => get_stylesheet_directory_uri().'/images/cpt/subcars.png',
        'supports'              => array('title', 'thumbnail', 'revisions', 'page-attributes')
    );
    register_post_type('submodelscpt',$args);
}
add_action('init', 'register_submodelcpt');

有沒有人遇到這樣的問題?你能想出這個可能發生的原因嗎?

另一個奇怪的事情,當我改變這個:http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

為此:http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt&orderby=date&order=desc

帖子列表正確加載…

最佳解決方法

這是為了擴展自己的答案:

It appears that when “hierarchical” is set to true, each post behaves like a page. I am quoting here so I don’t really understand why it matters but changing this line remove the problem.

這是 Codex 對 hierarchical 參數的説明

hierarchical

(boolean) (optional) Whether the post type is hierarchical (e.g. page). Allows Parent to be specified. The ‘supports’ parameter should contain ‘page-attributes’ to show the parent select box on the editor page.

Default: false

Note: this parameter was planned for Pages. Be careful, when choosing it for your custom post type – if you are planning to have many entries (say – over 100), you will run into memory issue. With this parameter set to true WordPress will fetch all entries of that particular post type, together with all meta data, on each administration page load for your post type.

當自定義帖子類型設置為 hierarchyichal 時,其行為將與 Post Type page 中的構建相同。像頁面一樣,Wordpress 嘗試構建一個樹,以在後端顯示具有 parent-child 關係的正確的分層樹。正如你可能已經注意到的那樣,頁面不是按照後面的日期排序,而是按照這個 parent-child 關係進行排序。您可以在後台訪問 Page 頁面時輕鬆查看此行為。

此操作非常昂貴,因為 Wordpress 需要在每個頁面加載時獲取每個頁面 (或從分層帖子類型發佈),然後查找該特定頁面’s/post’s 父頁面和子頁面以為該特定頁面/帖子構建正確的樹。如果您在分層自定義帖子類型中有大量的頁面或帖子,則查詢將變得很大,超出內存限制或超時,從而導致致命的錯誤,從而導致 WSOD 。

Non-hierarchical 的帖子類型就像後綴類型 post 中沒有這樣一個層次結構,如 non-hierarchical 的帖子類型的帖子不能有子帖子。因為沒有必要構建一個 parent-child 關係樹 (出於明顯的原因),Wordpress 只是在後端按日期排序每頁 20 個 (IIRC) 的帖子,並顯示它們與 Wordpress 必須查詢的分層帖子類型相反立即建立一個樹,然後在根據其 parent-child 關係分組的帖子上只顯示一個 x 數量。您可以在後端的 Post 頁面中檢查此行為

所以設置一個自定義的 post 類型到層次結構告訴 Wordpress 它應該建立一個列表/樹的分組根據他們的 parent-child 關係,並返回那些配置中的那些帖子。將自定義帖子類型設置為 non-hierarchical,您正在告訴 Wordpress 跳過整個關係的事情,並且只返回一個 x 頁面的每頁數量,按照發布日期排序

我希望這對你來説更有意義,為什麼你應該避免使定製的帖子類型有層次結構,為什麼這也在 codex 中説明

次佳解決方法

我只是想添加 @SagiveSEO 和 @PieterGoosen 的答案。

還有一個潛在的性能殺手級別的帖子類型:

即使用 wp_dropdown_pages()的父頁面下拉框。

它現在非常不便,因為它幾乎將所有頁面加載到選擇下拉框中。

所以如果我們有一個網站有很多頁面,那麼這可能會傷害到性能。

想像一個有 100 萬頁的網站;-)

這是 6 年前的報道,與 #9864 的票。它仍然是開放的,所以您仍然可以為擬議的 auto-complete 解決方案做出貢獻。

更新:

我只是想提一些有用的過濾器:

  • wp_dropdown_pageswp_dropdown_pages()功能的輸出濾波器。如果需要,可以用來追加或回傳一些額外的 HTML 。

  • get_pages – 因為 wp_dropdown_pages()調用 get_pages()功能。

  • page_attributes_dropdown_pages_argswp_dropdown_pages()post.php/post-new.php 屏幕上用於分層後置類型的參數的過濾器。

  • quick_edit_dropdown_pages_argswp_dropdown_pages()edit.php 屏幕的參數的過濾器,用於歷史級別的類型。

這可以用來解決這個問題。

可以在 post.php 屏幕上修改 wp_dropdown_pages()的輸出:

add_filter( 'page_attributes_dropdown_pages_args', function( $dropdown_args, $post )
{
    if( 'page' === $post->post_type )
    {
        $dropdown_args['number']       = 10; // Limit the number of pages
        $dropdown_args['hierarchical'] = 0;  // Keep it non-hierarchical
        $dropdown_args['offset']       = 1;  // Ideal for pagination
    }
    return $dropdown_args;
}, 10, 2 );

對於頁面的 edit.php 屏幕也是如此:

add_filter( 'quick_edit_dropdown_pages_args', function( $dropdown_args )
{
    $screen = get_current_screen();
    if( 'edit-page' === $screen->id )
    {
        $dropdown_args['number']       = 10; // Limit the number of pages
        $dropdown_args['hierarchical'] = 0;  // Keep it non-hierarchical
        $dropdown_args['offset']        = 1;  // Suitable for pagination
    }
    return $dropdown_args;
} );

請注意,第二個輸入參數 ($post) 不適用於此過濾器回調。

當然可以刪除頁面屬性支持:

add_action( 'init', function()
{
    remove_post_type_support( $post_type = 'page', 'page-attributes' );

} );

但是,我們也可以使用 non-hierarchical 帖子類型;-)

列出父母與 ajax 分頁?

在上述過濾器的幫助下,應該可以創建一個分頁 (non-hierarchical) 的父母列表,這些列表將通過 ajax 進行更新。也許可以更新選擇框選項,以保持當前佈局。這可能嗎與建議 (在核心 trac) 父搜索框上的方法不同,具有自動完成。

第三種解決方法

好吧,對於任何人訪問這篇文章 – 我找到了解決方案… 我實際上遇到這個問題 (當一個網站有很多頁面)

註冊自定義帖子類型時,問題是這一行:

'hierarchical'          => true,

所有你需要做的是將其改為 false!

'hierarchical'          => false,

解釋:當”hierarchical” 設置為 true 時,每個帖子的行為就像一個頁面。我在這裏引用,所以我真的不明白為什麼它重要,但改變這一行刪除問題。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。