Gunakan register_post_type () untuk mengubah jenis posting yang ada


29

Ada banyak situasi di mana tema atau plugin mendaftarkan jenis posting dan Anda ingin memodifikasinya. Tentu saja ada add_post_type_support()dan remove_post_type_support(), tetapi mereka tidak memberikan akses ke daftar lengkap argumen yang register_post_type()diambil. Khususnya, mungkin saya ingin menonaktifkan arsip jenis posting, menyembunyikan UI admin, menyembunyikan dari pencarian, dll. Sambil membiarkan pengaturan jenis posting lainnya.

The Codex halaman untukregister_post_type() Dangles ini di depan saya:

Deskripsi

Buat atau modifikasi jenis posting.

Tetapi di masa lalu, ketika saya mencoba melakukan ini, sepertinya tidak berhasil. Apakah fungsi ini benar-benar untuk memodifikasi tipe posting, dan jika demikian, dapatkah Anda mendeklarasikan ulang argumen pasangan dan membiarkan sisanya sendirian?

Melihat bahwa bahkan tidak ada deregister_post_type()fungsi , saya tidak mengerti bagaimana itu bisa dilakukan.

Jawaban:


18

Apakah fungsi ini benar-benar untuk memodifikasi tipe posting

Iya nih.

dan jika demikian, dapatkah Anda mendeklarasikan ulang beberapa argumen dan membiarkan sisanya?

Tidak. Jika Anda ingin memodifikasi argumen menjadi tipe posting, Anda perlu menggunakan get_post_type_objectuntuk mendapatkan objek tipe posting, memodifikasi apa yang Anda inginkan di dalamnya, kemudian mendaftar ulang menggunakan tipe yang dimodifikasi sebagai parameter $ args baru.


Apakah melakukan dua panggilan berurutan dengan argumen yang dimodifikasi untuk hal yang sama register_post_typebenar? Saya berasumsi demikian oleh "Ya." Anda, dan itu tidak membuang kesalahan dan memiliki efek yang diinginkan. Kasus sebenarnya adalah opsi kedua yang saya sajikan dalam jawaban ini: wordpress.stackexchange.com/a/74331/12615
brasofilo

Ya, itu berfungsi, tetapi sepertinya jika Anda harus melakukannya, maka Anda perlu menambahkan beberapa filter atau sesuatu yang lain untuk mencegah berulang kali mendaftarkan jenis posting yang sama berulang-ulang. Pada dasarnya, dapatkan argumen diurutkan terlebih dahulu, lalu daftarkan.
Otto

Saya hanya memikirkannya karena pengait yang disediakan tepat sebelum pengaya register_post_type. Pada kenyataannya, tidak perlu. Itu adalah pertanyaan "untuk catatan", terima kasih atas umpan baliknya.
brasofilo

34

Setelah beberapa penelitian saya menemukan tidak ada jawaban yang up to date.

Pada 8 Desember 2015 WordPress menyertakan filter baru register_post_type_args,, yang memungkinkan Anda menghubungkan argumen dengan tipe posting terdaftar.

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
Ini adalah cara yang tepat untuk melakukan ini sekarang.
Dave Romsey

6
Ini seharusnya jawaban yang diterima
klewis

Bagaimana jika Anda perlu memperbaruinya setelah terdaftar pada saat runtime? Contoh: setelahinit
Lucas Bustamante

@LucasBustamante Tidak masalah. Panggil saja baris 'add_filter' selama plugin / tema Anda, bukan dalam aksi. Filter akan dipanggil selama setiap register_post_typefungsi. Satu-satunya skenario di mana kode saya tidak akan berfungsi adalah jika jenis posting tidak terdaftar dengan benar. Semua jenis posting harus didaftarkan selama init hook. Dari kodeks: "register_post_type tidak akan berfungsi jika dipanggil sebelum 'init', dan aspek dari tipe tulisan yang baru dibuat atau dimodifikasi akan bekerja secara salah jika dipanggil nanti." Jika Anda masih membutuhkan bantuan saya sarankan memposting lebih detail dalam pertanyaan baru.
Radley Sustaire

8

Berikut adalah contoh cara menggunakan 'registered_post_type'filter untuk mengubah jenis posting di plugin lain.

Plugin yang saya gunakan tidak menyertakan menu_icon dalam definisi itu, jadi saya ingin menambahkan salah satu dari saya sendiri.

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

Ini adalah cara yang jauh lebih bersih untuk melakukannya dalam banyak kasus; Namun, perlu dicatat bahwa filter ini sudah terlambat untuk dijemput oleh penulisan ulang sehingga jawaban yang diterima harus digunakan sebagai gantinya dalam situasi tersebut.
mrwweb

4

Hubungkan ke 'registered_post_type'setelah kode lain telah mendaftarkannya. Ini disebut pada akhir register_post_type(). Anda mendapatkan dua argumen: $post_typedan $args.
Sekarang Anda dapat mengubah apa pun untuk jenis posting ini. Periksa $GLOBALS['wp_post_types']beberapa opsi.


Terima kasih telah mengarahkan saya ke arah itu. Itu menjawab pertanyaan (yang lebih penting) tentang bagaimana mengubah jenis posting, tetapi bagaimana dengan deskripsi register_post_type()yang mencakup "modifikasi?" Apakah itu salah? Haruskah saya naik kuda internet saya dan mengalahkannya dari Codex saat ini?
mrwweb

2
$wp_post_types[$post_type] = $args;... menyarankan agar Anda dapat mengubah properti. Tambahkan contoh kode gagal ke pertanyaan Anda.
fuxia

0

Saya menghadapi hal yang sama dengan plugin The Events Calendar .

Saya menambahkan kode di bawah ini ke function.php untuk mengubah jenis posting 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

Saya tidak tahu apakah ini jelek, tetapi Anda bisa mengubah GLOBALplaceholder "on the fly" setiap kali Anda perlu memanipulasi satu argumen. Ini adalah bagaimana kami menggunakan jenis posting non-publik contentsagar dapat diterima di menu admin. Kami mengaitkan sebelum dan tutup setelah menu merender:

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

Dalam kasus kami, kami ingin plugin Admin Post Post List menerima jenis posting kami, karena mereka memanggil return get_post_types(array('public' => true));di dalam hook mereka dengan prioritas 11 ...

Pengembang -Silakan beri komentar jika ini dapat menyebabkan masalah apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.