Chỉ nhận các loại bài đăng dựa trên hỗ trợ


9

Tôi đang cố gắng truy xuất một danh sách bao gồm cả các loại bài đăng dựng sẵn và tùy chỉnh:

$post_types = get_post_types(array(
  'public' => TRUE,
), 'objects');

Các cách trên gần như hoạt động, nhưng tôi muốn loại trừ attachmentkhỏi danh sách này, chỉ trả về các loại bài đăng có hỗ trợ cụ thể như editor, titlethumbnail. Điều này có thể không?

Câu trả lời:


9

Tôi phát hiện ra rằng get_post_types_by_support()dường như là giải pháp để có được kết quả mong muốn:

$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));

Ở trên sẽ trở lại post, pagevà bất kỳ loại bài tùy chỉnh hỗ trợ title, editorthumbnail.

Vì điều này cũng sẽ trả về các loại bài đăng riêng tư, chúng tôi có thể lặp qua danh sách và kiểm tra xem loại này có thể xem được ở lối vào không. Điều này có thể được thực hiện bằng cách sử dụng is_post_type_viewable()chức năng:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}

Chỉ cần một lưu ý: điều này sẽ làm việc trong hầu hết các trường hợp.
cybmeta

4

get_post_types()chấp nhận một mảng các đối số để khớp với các trường của một đối tượng loại bài đăng . Vì vậy, bạn có thể làm một cái gì đó như thế này (không được thử nghiệm):

$post_types = get_post_types(array(
  'public'   => true,
  'supports' => array( 'editor', 'title', 'thumbnail' )
), 'objects');

Thật không may, bạn không thể đặt đôi khi như "loại trừ" trong chức năng này và bạn cũng chỉ nhận được các loại bài đăng hỗ trợ chính xác 'editor', 'title', 'thumbnail' , không hơn không kém.

Hoặc bạn có thể sử dụng get_post_types_by_support()(chỉ dành cho WP 4.5 trở lên. Ngoài ra, lưu ý rằng bạn không thể loại trừ các loại bài đăng cụ thể với chức năng này, nhưng đối với trường hợp hỗ trợ cụ thể editor, title, thumbnail, loại bài đăng đính kèm sẽ bị loại trừ trong hầu hết các trường hợp).

$post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

Nếu bạn muốn một cái gì đó sẽ hoạt động trong mọi trường hợp, tôi sẽ cố gắng để có được các loại bài đăng dựa trên một tiêu chí rộng hơn, sau đó xây dựng mảng của riêng bạn, đại loại như thế này:

$_post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

$post_types = [];

foreach($_post_types as $post_type) {
    // In most cases, attachment post type won't be here, but it can be
    if( $post_type->name !== 'attachment' ) {
        $post_types[] = $post_type;
    }
}

Sử dụng supportsdường như không hoạt động? Tôi có một loại bài đăng tùy chỉnh hỗ trợ editorvà nếu tôi sử dụng supports => array('editor')tôi có nhận được kết quả trống không? Cách tiếp cận thứ hai của bạn dường như làm việc mặc dù.
Cyclonecode

2
Có vẻ như chúng ta có thể sử dụng get_post_types_by_support()hỗ trợ để đạt được điều này.
Cyclonecode

0

Cách tiếp cận đơn giản nhất cho câu hỏi của OP sẽ là bỏ đặt 'tệp đính kèm' từ mảng được trả về;

$post_types = get_post_types(array('public' => TRUE,), 'objects');
unset($post_types['attachment']);

Mặc dù không thanh lịch như các giải pháp khác, nó có ít chi phí nhất.

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.