カスタム投稿タイプ-投稿リスト-死の白い画面


9

奇妙なエラーが発生しました-
特定のカスタム投稿タイプ(その投稿のみ)の投稿リストの白い画面

  • すべてのプラグインを無効にしてみました
  • エラーのチェックを試みました(デバッグ= 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

投稿リストが正しく読み込まれます...


1
これを引き起こすあなたの含まれるコードで何もない、あなたはqueries-に干渉するものを持っていない検証pre_get_postsなど、クエリのフィルタ..
ミロ

miloに感謝...ファイル全体でpre_get_postsを検索しましたが、何も見つかりませんでした-これは奇妙です!; <(助けてくれてありがとう
Sagive SEO 2014

@Miloに同意します。クエリに基づいて行動する必要があります。だけでなく、クエリに作用する多数のフィルタがあることに注意してくださいpre_get_posts。ただし、デバッグがアクティブであり、エラーのない白い画面が表示される場合は、exitまたはがあるはずだと思うのでdie、それらを検索してみてください。
gmazzap

それはgr8のアイデアです!あなたの入力にGMの感謝を捧げます
Sagive SEO '11

これについて何か進展はありますか?同じ問題がある。
2015

回答:


8

これはあなた自身の答えを拡張することです:

「hierarchical」がtrueに設定されている場合、各投稿はページのように動作します。私はここで引用しているので、なぜそれが重要なのか本当にわかりませんが、この行を変更すると問題が解決します。

これはコーデックスがhierarchicalパラメータについて言っていることです

階層的

(ブール)(オプション)投稿タイプが階層的かどうか(ページなど)。親を指定できます。エディターページに親選択ボックスを表示するには、 'supports'パラメーターに 'page-attributes'を含める必要があります。

デフォルト:false

注:  このパラメーターはページ用に計画されました。カスタム投稿タイプにそれを選択するときは注意してください-多くのエントリ(たとえば-100以上)を計画している場合、メモリの問題が発生します。このパラメーターをtrueに設定すると、WordPressは、特定の投稿タイプのすべてのエントリーを、すべてのメタデータとともに、投稿タイプの各管理ページのロードでフェッチします。

カスタム投稿タイプが階層型に設定されている場合、その動作は組み込み投稿タイプと同じになりますpage。ページと同様に、Wordpressはツリーを作成して、バックエンドに親子関係を持つ正しい階層ツリーを表示しようとします。お気づきかもしれませんが、ページはバックエンドでは日付でソートされず、この親子関係によってソートされます。この動作はPage、バックエンドでページにアクセスしたときに簡単に確認できます。

Wordpressは、ページが読み込まれるたびに各ページ(または階層的な投稿タイプから投稿)を取得し、その特定のページ/投稿の親ページと子ページを探して、その特定のページ/投稿に適切なツリーを構築する必要があるため、この操作は非常にコストがかかります。 。階層カスタム投稿タイプに大量のページまたは投稿がある場合、クエリは単に大きくなり、メモリ制限を超えるかタイムアウトになるため、致命的なエラーが発生し、WSODが発生します。

ビルドインポストタイプのような非階層的ポストタイプには、post非階層的ポストタイプのポストが子ポストを持つことができないような階層はありません。(明白な理由により)親子関係ツリーを構築する必要がないため、Wordpress はページごとに20(IIRC)の投稿をバックエンドで日付順に並べ替え、Wordpress が必要とする階層的な投稿タイプの投稿とは対照的にそれらを表示します一度にすべての投稿をクエリてツリーを作成し、親子関係に従ってグループ化された投稿にxの量のみを表示します。この動作Postはバックエンドのページで確認できます

したがって、カスタム投稿タイプを階層に設定すると、Wordpressは親子関係でグループ化された投稿のリスト/ツリーを作成し、それらの投稿をその構成で返す必要があることをWordpressに伝えます。カスタムの投稿タイプを非階層に設定すると、WordPressに関係全体をスキップして、投稿日順に並べ替えられたページあたりx個の投稿を返すように指示することになります。

これがカスタム投稿タイプを階層化することを避けなければならない理由、そしてそれがコーデックスでも述べられている理由がもう少し理解できることを願っています


非常にクールな@pietergoosen共有に感謝します
Sagive SEO

どういたしまして。喜び:-)
ピーターグーセン

6

@SagiveSEOと@PieterGoosenの回答に追加したいだけです。

階層型の投稿タイプに関しては、潜在的なパフォーマンスキラーもあります。

つまり、を使用する親ページのドロップダウンボックスです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.phphierararchicalポストタイプ用の画面。

問題に対処するために使用できます。

それはの出力を修正することができます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;
} );

2番目の入力引数($post)は、このフィルターコールバックでは使用できないことに注意してください。

もちろん、ページ属性のサポートを削除することも可能です。

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

} );

ただし、代わりに非階層的な投稿タイプを使用することもできます;-)

ajaxページネーションを使用して親をリストしますか?

上記のフィルターを使用して、ajax経由で更新される、ページ付けされた(非階層的な)親のリストを作成できるはずです。おそらく、現在のレイアウトを維持するために、選択ボックスのオプションを更新できます。これはおそらくでしょうか?自動補完機能を備えた、推奨される(コアトラック上での)親検索ボックスとは異なるアプローチである。


その情報をありがとう。近い将来に検討すべきこと;-)
Pieter Goosen

数週間前に、数千ページのインストールに取り掛かったときにこのことを発見しました。親ページのドロップダウンボックスに何千ものオプションがあることを知って驚いた;-)これは画面のクイック編集の一部でもありedit.phpます@PieterGoosen
birgire

1
はい、現在のコア状態では、良いサーバーが得られない限り、100ページを超えて使用することはお勧めしません=>多数のアイテムに対して、ページの代わりに非階層的な投稿を使用する方法を見つけなければなりません;-)
バージィ

2
多分バックエンドがすべてのオブジェクトをメモリに保持し、巧妙な「差分」を介してのみデータベースと同期する場合;-) wp_dropdown_pages()問題の解決策として提案されているのは、検索テキストボックスをajax自動補完の代わりに使用することです。現在のドロップダウンボックス、ページ数が「大きい」場合。@PieterGoosen
2015年

1
@ialocin哲学的な見方も含めて、有益な情報は大歓迎です;-)
Pieter Goosen

3

わかりました...この投稿にアクセスした人のために-私は解決策を見つけました...
私は実際にこの問題に再び遭遇しました(サイトに多くのページがある場合)

問題は、カスタム投稿タイプを登録するときの次の行です。

'hierarchical'          => true,

あなたがする必要があるのはそれをfalseに変更することです!

'hierarchical'          => false,

説明:
「hierarchical」がtrueに設定されている場合、各投稿はページのように動作するようです。私はここで引用しているので、なぜそれが重要なのか本当にわかりませんが、この行を変更すると問題が解決します。


-1

これはワードプレスコーデックスの完全な例です

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

申し訳ありませんが、アドロイドアプリからチェックしていたコードを確認しましたが、なぜコンテンツが非表示になり、いつかそれが非常にスムーズになる理由がわかりません
emilushi 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.