web-dev-qa-db-ja.com

既存の投稿タイプを変更するにはregister_post_type()を使用してください

テーマやプラグインが投稿タイプを登録していて、それを修正したいという状況はたくさんあります。もちろんadd_post_type_support()remove_post_type_support()がありますが、それらはregister_post_type()が取る引数の完全なリストへのアクセスを与えません。特に、他の投稿タイプの設定だけを残したまま、投稿タイプのアーカイブを無効にしたり、管理UIを非表示にしたり、検索から非表示にしたりすることができます。

register_post_type()のコーデックスページ は目の前でこれをぶら下げます:

説明

投稿タイプを作成または変更します。

しかし、過去に私がこれをやろうとしたとき、それはうまくいっていないようでした。この関数は本当に投稿タイプを変更するためのものですか?もしそうであれば、単純にいくつかの引数を再宣言し、残りはそのままにしておくことができますか?

そこにあることを見て deregister_post_type()関数でさえない 、私はそれがどうやってできるのかわかりません。

25
mrwweb

この機能は本当に投稿タイプを変更するためのものですか?

はい。

もしそうなら、あなたは単にいくつかの引数を再宣言し、残りは一人にしておくことができますか?

いいえ。引数を投稿タイプに変更する場合は、get_post_type_objectを使用して投稿タイプオブジェクトを取得し、必要なものを変更してから、変更したタイプを新しい$ argsパラメータとして使用して再登録する必要があります。

15
Otto

いくつかの調査の結果、私はこれらの答えがどれも最新のものではないことを発見しました。

2015年12月8日現在、WordPressには、登録済みの投稿タイプの引数にフックできる新しいフィルタregister_post_type_argsが含まれています。

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 );
31
Radley Sustaire

これは'registered_post_type'フィルタを使って別のプラグインの投稿タイプを変更する方法の例です。

私が使っていたプラグインの定義にmenu_iconが含まれていなかったので、自分のプラグインを追加したいと思いました。

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

他のコードがそれを登録した後に'registered_post_type'にフックしてください。それはregister_post_type()の終わりに呼ばれます。 $post_type$argsの2つの引数があります。
これで、この投稿の種類に合わせて何でも変更できます。いくつかのオプションについて$GLOBALS['wp_post_types']を調べてください。

4
fuxia

これが醜いかどうかはわかりませんが、1つの引数を操作する必要があるときはいつでもGLOBALプレースホルダーを「その場で」変更することができます。これが、管理者メニューで許容されるように、非公開の投稿タイプcontentsを使用する方法です。メニューが表示される前と終了した後にフックを閉じます。

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

私たちの場合、彼らはフックの内側でreturn get_post_types(array('public' => true));を優先度11で呼び出すので、Admin Menu Post Listプラグインが私たちの投稿タイプを受け入れることを望みます...

開発者 - これが問題を解決する可能性がある場合はコメントをお願いします。

0
Jonas Lundman

私は イベントカレンダー pluginでも同じことに直面しました。

tribe_organizer ポストタイプを変更するためにfunction.phpに以下のコードを追加しました

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
Abouasy