web-dev-qa-db-ja.com

すべての投稿タイプのremove_meta_boxが機能していないようです

すべての投稿タイプからメタボックスを一度に削除するには、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アクションフックも使ってみましたが、違いはありませんでした。

何か案は?

2
Bryan Willis

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_typepostに置き換えてもうまくいきます。これは、関数の引数が完全であるためです。

foreach{ }で囲み、もう一度試してください。

7
ungestaltbar

注意してください、これは受け入れられた答えであるべきではありません、これは@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);
5
Pieter Goosen