Como eu removo todos os metaboxes de um tipo de postagem personalizado?

4

Qual é uma maneira eficaz de remover todas as caixas meta para um tipo de postagem específico no Wordpress?

A única solução para remover os metaboxes que encontrei parece ser a função remove_meta_box() , que requer um id do metabox a ser removido. Eu poderia remover todos os metaboxes padrão como este, seria um pouco complicado, mas não impossível ou tão difícil.

No entanto, como eu iria remover consistentemente as meta-caixas adicionadas a plugins ou funções de tema em outro lugar? Eles são dinâmicos e imprevisíveis, talvez eu possa obter um resumo das caixas meta para uma página de edição de tipos de postagem personalizada e talvez trabalhar a partir daí?

    
por Megh 02.02.2015 / 15:23

3 respostas

2

Se você quiser ocultar todos os metaboxes de todos os usuários, poderá fazer isso por meio do filtro get_user_option_metaboxhidden_{cpt} , default_hidden_meta_boxes ou hidden_meta_boxes , de acordo com o arquivo /wp-admin/includes/screen.php .

Veja um exemplo para o tipo de postagem 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 );
    
por birgire 02.02.2015 / 16:04
1

A fonte para remove_meta_box() deve dar uma ideia razoável.

As caixas registradas são armazenadas em $wp_meta_boxes global. Limpar esse global (por exemplo, atribuindo um array vazio) irá impedi-lo de empurrar.

A única parte complicada seria descobrir o contexto e o timing corretos. Se você fizer isso muito cedo núcleo ou algum plugin pode adicionar metaboxes depois. Se você fizer isso tarde demais, alguns já terão um resultado.

    
por Rarst 02.02.2015 / 15:47
0

Como @rarst disse, definir o% global$wp_meta_boxes para um array vazio pode ser uma solução.

Em relação ao problema timing , o melhor local para redefinir a variável é pouco antes de ser usado. Metaboxes são impressos através da função do_meta_boxes() e dentro dela não há ganchos, no entanto, contém

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

e get_user_option() dispara o filtro 'get_user_option_{$option}' para que você possa usá-lo para realizar sua limpeza.

Algo parecido com isto:

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

No entanto, o problema timing não é o único.

O outro problema é que, se você definir $wp_meta_boxes para uma matriz vazia, todos metabólios serão removidos, mesmo os principais, por exemplo, a caixa que permite salvar a postagem.

Portanto, a solução não é configurá-lo para uma matriz vazia, mas para a matriz que contém as caixas que você deseja preservar.

Por exemplo para preservar somente a caixa com o botão publicar, use:

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'); 
});
    
por gmazzap 02.02.2015 / 19:20