Sử dụng register_post_type () để sửa đổi loại bài đăng hiện có


29

Có rất nhiều tình huống trong đó một chủ đề hoặc plugin đăng ký một loại bài đăng và bạn muốn sửa đổi nó. Có tất nhiên add_post_type_support()remove_post_type_support(), nhưng những người không cho truy cập vào danh sách đầy đủ của các đối số mà register_post_type()mất. Cụ thể, có thể tôi muốn vô hiệu hóa kho lưu trữ loại bài đăng, ẩn giao diện người dùng quản trị, ẩn khỏi tìm kiếm, v.v. trong khi chỉ để lại phần còn lại của cài đặt loại bài đăng.

Các trang Codex choregister_post_type() dangles này trước mặt tôi:

Sự miêu tả

Tạo hoặc sửa đổi một loại bài.

Nhưng trong quá khứ, khi tôi cố gắng làm điều này, nó dường như không hoạt động. Là chức năng này thực sự để sửa đổi các loại bài đăng, và nếu vậy, bạn có thể đơn giản xác định lại một vài đối số và để phần còn lại một mình không?

Thấy rằng thậm chí không có deregister_post_type()chức năng , tôi không hiểu làm thế nào nó có thể được thực hiện.

Câu trả lời:


18

Là chức năng này thực sự để sửa đổi các loại bài

Vâng.

và nếu vậy, bạn có thể đơn giản xác định lại một vài đối số và để phần còn lại một mình không?

Không. Nếu bạn muốn sửa đổi đối số thành loại bài đăng, bạn cần sử dụng get_post_type_objectđể lấy đối tượng loại bài đăng, sửa đổi những gì bạn muốn trong đó, sau đó đăng ký lại bằng cách sử dụng loại sửa đổi của bạn làm tham số $ args mới.


Sẽ thực hiện hai cuộc gọi liên tiếp với các đối số được sửa đổi thành giống nhau register_post_type? Tôi giả sử như vậy bằng "Có.", Và nó không bỏ qua bất kỳ lỗi nào và có hiệu quả mong muốn. Trường hợp thực tế là tùy chọn thứ hai tôi trình bày trong câu trả lời này: wordpress.stackexchange.com/a/74331/12615
brasofilo

Vâng, điều đó hoạt động, nhưng có vẻ như nếu bạn phải làm điều đó, thì bạn cần thêm một số bộ lọc hoặc một cái gì đó khác để ngăn chặn việc phải liên tục đăng ký cùng một loại bài đăng nhiều lần. Về cơ bản, lấy các đối số được sắp xếp trước, sau đó đăng ký nó.
Otto

Tôi chỉ nghĩ về nó vì hook được cung cấp ngay trước plugin register_post_type. Trong thực tế, không có nhu cầu. Đó là một câu hỏi "cho hồ sơ", cảm ơn vì đã phản hồi.
brasofilo

34

Sau một số nghiên cứu tôi thấy không có câu trả lời nào được cập nhật.

Kể từ ngày 8 tháng 12 năm 2015, WordPress bao gồm một bộ lọc mới register_post_type_args, cho phép bạn nối vào các đối số của loại bài đăng ký.

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
Đây là cách đúng đắn để làm điều này bây giờ.
Dave Romsey

6
Đây là câu trả lời được chấp nhận
klewis

Điều gì nếu bạn cần cập nhật nó sau khi nó đã được đăng ký trong thời gian chạy? Ví dụ: sauinit
Lucas Bustamante

@LucasBustamante Không thành vấn đề. Chỉ cần gọi dòng 'add_filter' trong plugin / theme của bạn, không phải trong một hành động. Bộ lọc sẽ được gọi trong mỗi register_post_typechức năng. Kịch bản duy nhất mà mã của tôi sẽ không hoạt động là nếu loại bài đăng không được đăng ký chính xác. Tất cả các loại bài đăng nên được đăng ký trong hook init. Từ codex: "register_post_type sẽ không hoạt động nếu được gọi trước 'init' và các khía cạnh của loại bài đăng mới được tạo hoặc sửa đổi sẽ hoạt động không chính xác nếu được gọi sau." Nếu bạn vẫn cần giúp đỡ, tôi đề nghị đăng thêm chi tiết trong một câu hỏi mới.
Radley Sustaire

8

Đây là một ví dụ về cách sử dụng 'registered_post_type'bộ lọc để sửa đổi loại bài đăng trong một plugin khác.

Một plugin tôi đang sử dụng không bao gồm menu_icon trong định nghĩa của nó, vì vậy tôi muốn thêm một plugin của riêng mình.

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

Đây là một cách sạch sẽ hơn nhiều để làm điều đó trong hầu hết các trường hợp; tuy nhiên, cần lưu ý rằng bộ lọc này quá muộn để được chọn bằng cách viết lại để câu trả lời được chấp nhận phải được sử dụng thay thế trong các tình huống đó.
mrwweb 17/03/2015

4

Móc vào 'registered_post_type'sau khi mã khác đã đăng ký nó. Nó được gọi vào cuối register_post_type(). Bạn nhận được hai đối số: $post_type$args.
Bây giờ bạn có thể thay đổi bất cứ điều gì cho loại bài đăng này. Kiểm tra $GLOBALS['wp_post_types']một số tùy chọn.


Cảm ơn đã chỉ cho tôi về cái móc đó. Điều đó trả lời câu hỏi (quan trọng hơn) về cách sửa đổi loại bài đăng, nhưng mô tả về register_post_type()điều đó bao gồm "sửa đổi?" Điều đó có sai không? Tôi có nên nhảy lên con ngựa internet của mình và đánh bại nó từ Codex lúc này không?
mrwweb

2
$wp_post_types[$post_type] = $args;Sồi gợi ý rằng bạn sẽ có thể thay đổi các thuộc tính. Thêm một ví dụ về mã thất bại cho câu hỏi của bạn.
fuxia

0

Tôi đã đối mặt với điều tương tự với plugin The Events Lịch .

Tôi đã thêm đoạn mã dưới đây vào function.php để sửa đổi loại bài đăng tribe_organizer

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

Tôi không biết điều này có xấu không, nhưng bạn có thể thay đổi GLOBALtrình giữ chỗ "nhanh chóng" bất cứ khi nào bạn cần thao tác với một đối số duy nhất. Đây là cách chúng tôi sử dụng loại bài đăng không công khai contentsđể được chấp nhận trong menu quản trị. Chúng tôi móc đóng trước và đóng sau khi menu hiển thị:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

Trong trường hợp của chúng tôi, chúng tôi muốn plugin Danh sách bài đăng của Quản trị viên chấp nhận loại bài đăng của chúng tôi, khi họ gọi return get_post_types(array('public' => true));bên trong hook của họ với mức độ ưu tiên 11 ...

Các nhà phát triển - Vui lòng đưa ra nhận xét nếu điều này có thể khắc phục mọi sự cố.

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.