テーマやプラグインが投稿タイプを登録していて、それを修正したいという状況はたくさんあります。もちろんadd_post_type_support()
とremove_post_type_support()
がありますが、それらはregister_post_type()
が取る引数の完全なリストへのアクセスを与えません。特に、他の投稿タイプの設定だけを残したまま、投稿タイプのアーカイブを無効にしたり、管理UIを非表示にしたり、検索から非表示にしたりすることができます。
register_post_type()
のコーデックスページ は目の前でこれをぶら下げます:
説明
投稿タイプを作成または変更します。
しかし、過去に私がこれをやろうとしたとき、それはうまくいっていないようでした。この関数は本当に投稿タイプを変更するためのものですか?もしそうであれば、単純にいくつかの引数を再宣言し、残りはそのままにしておくことができますか?
そこにあることを見て deregister_post_type()
関数でさえない 、私はそれがどうやってできるのかわかりません。
この機能は本当に投稿タイプを変更するためのものですか?
はい。
もしそうなら、あなたは単にいくつかの引数を再宣言し、残りは一人にしておくことができますか?
いいえ。引数を投稿タイプに変更する場合は、get_post_type_object
を使用して投稿タイプオブジェクトを取得し、必要なものを変更してから、変更したタイプを新しい$ argsパラメータとして使用して再登録する必要があります。
いくつかの調査の結果、私はこれらの答えがどれも最新のものではないことを発見しました。
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 );
これは'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 );
他のコードがそれを登録した後に'registered_post_type'
にフックしてください。それはregister_post_type()
の終わりに呼ばれます。 $post_type
と$args
の2つの引数があります。
これで、この投稿の種類に合わせて何でも変更できます。いくつかのオプションについて$GLOBALS['wp_post_types']
を調べてください。
これが醜いかどうかはわかりませんが、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プラグインが私たちの投稿タイプを受け入れることを望みます...
開発者 - これが問題を解決する可能性がある場合はコメントをお願いします。
私は イベントカレンダー 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 );