register_post_type()を使用して、既存の投稿タイプを変更します


29

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

以下のためのコーデックスページには、register_post_type()私の目の前でこれをぶら下がっ:

説明

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

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

関数さえderegister_post_type()存在しないことを見て、私はそれがどのように行われるか理解していません。

回答:


18

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

はい。

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

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


引数を変更して同じregister_post_typeものを2回連続して呼び出すのは正しいでしょうか?私はあなたの「はい」でそう思います、そしてそれはどんなエラーもダンプせず、望ましい効果があります。実際のケースでは、この答えで2番目のオプションIの存在である:wordpress.stackexchange.com/a/74331/12615
brasofilo

はい、それは機能しますが、そうする必要がある場合は、同じ投稿タイプを繰り返し登録する必要を防ぐために、いくつかのフィルターまたは何か他のものを追加する必要があるようです。基本的に、最初に引数を整理し、登録します。
オットー

プラグインの直前に提供されたフックのため、私はそれについて考えましたregister_post_type。実際には、必要はありません。それは「記録のため」の質問でした、フィードバックに感謝します。
ブラソフィロ

34

いくつかの調査の後、これらの答えがどれも最新のものではないことがわかりました。

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

6
これが今これを行う正しい方法です。
デイブロムジー

6
これは受け入れられた答えでなければなりません
-klewis

ランタイムに登録した後に更新する必要がある場合はどうなりますか?例:後init
ルーカスブスタマンテ

@LucasBustamante関係ありません。アクションではなく、プラグイン/テーマ中に「add_filter」行を呼び出すだけです。フィルターは、すべてのregister_post_type機能中に呼び出されます。私のコードが機能しない唯一のシナリオは、投稿タイプが正しく登録されていない場合です。すべての投稿タイプは、initフック中に登録する必要があります。コーデックスから:「「init」の前に呼び出された場合、register_post_typeは機能しません。また、後で呼び出された場合、新しく作成または変更された投稿タイプの側面は正しく機能しません。」それでも支援が必要な場合は、新しい質問に詳細を投稿することをお勧めします。
ラドリーサステア

8

次に、'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 );

これはほとんどの場合、はるかにクリーンな方法です。ただし、このフィルターはリライトでピックアップするには遅すぎるため、そのような状況では受け入れられた回答を代わりに使用する必要があることに注意してください。
mrwweb

4

'registered_post_type'他のコードが登録した後にフックします。の終わりに呼び出されregister_post_type()ます。次の2つの引数を取得:$post_type$args
これで、この投稿タイプのすべてを変更できます。$GLOBALS['wp_post_types']いくつかのオプションを調べます。


そのフックに私を向けてくれてありがとう。これは、投稿タイプの変更方法に関する(より重要な)質問に答えますが、その説明にregister_post_type()は「変更」が含まれますか?それはちょうど間違っていますか?この時点でインターネットホースに飛び乗り、コーデックスからそれを打ち負かす必要がありますか?
mrwweb

2
$wp_post_types[$post_type] = $args;…は、プロパティを変更できることを示しています。失敗したコードの例を質問に追加します。
FUXIA

0

イベントカレンダープラグインでも同じことが起こりました。

以下のコードをfunction.phpに追加して、投稿タイプ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

これがいのかどうかはわかりませんがGLOBAL、1つの引数を操作する必要があるときはいつでもプレースホルダを「オンザフライ」で変更できます。これは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でフック内で呼び出します...

開発者-問題が発生する可能性がある場合はコメントしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.