自定义帖子类型-帖子列表-死亡白屏

时间:2014-11-26 作者:Sagive

对于特定的自定义帖子类型(仅针对该类型),我在帖子列表中看到一个奇怪的错误-白色屏幕

已尝试停用所有插件,并尝试检查错误(调试=true)

    Still nothing<页面没有任何回应。。。(来源中也没有)

    我在管理员中谈论这样一个url:
    http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

    Here is register_post_type part i am using:

    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\');
    
    有人遇到过这样的问题吗<你能想出发生这种情况的原因吗?

    Another weird thing
    当我更改此选项时:
    http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

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

    帖子列表加载正确。。。

4 个回复
最合适的回答,由SO网友:Sagive 整理而成

好啊对于任何访问此帖子的人-我已经找到了解决方案
我实际上又遇到了这个问题(当一个站点有很多页面时)

The issue is this line when registering a custom post type:

\'hierarchical\'          => true,

All you need to do is to change it to false!

\'hierarchical\'          => false,
Explenation:
当“Hierarchy”设置为true时,每个帖子的行为就像一个页面。我在这里引用这句话,所以我真的不明白为什么这很重要,但改变这一行可以解决问题。

SO网友:Pieter Goosen

这是为了扩展您自己的答案:

似乎当;“层次结构”;设置为true时,每个帖子的行为就像一个页面。我在这里引用这句话,所以我真的不明白为什么这很重要,但改变这一行可以解决问题。

以下是法典中关于hierarchical 参数

hierarchical

(布尔)(可选)帖子类型是否为层次结构(例如页面)。允许指定父级。“supports”参数应包含“page attributes”,以在编辑器页面上显示父选择框。

默认值:false

Note:此参数计划用于页面。要小心,在为自定义帖子类型选择它时-如果您计划有许多条目(比如超过100条),您将遇到内存问题。将此参数设置为true后,WordPress将在您的帖子类型的每个管理页面加载上获取该特定帖子类型的所有条目以及所有元数据。

当自定义帖子类型设置为Hierarchychal时,其行为将与内置帖子类型相同page. 与页面一样,Wordpress尝试构建一个树,以显示后端具有父子关系的正确层次结构树。您可能已经注意到,页面在后端不是按日期排序的,而是按这种父子关系排序的。在访问Page 页面位于后端。

此操作非常昂贵,因为Wordpress需要在every page load 然后查找该特定页面/帖子的父页面和子页面,为该特定页面/帖子构建正确的树。如果您的分层自定义帖子类型中有大量页面或帖子,则查询将变大,超出内存限制或超时,从而导致致命错误,从而导致WSOD。

非层次结构的帖子类型,如内置帖子类型post 没有层次结构,因为非层次结构的帖子类型帖子不能有子帖子。由于不需要构建父子关系树(出于明显的原因),Wordpress只需在后端查询按日期排序的每页20篇(IIRC)帖子,并将其显示出来,而Wordpress则需要查询分层帖子类型的帖子all 一次发布,构建一个树,然后在根据父子关系分组的帖子上仅显示x数量。您可以在中检查此行为Post 后端页面

因此,将自定义帖子类型设置为Hierarchy会告诉Wordpress,它应该构建一个按父子关系分组的帖子列表/树,并在该配置中返回这些帖子。将自定义帖子类型设置为非层次结构,就是告诉Wordpress跳过整个关系,只返回按发布日期排序的每页x数量的帖子

我希望这对你更有意义,为什么你应该避免将自定义帖子类型分等级,为什么这也在抄本中有规定

SO网友:birgire

我只想补充一下SagiveSEO和PieterGoosen的答案。

关于层次结构的帖子类型,还有一个潜在的性能杀手:

parent page dropdown 使用wp_dropdown_pages().

它目前非常不实用,因为它将(几乎)所有页面加载到“选择”下拉框中。

因此,如果我们有一个包含许多页面的站点,那么这可能会影响性能。

想象一下,一个有100万页面的网站;-)

这是6年前的报道#9864. 它仍然是开放的,因此您仍然可以为建议的自动完成解决方案做出贡献。

更新:

我只想提到一些有用的过滤器:

  • wp_dropdown_pages -- 用于wp_dropdown_pages() 作用如果需要,可以用于附加或回显一些额外的HTML
  • get_pages -- 因为wp_dropdown_pages() 调用get_pages() 功能
  • page_attributes_dropdown_pages_args -- 参数的筛选器wp_dropdown_pages()post.php/post-new.php 分级职位类型的屏幕
  • quick_edit_dropdown_pages_args -- 参数的筛选器wp_dropdown_pages()edit.php 层次结构帖子类型的屏幕

    可以修改wp_dropdown_pages()post.php 屏幕显示:

    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\' );
    
    } );
    
    但我们也可以使用非层次化的post类型;-)

    List parents with ajax pagination?

    在上述过滤器的帮助下,应该可以创建一个分页(非层次)的父级列表,该列表将通过ajax进行更新。也许可以更新选择框选项,以保持当前布局。这可能会吗?与建议的(核心trac上的)父搜索框不同的方法,自动完成。

SO网友:emilushi

以下是wordpress codex的完整示例

add_action( \'init\', \'codex_book_init\' );
function codex_book_init() {
$labels = array(
    \'name\'               => _x( \'Books\', \'post type general name\', \'your-plugin-textdomain\' ),
    \'singular_name\'      => _x( \'Book\', \'post type singular name\', \'your-plugin-textdomain\' ),
    \'menu_name\'          => _x( \'Books\', \'admin menu\', \'your-plugin-textdomain\' ),
    \'name_admin_bar\'     => _x( \'Book\', \'add new on admin bar\', \'your-plugin-textdomain\' ),
    \'add_new\'            => _x( \'Add New\', \'book\', \'your-plugin-textdomain\' ),
    \'add_new_item\'       => __( \'Add New Book\', \'your-plugin-textdomain\' ),
    \'new_item\'           => __( \'New Book\', \'your-plugin-textdomain\' ),
    \'edit_item\'          => __( \'Edit Book\', \'your-plugin-textdomain\' ),
    \'view_item\'          => __( \'View Book\', \'your-plugin-textdomain\' ),
    \'all_items\'          => __( \'All Books\', \'your-plugin-textdomain\' ),
    \'search_items\'       => __( \'Search Books\', \'your-plugin-textdomain\' ),
    \'parent_item_colon\'  => __( \'Parent Books:\', \'your-plugin-textdomain\' ),
    \'not_found\'          => __( \'No books found.\', \'your-plugin-textdomain\' ),
    \'not_found_in_trash\' => __( \'No books found in Trash.\', \'your-plugin-textdomain\' )
);

$args = array(
    \'labels\'             => $labels,
    \'public\'             => true,
    \'publicly_queryable\' => true,
    \'show_ui\'            => true,
    \'show_in_menu\'       => true,
    \'query_var\'          => true,
    \'rewrite\'            => array( \'slug\' => \'book\' ),
    \'capability_type\'    => \'post\',
    \'has_archive\'        => true,
    \'hierarchical\'       => false,
    \'menu_position\'      => null,
    \'supports\'           => array( \'title\', \'editor\', \'author\', \'thumbnail\', \'excerpt\', \'comments\' )
);

register_post_type( \'book\', $args );
}

结束

相关推荐