问题描述

我得到一个奇怪的错误 – 白色屏幕在特定的自定义帖子类型的帖子列表 (只为那一个)

  • 尝试停用所有插件

  • 尝试检查错误 (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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。