web-dev-qa-db-ja.com

カスタム投稿タイプのメタボックスをすべて削除する方法

Wordpressで特定の投稿タイプのすべてのメタボックスを削除する効果的な方法は何ですか?

私が見つけたメタボックスを削除するための唯一の解決策は remove_meta_box() 関数であるように思われます、それは削除されるメタボックスのidを必要とします。私はこのようにすべてのデフォルトメタボックスを削除することができました、それは少し手間がかかるが不可能またはそれほど難しいことではないでしょう。

しかし、他の場所でプラグインやテーマ関数を追加したメタボックスを一貫して削除するにはどうすればよいでしょうか。これらは動的で予測不可能なので、カスタム投稿タイプ編集ページのメタボックスの概要を確実に取得してそこから機能させることができるでしょうか。

4
Megh

すべてのユーザーのメタボックスを 非表示 すべてにしたい場合は、get_user_option_metaboxhidden_{cpt}ファイルに従って、default_hidden_meta_boxeshidden_meta_boxes、または/wp-admin/includes/screen.phpフィルタを使用してそれを実行できます。

これはpost投稿タイプの例です。

/**
 * Hide all metaboxes in the global $wp_meta_boxes
 */

add_filter( 'hidden_meta_boxes', function( $hidden, $screen, $use_defaults )
{
    global $wp_meta_boxes;
    $cpt = 'post'; // Modify this to your needs!

    if( $cpt === $screen->id && isset( $wp_meta_boxes[$cpt] ) )
    {
        $tmp = array();
        foreach( (array) $wp_meta_boxes[$cpt] as $context_key => $context_item )
        {
            foreach( $context_item as $priority_key => $priority_item )
            {
                foreach( $priority_item as $metabox_key => $metabox_item )
                    $tmp[] = $metabox_key;
            }
        }
        $hidden = $tmp;  // Override the current user option here.
    }
    return $hidden;
}, 10, 3 );
2
birgire

remove_meta_box()のソースはあなたに合理的なアイデアを与えるべきです。

登録されたボックスは$wp_meta_boxes globalに保存されます。 (例えば、空の配列を割り当てることによって)そのグローバルをクリアすると、それらが押しつぶされることを防ぎます。

唯一のトリッキーな部分は正しい文脈とタイミングを考え出すことでしょう。あなたがそれを早すぎるコアまたはいくつかのプラグインにした後にメタボックスを追加するかもしれません。手遅れにした場合は、すでに出力されているものもあります。

1
Rarst

@rarstが言ったように、グローバルな$wp_meta_boxesを空の配列に設定することは解決策になることができます。

timing問題に関しては、変数をリセットするのに最適な場所はそれが使用される直前です。メタボックスは do_meta_boxes() functionで表示され、その中にはフックはありませんが、それには含まれています。

get_user_option( "meta-box-order_$page" )

get_user_option() はフィルターを作動させます 'get_user_option_{$option}' あなたはそれをあなたのクリーニングを実行するために使うことができます。

このようなもの:

function remove_all_metaboxes($type) {
  add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
      global $wp_meta_boxes;
      $wp_meta_boxes[$type] = array();
      return array();
  }, PHP_INT_MAX);
}

しかし、timing問題だけが問題ではありません。

もう1つの問題は、$wp_meta_boxesを空の配列に設定すると all メタボックスが削除されることです。投稿を保存できるボックス.

そのため、解決策は、空の配列に設定するのではなく、保持したいボックスを含む配列に設定することです。

例えば。公開ボタン付きのボックスのみを保存するには、次のようにします。

function remove_all_metaboxes($type) {
  add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
      global $wp_meta_boxes;
      $publishbox = $wp_meta_boxes[$type]['side']['core']['submitdiv'];
      $wp_meta_boxes[$type] = array(
        'side' => array('core' => array('submitdiv' => $publishbox))
      );
      return array();
  }, PHP_INT_MAX);
} 

add_action('admin_init', function() {
  // replace with the slug of the post type you want to target
  remove_all_metaboxes('post'); 
});
0
gmazzap