remove_meta_box para todos os tipos de post não parece funcionar

2

Para remover um metabox de todos os tipos de postagem de uma só vez, usar um foreach parece ser a coisa lógica a ser feita. No entanto, nem sempre funciona e não entendo o porquê.

Por exemplo, ao visualizar a postagem "Publicar", digite apenas o seguinte: 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);

Enquanto isso remove todos eles ao visualizar o tipo de postagem "Post":

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

Eu acho que get_post_types é disparado depois que os metaboxes são registrados, mas essa é a única razão pela qual eu acho que não está funcionando da primeira maneira, a menos que seja um erro de sintaxe descuidado que não estou aprendendo. Eu tentei usar o gancho do_metaboxes actions também, mas isso não fez diferença.

Alguma idéia?

    
por Bryan Willis 08.07.2014 / 21:22

2 respostas

7

Lembre-se do "Goto Fail" da Apple?

Situação semelhante:

Seu código realmente faz isso quando o recuo é corrigido:

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

Então, ele deve fazer o trabalho para trackbacksdiv , mas não para o resto porque as chamadas de função estão fora do foreach e $post_type não está definido.

Se você substituir $post_type por post , isso funciona, porque ... bem, os argumentos da função estão completos.

Quebra seu foreach em { } e tente novamente.

    
por ungestaltbar 08.07.2014 / 21:40
5

Por favor, note que esta não deve ser a resposta aceita, isto é apenas uma extensão da resposta dada por @ ungestaltbar , então por favor, @willow, aceite a outra resposta, e se você considerou minha resposta útil, simplesmente me dê um upvote: -)

A maior questão que deve resolver seu problema foi discutida na outra resposta, mas eu gostaria de destacar alguns outros problemas, já que eu pessoalmente acho que seu código não está totalmente otimizado e funcionando desnecessariamente.

Como seu código está atualmente, você tem os seguintes problemas:

  • seu código é executado em cada carregamento de página no front end, desnecessariamente. Você só deseja que seu código seja executado em uma tela de administração, back-end. Para isso, você pode usar a tag condicional is_admin() para verificar se você está em uma tela de administração

  • get_post_types obtém todos tipos de postagem, o que é desnecessário, você só deseja obter os public post types

  • Se você precisar desse código para ser executado somente por admin ( current_user_can('manage_options') ), ou não administrador ( !current_user_can('manage_options') ), você deve especificar isso

  • O gancho adequado para segurança contra falhas a ser usado aqui seria add_meta_boxes para ligar sua função a . Isso garantirá que todas as caixas meta sejam carregadas antes de serem removidas.

Então, colocando tudo isso junto, seu código deve ficar assim

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);
    
por Pieter Goosen 08.07.2014 / 23:10