¿Cómo elimino todos los metaboxes para un tipo de publicación personalizada?

4

¿Cuál es una forma efectiva de eliminar todas las meta cajas para un tipo de publicación específica en Wordpress?

La única solución para eliminar metaboxes de todo lo que he encontrado parece ser la función remove_meta_box() , que requiere una identificación del metabox para ser eliminado. Podría eliminar todos los metaboxes predeterminados como este, sería un poco complicado pero no imposible o tan difícil.

Sin embargo, ¿cómo me gustaría eliminar de forma consistente los complementos de metacuadros o las funciones de temas en otros lugares? Esos son dinámicos e impredecibles, tal vez pueda obtener de manera confiable un resumen de los meta boxes para una página de edición de tipos de publicación personalizada y tal vez trabajar desde allí.

    
pregunta Megh 02.02.2015 - 15:23

3 respuestas

2

Si desea ocultar todos los metaboxes para todos los usuarios, puede hacerlo a través del filtro get_user_option_metaboxhidden_{cpt} , default_hidden_meta_boxes o hidden_meta_boxes , de acuerdo con el archivo /wp-admin/includes/screen.php .

Aquí hay un ejemplo para el tipo de publicación 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 );
    
respondido por el birgire 02.02.2015 - 16:04
1

La fuente de remove_meta_box() debería darle una idea razonable.

Los cuadros registrados se almacenan en $wp_meta_boxes global. Eliminar ese global (por ejemplo, asignando una matriz vacía) evitará que se muevan.

La única parte difícil sería averiguar el contexto y el momento correctos. Si lo haces demasiado pronto, el núcleo o algún complemento pueden agregar metaboxes después. Si lo haces demasiado tarde, algunos ya entrarán en producción.

    
respondido por el Rarst 02.02.2015 - 15:47
0

Como dijo @rarst, configurar global $wp_meta_boxes en una matriz vacía puede ser una solución.

Con respecto al problema de sincronización , el mejor lugar para restablecer la variable es justo antes de que se use. Metaboxes se imprimen a través de la función do_meta_boxes() y dentro de ella no hay ganchos, sin embargo, contiene

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

y get_user_option() activa el filtro 'get_user_option_{$option}' para que pueda usarlo para realizar su limpieza.

Algo como esto:

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

Sin embargo, el problema timing no es el único.

El otro problema es que si establece $wp_meta_boxes en una matriz vacía , se eliminarán todos los metaboxes, incluso los principales, por ejemplo. la casilla que te permite guardar la publicación.

Por lo tanto, la solución no es establecerla en una matriz vacía, sino en la matriz que contiene los cuadros que desea conservar.

Por ejemplo, para conservar solo la casilla con el botón 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'); 
});
    
respondido por el gmazzap 02.02.2015 - 19:20

Lea otras preguntas en las etiquetas