すべての投稿タイプからメタボックスを一度に削除するには、foreach
を使用するのが論理的なことのように思えます。しかし、必ずしもうまくいくとは限らず、その理由もわかりません。
たとえば、 "投稿"投稿タイプを表示するには、以下はtrackbacksdiv
のみを削除します。
function remove_metabox_from_all_post_types() {
$post_types = get_post_types();
foreach ( $post_types as $post_type )
remove_meta_box('trackbacksdiv', $post_type, 'normal');
remove_meta_box('postcustom', $post_type, 'normal');
remove_meta_box('authordiv', $post_type, 'normal');
remove_meta_box('postexcerpt', $post_type, 'normal');
}
add_action('admin_menu', 'remove_metabox_from_all_post_types', 999);
"投稿"投稿タイプを表示するとき、これはそれらすべてを削除しますが:
function remove_metabox_from_all_post_types() {
$post_types = get_post_types();
foreach ( $post_types as $post_type )
remove_meta_box('trackbacksdiv', 'post', 'normal');
remove_meta_box('postcustom', 'post', 'normal');
remove_meta_box('authordiv', 'post', 'normal');
remove_meta_box('postexcerpt', 'post', 'normal');
}
add_action('admin_menu', 'remove_metabox_from_all_post_types', 999);
メタボックスが登録された後にget_post_types
が起動されると思いますが、それが最初の方法では機能しないと推測できる唯一の理由です。私はdo_metaboxes
アクションフックも使ってみましたが、違いはありませんでした。
何か案は?
Appleの "Goto Fail"を覚えていますか?
似たような状況:
インデントが修正されると、実際にあなたのコードはこれを行います。
foreach ( $post_types as $post_type )
remove_meta_box('trackbacksdiv', $post_type, 'normal');
remove_meta_box('postcustom', $post_type, 'normal');
remove_meta_box('authordiv', $post_type, 'normal');
remove_meta_box('postexcerpt', $post_type, 'normal');
したがって、関数呼び出しはtrackbacksdiv
の外側にあり、$post_type
は定義されていないため、foreach
の仕事はしますが、残りの仕事はしません。
$post_type
をpost
に置き換えてもうまくいきます。これは、関数の引数が完全であるためです。
foreach
を{ }
で囲み、もう一度試してください。
注意してください、これは受け入れられた答えであるべきではありません、これは@ungestaltbarによって与えられた 答えへの拡張にすぎません だから、どうぞ、他の答えを受け入れてください。単に私に投票をしてください:-)
あなたの問題を解決するべき最大の問題は他の答えで議論されました、しかし私は個人的にあなたのコードが完全に最適化されていなくて不必要であると思うので、私は他の問題を指摘したいと思います。
現在のコードには、次のような問題があります。
あなたのコードはフロントエンドにロードされるすべての単一ページで不必要に実行されます。あなたは自分のコードを管理画面上、バックエンド上でのみ実行したいと思うでしょう。これには、 is_admin()
条件付きタグを使用して、管理画面にいるかどうかを確認できます。
get_post_types
getsall投稿タイプ、これは不要です。public
投稿タイプのみを取得します。
このコードをadmin( current_user_can('manage_options')
)のみ、またはadmin以外(!current_user_can('manage_options')
)だけで実行する必要がある場合は、次のように指定します。
ここで使用する適切なフェイルセーフフックは、あなたの関数をフックするための add_meta_boxes
です。これにより、すべてのメタボックスが削除される前に確実に読み込まれます。
したがって、これらすべてをまとめると、コードは次のようになります。
function remove_metabox_from_all_post_types() {
if( is_admin() && current_user_can('manage_options') ) {
$args = array(
'public' => true,
);
$output = 'names'; // names or objects, note names is the default
$operator = 'and'; // 'and' or 'or'
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
remove_meta_box('trackbacksdiv', $post_type, 'normal');
remove_meta_box('postcustom', $post_type, 'normal');
remove_meta_box('authordiv', $post_type, 'normal');
remove_meta_box('postexcerpt', $post_type, 'normal');
}
}
}
add_action('add_meta_boxes', 'remove_metabox_from_all_post_types', 999);