remove_meta_box para todos los tipos de publicaciones no parece funcionar

2

Para eliminar un metabox de todos los tipos de publicaciones a la vez, usar foreach parece ser lo más lógico. Sin embargo, no siempre funciona y no entiendo por qué.

Para ver el ejemplo del tipo de publicación "Publicar", lo siguiente solo elimina el 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);

Aunque esto elimina todos ellos al ver el tipo de publicación "Publicar":

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

Creo que get_post_types se activa después de que se registran los metaboxes, pero esa es la única razón por la que puedo suponer que no funciona de la primera manera, a menos que sea un error de sintaxis descuidado que no estoy detectando. Intenté usar el gancho do_metaboxes actions también pero no hizo una diferencia.

¿Alguna idea?

    
pregunta Bryan Willis 08.07.2014 - 21:22

2 respuestas

7

¿Recuerdas el "Goto Fail" de Apple?

Situación similar:

Su código realmente hace esto, cuando se corrige la sangría:

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

Por lo tanto, debería hacer el trabajo para trackbacksdiv , pero no para el resto porque las llamadas a funciones están fuera de foreach y no se ha definido $post_type .

Si reemplaza $post_type con post , funciona, porque ... bueno, los argumentos de la función están completos.

Envuelve tu foreach en { } y vuelve a intentarlo.

    
respondido por el ungestaltbar 08.07.2014 - 21:40
5

Tenga en cuenta que esta no debe ser la respuesta aceptada, esta es solo una extensión de la respuesta a dada por @ ungestaltbar , así que, por favor, @willow, acepte la otra respuesta, y si considera que mi respuesta es útil, simplemente avíseme :-)

El problema más importante que debería resolver su problema se ha analizado en la otra respuesta, pero me gustaría señalar algunos otros problemas, ya que personalmente creo que su código no está totalmente optimizado y no se está ejecutando de forma necesaria.

Como su código se encuentra actualmente, tiene los siguientes problemas:

  • su código se ejecuta en cada carga de una sola página en el extremo frontal, innecesariamente. Solo desearía que su código se ejecute en una pantalla de administración, back end. Para esto, puede usar la etiqueta condicional is_admin() para verificar si está en una pantalla de administrador

  • get_post_types obtiene todos tipos de publicación, lo cual no es necesario, solo quiero obtener los tipos de publicación public

  • Si necesita que este código se ejecute solo para admin ( current_user_can('manage_options') ), o no administrador ( !current_user_can('manage_options') ), debe especificar esto

  • El gancho de seguridad adecuado para usar aquí sería add_meta_boxes para enganchar su función a . Esto asegurará que todas las cajas meta se carguen antes de eliminarlas.

Entonces, al juntar todo esto, su código debería tener este aspecto

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

Lea otras preguntas en las etiquetas