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


9

我收到一个奇怪的错误-
特定自定义帖子类型(仅适用于该帖子)的帖子列表中出现白色屏幕

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


页面仍然没有回声什么……(源代码中也没有)

我在管理员中谈论的是这样的网址: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

帖子列表已正确加载...


1
您包含的代码中没有任何东西会引起这种情况,请确认您没有干扰pre_get_posts查询的内容
Milo

谢谢milo ...在文件中搜索了pre_get_posts,却找不到任何东西-这很奇怪!; <(感谢您的帮助
。– Sagive SEO 2014年

同意@Milo,必须对查询起作用。请注意,不仅有大量的过滤器会作用于查询pre_get_posts。但是,如果调试处于活动状态,并且白屏没有错误,我认为必须存在exitdie,请尝试搜索它们。
gmazzap

多数民众赞成在一个gr8的想法!将做通用汽车谢谢您的输入
Sagive SEO 2014年

有什么进展吗?有同样的问题。
Nic

Answers:


8

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

似乎当“ hierarchical”设置为true时,每个帖子的行为都像一个页面。我在这里引用的意思是,我不太明白为什么会这样,但是更改此行可以解决问题。

这是食典关于hierarchical参数的说明

等级制

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

默认值:false

注意:  此参数是为Pages设计的。请注意,为您的自定义帖子类型选择它时-如果您计划有很多条目(例如-超过100个),则会遇到内存问题。将此参数设置为true时,WordPress将在为您的帖子类型加载的每个管理页面上获取该特定帖子类型的所有条目以及所有元数据。

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

此操作非常昂贵,因为Wordpress需要在每次加载页面时获取每个页面(或从分层发布类型中发布),然后寻找该特定页面/帖子的父页面和子页面来为该特定页面/帖子构建正确的树。如果您的分层自定义帖子类型中有大量页面或帖子,则查询只会变得很大并且超过内存限制或超时,这将导致致命错误,从而导致WSOD。

诸如内置帖子类型的非分层帖子类型post没有这样的层次结构,因为非分层帖子类型的帖子不能具有子帖子。因为不需要建立父子关系树(出于明显的原因),所以Wordpress只需按后端中按日期排序的每页查询20个(IIRC)帖子,并与Wordpress不得不按等级的帖子类型帖子进行对比显示一次查询所有帖子,构建一棵树,然后在根据其父子关系分组的帖子上仅显示x数量。您可以Post在后端页面中检查此行为

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

我希望这对您来说更有意义,为什么您应该避免将自定义帖子类型设为分层形式,以及为什么在抄本中也有说明


非常酷的@pietergoosen非常感谢您的分享-我讨厌不这样做,而又不这样做;)
Sagive SEO 2015年

我的荣幸。Ejoy :-)
Pieter Goosen

6

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

关于分层职位类型,还有一个潜在的性能杀手

即使用的父页面下拉wp_dropdown_pages()

当前,它几乎没有效率,因为它将(几乎)所有页面加载到选择下拉框中。

因此,如果我们的网站上有很多页面,则可能会影响性能。

想象一下一个拥有一百万页的网站;-)

这是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' );

} );

但是我们也可以只使用非分层发布类型;-)

列出具有ajax分页的父母?

在上述过滤器的帮助下,应该有可能创建一个分页的(非分层的)父母列表,该列表将通过ajax进行更新。也许可以更新选择框选项,以保留当前布局。这可能吗?与建议的(在核心追踪中)父搜索框不同,并具有自动完成功能。


感谢您提供的信息。在不久的将来需要研究的东西;-)
Pieter Goosen

几周前,当我开始进行几千页的安装时,我才发现这一点。我很惊讶地看到父页面下拉框具有数千个选项;-)这也是屏幕@PieterGoosen 中的快速编辑edit.php一部分
birgire 2015年

1
是的,在当前的核心状态下,我不建议使用超过100页,除非您拥有良好的服务器=>我们只需要找到一种方法来使用非层次结构帖子而不是大量项目的页面;-)
比尔吉雷(Birgire),2015年

2
也许如果后端将所有对象都保留在内存中并且仅通过一些巧妙的“ diff”与数据库同步;-)我认为该wp_dropdown_pages()问题的一种建议解决方案是使用带有ajax自动完成功能的搜索文本框,而不是页数为“大”时的当前下拉框。@PieterGoosen
birgire 2015年

1
@ialocin任何有益的信息,包括哲学观点,都应得到赞赏;-)
Pieter Goosen

3

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

问题是注册自定义帖子类型时的以下行:

'hierarchical'          => true,

您需要做的就是将其更改为false!

'hierarchical'          => false,

说明:
当“ hierarchical”设置为true时,每个帖子的行为都像一个页面。我在这里引用的意思是,我不太明白为什么会这样,但是更改此行可以解决问题。


-1

这是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 );
}

复制和粘贴的内容如何?为什么将这段代码粘贴到这里?
Sagive SEO 2014年

抱歉,看到您的代码是我在adroid应用程序中检查的,但不知道为什么它有时会隐藏内容,而有时却会非常缓慢
emilushi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.