¿Desactivar el arrastre de meta box?

16

¿Alguien sabe cómo deshabilitar esta funcionalidad para que las cajas de metadatos no puedan ser reposicionadas?

    
pregunta fxfuture 02.10.2010 - 00:43

8 respuestas

12

Tuve el mismo problema, y Google me guió aquí. Desafortunadamente, ninguna de estas respuestas me ayudó, pero al final encontré la respuesta, ¡y es bastante fácil!

  1. Primero, ponga en cola un archivo JavaScript (no repetiré este proceso; hay muchos tutoriales que pueden describir este proceso mejor que yo). Me enganché a admin_enqueue_scripts y funcionó bien.
  2. Deshabilite la funcionalidad de clasificación colocando esto en ese archivo JavaScript:

    jQuery(document).ready( function($) {
        $('.meta-box-sortables').sortable({
            disabled: true
        });
    
        $('.postbox .hndle').css('cursor', 'pointer');
    });
    

Esencialmente, esto solo deshabilita jQuery UI Sorable , que potencia la funcionalidad de arrastre de metabox (postbox.dev.js:64 ). Esto también cambia el cursor en el controlador metabox a un puntero de mouse estándar en lugar de un cursor de movimiento (idea cortesía de brasofilo a continuación).

Espero que esto ayude!

Editar: Debo agregar que probablemente vale la pena seguir algunos de los otros consejos que se encuentran aquí y desactivar el guardado del orden metabox. Evitará la confusión sobre la posibilidad de que algo se vuelva a habilitar por error.

Segunda edición: Para el beneficio de las generaciones futuras (y futuros buscadores de Google), esta solución se probó en WordPress 3.3.1. ¡No puedo hablar con otras versiones!

    
respondido por el Chris Van Patten 06.03.2012 - 01:41
4

La forma más rápida es desactivar JS para esta función. Pero creo que es mejor cuando también anula el registro del estilo para el cuadro e inicia un estilo personalizado sin los efectos para el mouse y el icono de abrir / cerrar en los meta boxes.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
    
respondido por el bueltge 02.10.2010 - 21:01
4

I respondió una pregunta similar con la sugerencia de permitir arrastrar, pero deshabilitar guardar el nuevo pedido en el lado del servidor. Esto podría darle más control y estar más preparado para el futuro, ya que JavaScript podría cambiar rápidamente, pero el protocolo para comunicarse con el servidor podría ser más sólido. Este ejemplo deshabilita todo el arrastre, pero puede expandirlo para buscar su cuadro o meta página específica.

add_action('check_ajax_referer', 'prevent_meta_box_order');
function prevent_meta_box_order($action)
{
   if ('meta-box-order' == $action /* && $wp_user == 'santa claus' */) {
      die('-1');
   }
}
    
respondido por el Jan Fabry 04.10.2010 - 11:44
3

El javascript de wordpress identifica los metaboxes que se pueden arrastrar por su título h3 con una clase de "hndle". Es lo suficientemente simple como para deshabilitarlos específicamente al hacer referencia al metabox en cuestión (si está creando metaboxes personalizados, le habrá asignado un identificador) y deshabilitar cualquier clase de hndle eliminando el nombre de clase o cambiándole el nombre. En mi caso, tengo varios tipos de separadores que etiqueté con .hndle h3, pero es poco probable que alguien más haya hecho las cosas de esta manera. Entonces, puedes hacer lo que hice a continuación, o puedes usar .find ('. Hndle'). Attr ('class', '') .... o algo similar. Esto iría en un archivo .js que usted puso en cola en su archivo functions.php (ya sea en su carpeta de temas o en su carpeta de complementos). La puesta en cola sería llamada por un admin_print_scripts, init o cualquier gancho que prefieras usar para agregar cosas a tus páginas de administración.

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
    
respondido por el Aryan Duntley 12.03.2013 - 16:31
2

También agregaría este Hack de Javascript:

<script type='text/javascript'>
    jQuery(document).ready(function ($) {
        $('.handlediv').remove();
    });
</script>

... y este CSS:

.postbox .hndle:hover {
    cursor:default;
}

Utilicé ese código para aprovechar las meta box pero sin las funciones de arrastrar y soltar y abrir / cerrar.

    
respondido por el Maxime 02.08.2011 - 21:34
0

Noté que esta pregunta no ha sido respondida, en la medida en que el autor de la pregunta no haya seleccionado una respuesta correcta.

Jan dio un ejemplo práctico de cómo detener el reordenamiento de metabox guardado en Ajax, mientras que otros dieron sugerencias relacionadas con el JS.

Hasta donde entiendo, todo lo que quieres hacer es desactivar el arrastre, nada más. Para hacer eso, necesitará dos cosas, primero una función para interceptar la acción de guardar ajax, pero en segundo lugar también debe detener el arrastre y la caída de JS sin matar la funcionalidad en cualquier otro lugar de la página, mientras que también debe hacerlo de forma selectiva para un tipo de publicación o metabox particular.

Usando la función de Jans y algunos jQuery, podemos hacerlo sin eliminar por completo otras funciones que crea el script de buzón de correos, como así ...

Código PHP para archivo de funciones de tema o archivo de complemento

Descomente 1 de las líneas apropiadas para hacer que la puesta en marcha funcione.

add_action( 'admin_enqueue_scripts' , 'disable_metabox_dragging' );
add_action( 'check_ajax_referer',     'disable_metabox_ordering' );

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_template_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or ncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'unsortable-meta', plugins_url( '/unsortable-metaboxes.js', __FILE__ ), array(), false );
}

function disable_metabox_ordering($action) {

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    if( 'meta-box-order' == $action )
        die;
}

jQuery / JS para el archivo Javascript al que se hace referencia anteriormente

JQuery muy básico que elimina la clase clasificable de metabox de los elementos aplicables, esto evita el arrastre.

jQuery(document).ready(function($){
    $('.meta-box-sortables').removeClass('meta-box-sortables');
});

Como puede ver, he agregado en 1 ejemplo de publicación para agregar el código, reserve en este caso. Sin embargo, usted mencionó que también desea tener la posibilidad de desactivarlo para metaboxes específicos.

Se puede hacer, hay solo algunos efectos secundarios pequeños, uno de los cuales es que al eliminar clases de metaboxes dados para evitar el arrastre, también se evita que la función de alternancia funcione (es decir, la función de alternancia de títulos de metabox).

Dicho esto, se puede hacer ...

Primero, actualizarías la función disable_metabox_dragging a ..

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    // wp_enqueue_script( 'some-unsortables', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'some-unsortables', trailingslashit( get_template_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'some-unsortables', plugins_url( '/unsortable-somemetaboxes.js', __FILE__ ), array('postbox') );

    wp_localize_script( 'some-unsortables', 'NonDragMetaboxes', array( 0 => '', 'postcustom', 'postexcerpt' ) );
}

Nuevamente, observa que debes descomentar el comentario de la línea wp_enqueue_script aplicable.

La matriz dentro de la llamada de localización es lo que determina qué metaboxes deshabilitarse, el elemento con clave 0 vacío está ahí a propósito porque la función de secuencia de comandos localize elimina cualquier índice 0 en la matriz.

En segundo lugar, el nuevo archivo JS al que se hace referencia en la función de puesta en cola modificada anteriormente.

jQuery(document).ready(function($){
    // For each item in the JS array created by the localize call
    $.each( NonDragMetaboxes, function(index,value) {

        // Remove postbox class(disables drag) and add stuffbox class(styling is close to the original)
        $( '#' + value ).removeClass('postbox').addClass('stuffbox');

        // Remove redundant handle div
        if( $( '#' + value ).has('.handlediv') )
            $( '#' + value ).children('.handlediv').remove();

        // Remove redundant cursor effect on hover
        if( $( '#' + value ).has('h3') )
            $( '#' + value ).children('h3').css('cursor','default');
    } );
});

Lo único que necesita hacer es determinar el ID para los metaboxes que desea ocultar y pasarlos a la matriz que establece los metaboxes deshabilitados (en la llamada wp_localize_scipt ).

En general, no creo que deshabilitar metaboxes de forma selectiva tenga pocos inconvenientes, simplemente no hay soporte para volver a configurar la acción de inicio ordenable en WordPress, por lo que deshabilitar la clasificación de metabox por elemento será un poco arrogante (mi el código de arriba es evidencia de eso). Idealmente, lo que se necesita aquí es una acción en WordPress para enganchar el inicio ordenable, pero actualmente está codificado en el javascript del buzón (que hace más que solo configurar el orden).

En cualquier caso, espero que haya ayudado a abordar la pregunta original.

    
respondido por el t31os 03.08.2011 - 17:11
0

Para agregar a todas las respuestas anteriores, si también desea evitar que WordPress cargue posiciones personalizadas, lo siguiente debería hacer el truco (reemplazar post con cualquier tipo de publicación):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
    
respondido por el Matthew Boynes 23.03.2016 - 21:10
0

Acabo de encontrar la forma simple, espero que el nuevo buscador ayude con esto. Suponiendo que pueda agregar un archivo css en el estilo de puesta en cola del administrador, solo uso css para hacerlo y perdón por mi mal inglés.

.postbox#your-metabox-id .ui-sortable-handle {
    pointer-events: none;
}

Espero que ayude.

    
respondido por el Rahendra Putra K 06.10.2018 - 13:43

Lea otras preguntas en las etiquetas