Loại bài tùy chỉnh - danh sách bài viết - màn hình trắng của cái chết


9

Tôi đang gặp một lỗi lạ - màn hình trắng trong danh sách các bài đăng
cho một loại bài tùy chỉnh cụ thể (chỉ dành cho loại đó)

  • đã thử hủy kích hoạt tất cả các plugin
  • đã thử kiểm tra lỗi (gỡ lỗi = true)

Vẫn không có gì
trang chỉ không lặp lại bất cứ điều gì ... (không có gì trong nguồn)

Tôi đang nói về một url như vậy trong quản trị viên:
http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

Đây là phần register_post_type tôi đang sử dụng:

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

Có ai gặp phải một hiện tượng như vậy không?
bạn có thể nghĩ ra một lý do điều này có thể xảy ra?

Một điều kỳ lạ
khi tôi thay đổi điều này:
http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt

Về điều này:
http://www.example.co.il/wp-admin/edit.php?post_type=submodelscpt&orderby=date&order=desc

Danh sách bài viết tải chính xác ...


1
không có gì trong mã được bao gồm của bạn sẽ gây ra điều này, xác minh rằng bạn không có gì đó can thiệp vào các pre_get_poststruy vấn- , bộ lọc truy vấn, v.v.
Milo

cảm ơn milo ... đã tìm kiếm pre_get_posts trên các tệp và không thể tìm thấy bất cứ điều gì - điều này thật kỳ lạ! ; <(cảm ơn vì đã cố gắng giúp đỡ.
Sagive SEO

Đồng ý với @Milo, phải là một cái gì đó hành động theo truy vấn. Lưu ý rằng có hàng tấn bộ lọc hoạt động theo truy vấn, không chỉ pre_get_posts. Tuy nhiên, nếu gỡ lỗi của bạn đang hoạt động và bạn nhận được màn hình trắng không có lỗi tôi nghĩ rằng phải có một exithoặc một die, hãy thử tìm kiếm chúng.
gmazzap

đó là một ý tưởng gr8! sẽ làm GM cảm ơn cho đầu vào của bạn
Sagive SEO

Bất kỳ tiến bộ về điều này? Có cùng một vấn đề.
Nic

Câu trả lời:


8

Điều này là để mở rộng câu trả lời của riêng bạn:

Có vẻ như khi "phân cấp" được đặt thành đúng, mỗi bài đăng sẽ hoạt động như một trang. Tôi đang trích dẫn ở đây vì vậy tôi không thực sự hiểu tại sao nó quan trọng nhưng việc thay đổi dòng này sẽ loại bỏ vấn đề.

Đây là những gì codex nói về hierarchicaltham số

thứ bậc

(boolean) (tùy chọn) Cho dù loại bài đăng có phân cấp (ví dụ: trang). Cho phép Phụ huynh được chỉ định. Tham số 'hỗ trợ' phải chứa 'thuộc tính trang' để hiển thị hộp chọn cha trên trang soạn thảo.

Mặc định: sai

Lưu ý:  tham số này đã được lên kế hoạch cho Trang. Hãy cẩn thận, khi chọn nó cho loại bài đăng tùy chỉnh của bạn - nếu bạn dự định có nhiều mục (giả sử - hơn 100), bạn sẽ gặp vấn đề về bộ nhớ. Với tham số này được đặt thành WordPress thực sự sẽ tìm nạp tất cả các mục của loại bài đăng cụ thể đó, cùng với tất cả dữ liệu meta, trên mỗi lần tải trang quản trị cho loại bài đăng của bạn.

Khi một loại bài đăng tùy chỉnh được đặt là phân cấp, hành vi của nó sẽ giống như kiểu xây dựng trong loại bài đăng page. Giống như các trang, Wordpress cố gắng xây dựng một cây để hiển thị cây phân cấp chính xác với các mối quan hệ cha-con ở phía sau. Như bạn có thể nhận thấy, các trang không được sắp xếp theo ngày ở mặt sau, mà theo mối quan hệ cha-con này. Hành vi này bạn có thể dễ dàng nhìn thấy khi truy cập Pagetrang ở cuối.

Thao tác này rất tốn kém vì Wordpress cần lấy từng trang (hoặc bài đăng từ loại bài đăng phân cấp) trên mỗi lần tải trang và sau đó tìm trang phụ và trang con của trang đó để tạo một cây chính xác cho trang / bài đăng cụ thể đó . Nếu bạn có số lượng lớn trang hoặc bài đăng trong loại bài đăng tùy chỉnh phân cấp của mình, truy vấn chỉ đơn giản trở nên lớn và vượt quá giới hạn bộ nhớ hoặc hết thời gian, dẫn đến lỗi nghiêm trọng, do đó WSOD.

Các loại bài đăng không phân cấp như kiểu xây dựng trong loại bài đăng postkhông có thứ bậc như các bài đăng loại không phân cấp không thể có bài đăng con. Do không cần xây dựng cây quan hệ cha-con (vì lý do rõ ràng), Wordpress chỉ cần truy vấn 20 bài đăng ( IIRC ) trên mỗi trang được sắp xếp theo ngày ở phía sau và hiển thị chúng trái ngược với bài đăng loại phân cấp mà Wordpress phải truy vấn tất cả các bài đăng cùng một lúc, xây dựng một cây và sau đó chỉ hiển thị một lượng x trên một bài đăng được nhóm theo mối quan hệ cha-con của chúng. Bạn có thể kiểm tra hành vi này trong Posttrang ở phía sau

Vì vậy, việc đặt loại bài đăng tùy chỉnh thành phân cấp sẽ cho Wordpress biết rằng nó sẽ xây dựng một danh sách / cây bài đăng được nhóm theo mối quan hệ cha-con của chúng và trả về những bài đăng đó trong cấu hình đó. Đặt loại bài đăng tùy chỉnh thành không phân cấp, bạn đang nói với Wordpress bỏ qua toàn bộ mối quan hệ và chỉ trả lại một lượng x bài đăng trên mỗi trang được sắp xếp theo ngày đăng

Tôi hy vọng điều này có ý nghĩa hơn với bạn tại sao bạn nên tránh tạo các loại bài đăng tùy chỉnh theo cấp bậc và tại sao điều đó cũng được nêu trong bộ luật


rất mát mẻ @pietergoosen thanks a lot để chia sẻ - tôi ghét chỉ làm mà không có lý do tại sao;)
Sagive SEO

Hân hạnh. Ejoy :-)
Pieter Goosen

6

Tôi chỉ muốn thêm vào câu trả lời của @SagiveSEO và @PieterGoosen.

Ngoài ra còn có một kẻ giết người hiệu suất tiềm năng liên quan đến các loại bài đăng phân cấp :

Cụ thể là hộp thả xuống trang cha mẹ sử dụng wp_dropdown_pages().

Hiện tại nó rất không hiệu quả vì nó tải (gần như) tất cả các trang vào hộp thả xuống được chọn.

Vì vậy, nếu chúng ta có một trang web có nhiều trang, thì điều này có thể ảnh hưởng đến hiệu suất.

Chỉ cần tưởng tượng một trang web có 1 triệu trang ;-)

Điều này đã được báo cáo 6 năm trước với vé # 9864 . Nó vẫn mở để bạn vẫn có thể đóng góp cho giải pháp tự động hoàn thành được đề xuất.

Cập nhật:

Tôi chỉ muốn đề cập đến một số bộ lọc hữu ích:

  • wp_dropdown_pages- một bộ lọc đầu ra cho wp_dropdown_pages()chức năng. Có thể được sử dụng để chắp thêm hoặc lặp lại một số HTML bổ sung nếu cần.
  • get_pages- bởi vì wp_dropdown_pages()gọi get_pages()hàm.
  • page_attributes_dropdown_pages_args- một bộ lọc cho các đối số wp_dropdown_pages()trên post.php/post-new.phpmàn hình cho các loại bài đăng phân cấp.
  • quick_edit_dropdown_pages_args- một bộ lọc cho đối số wp_dropdown_pages()trên edit.phpmàn hình cho các loại bài đăng theo kiểu chữ tượng hình.

có thể được sử dụng để giải quyết vấn đề.

Có thể thay đổi sản lượng wp_dropdown_pages()trên post.phpmàn hình với:

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 );

và tương tự cho edit.phpmàn hình cho các trang :

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

Lưu ý rằng đối số đầu vào thứ hai ( $post) không khả dụng cho cuộc gọi lại bộ lọc này.

Tất nhiên có thể chỉ cần loại bỏ hỗ trợ thuộc tính trang:

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

} );

nhưng sau đó chúng ta có thể chỉ sử dụng loại bài đăng không phân cấp thay thế ;-)

Liệt kê cha mẹ với phân trang ajax?

Có thể, với sự trợ giúp của các bộ lọc ở trên, để tạo danh sách cha mẹ phân cấp (không phân cấp), sẽ được cập nhật qua ajax. Có thể các tùy chọn hộp chọn có thể được cập nhật, để giữ bố cục hiện tại. Điều này có lẽ sẽ? là một cách tiếp cận khác với hộp tìm kiếm gốc được đề xuất (trên lõi trac), với tính năng tự động hoàn thành.


Cảm ơn thông tin đó. Một cái gì đó để xem xét trong tương lai gần ;-)
Pieter Goosen

Tôi mới phát hiện ra điều này vài tuần trước, khi tôi phải làm việc với một bản cài đặt với vài nghìn trang. Tôi đã rất ngạc nhiên khi thấy hộp thả xuống của trang mẹ có hàng ngàn tùy chọn ;-) Đây cũng là một phần của Chỉnh sửa nhanh trong edit.phpmàn hình @PieterGoosen
birgire

1
có và với trạng thái cốt lõi hiện tại, tôi không khuyên bạn nên sử dụng hơn ~ 100 trang, trừ khi bạn có một máy chủ tốt => chúng ta chỉ cần tìm cách sử dụng các bài đăng không phân cấp thay vì các trang cho số lượng lớn các mục ;-)
bạch dương

2
có thể nếu phụ trợ sẽ giữ tất cả các đối tượng trong bộ nhớ và chỉ đồng bộ hóa với cơ sở dữ liệu thông qua một số "diff" thông minh ;-) Tôi nghĩ một giải pháp được đề xuất cho wp_dropdown_pages()vấn đề này là sử dụng hộp văn bản tìm kiếm với tự động hoàn thành ajax thay vì hộp thả xuống hiện tại, khi số lượng trang "lớn". @PieterGoosen
birgire

1
@ialocin bất cứ điều gì thông tin đều được đánh giá cao, ngay cả quan điểm triết học ;-)
Pieter Goosen

3

Ok ... cho bất cứ ai truy cập bài đăng này - tôi đã tìm thấy giải pháp ...
tôi thực sự gặp lại vấn đề này (khi một trang web có rất nhiều trang)

Vấn đề là dòng này khi đăng ký một loại bài tùy chỉnh:

'hierarchical'          => true,

Tất cả bạn cần làm là thay đổi nó thành sai!

'hierarchical'          => false,

Explenation:
Dường như khi "thứ bậc" được thiết lập là true, mỗi bài cư xử giống như một trang. Tôi đang trích dẫn ở đây vì vậy tôi không thực sự hiểu tại sao nó quan trọng nhưng việc thay đổi dòng này sẽ loại bỏ vấn đề.


-1

Dưới đây là một ví dụ đầy đủ từ codpress wordpress

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

Có chuyện gì với bản sao và dán? Tại sao bạn dán mã này ở đây?
SEO Sagive

Xin lỗi, tôi không thấy mã của bạn, tôi đã kiểm tra nó từ ứng dụng adroid nhưng không hiểu tại sao đôi khi nó lại ẩn nội dung và đôi khi nó làm mất hiệu lực
emilushi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.