¿Deshabilitar arrastrar meta cajas?

17

¿Alguien sabe cómo deshabilitar esta funcionalidad para que los meta cuadros no se puedan reposicionar?

fxfuture
fuente

Respuestas:

13

Tuve el mismo problema, y ​​Google me llevó hasta aquí. Lamentablemente, ninguna de estas respuestas ayudó, pero finalmente descubrí la respuesta, ¡y es bastante fácil!

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

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

Esencialmente, esto simplemente deshabilita jQuery UI Sortable , que potencia la funcionalidad de arrastre de metabox ( postbox.dev.js: 64 ). Esto también cambia el cursor en el controlador de 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 valga la pena seguir algunos de los otros consejos aquí y deshabilitar el guardado del orden de metabox. Evitará la confusión en el caso de que algo se vuelva a habilitar por error.

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

Chris Van Patten
fuente
+1 menos solución sin problemas para Q, en mi humilde opinión, por supuesto. Y un montón de pesos pesados;) :::: Estoy usando solo el JS para todos, agregando $('.postbox .hndle').css('cursor','default');:::: Re: 2da edición , tendrás que seguir actualizando la Respuesta en el futuro previsible: P
brasofilo
¡Manipular el CSS desde el JS es inteligente! Agregaré eso a mi respuesta.
Chris Van Patten
Este código está funcionando con WordPress 3.9.1 actual - ¡muy bueno! :)
Philipp
4

La forma más rápida es desactivar el JS para esta función. Pero creo que es mejor cuando también cancela 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 cuadros.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
bueltge
fuente
¿Qué pasa si solo desea deshabilitar el arrastre de un metabox específico en un tipo de publicación personalizado específico?
NetConstructor.com
44
Esto funciona pero también deshabilita otras funcionalidades como el estado de la publicación
fxfuture
Creo que sí, pero no pruebo esto. Puede esconderse con el complemento Administrar como una manera fácil.
bueltge
1
¡Buena esa! ¿Cómo enviaríamos eso admin_initsolo en algún tipo de publicación específica?
brasofilo
1
parecía una solución perfecta al principio - pero por desgracia - esto también desactiva todas las funcionalidades de la adición de la categoría / taxonomía ...
ptriek
4

Yo respondí una pregunta similar con la sugerencia para permitir el arrastre, pero desactivar el ahorro de un nuevo orden 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 robusto. Este ejemplo deshabilita todo el arrastre, pero puede expandirlo para verificar 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');
   }
}
Jan Fabry
fuente
Gracias Jan: agregué esto a mis functions.php pero no hace nada.
fxfuture
@fxfuture: tonto, check_ajax_refereres una acción, no un filtro. Debería estar die()allí para finalizar la ejecución del script, no devolver nada. Arreglaré mi código.
Jan Fabry
Sí, su corrección no funciona ... O, FireFox y Chrome están almacenando en caché la página por alguna razón. : /
Zack
3

El wordpress javascript identifica los metaboxes arrastrables por su título h3 con una clase de "hndle". Es bastante simple deshabilitarlos específicamente haciendo referencia al metabox en cuestión (si está creando metaboxes personalizados, le habrá asignado un identificador) y deshabilitando cualquier clase hndle eliminando el nombre de clase o renombrándolo. 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, puede hacer lo que hice a continuación, o puede usar .find ('. Hndle'). Attr ('class', '') .... o algo similar. Esto iría en un archivo .js que 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 invocada por admin_print_scripts,

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Aryan Duntley
fuente
2

También agregaría este Javascript Hack:

<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 los meta cuadros pero sin las funciones de arrastrar y soltar y abrir / cerrar.

Maxime
fuente
Buena adición a la respuesta @bueltge (utilicé una combinación de ambas), aunque también podría omitir el bit jQuery y agregar .postbox:hover .handlediv { display:none; }CSS para ocultar el .handlediv
ptriek
0

Noté que esta pregunta no ha recibido respuesta, en la medida en que el autor de la pregunta no selecciona la respuesta correcta.

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

Por lo que yo entiendo, todo lo que quieres hacer es desactivar el arrastre, nada más. Para hacer eso, necesitará dos cosas, en primer lugar, una función para interceptar la acción de guardar ajax, pero en segundo lugar también debe detener el arrastrar y soltar JS sin eliminar la funcionalidad en cualquier otro lugar de la página, mientras que también debe hacerlo selectivamente para un tipo de publicación o metabox particular.

Usando la función de Jans y algo de jQuery, podemos hacerlo sin eliminar por completo ninguna otra funcionalidad que crea el script de buzón de correos, así ...

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

Descomente 1 de las líneas apropiadas para que la cola 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 en lo anterior

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

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

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

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

Dicho esto, se puede hacer ...

Primero, actualizarías la disable_metabox_draggingfunción 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, notando que necesita descomentar la wp_enqueue_scriptlínea correspondiente .

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

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

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 la ID de los metaboxes que desea ocultar y pasarlos a la matriz que establece los metaboxes deshabilitados (en la wp_localize_sciptllamada).

En general, no creo que la desactivación selectiva de metaboxes tenga inconvenientes, simplemente no hay soporte para reconfigurar la acción de inicio ordenable en WordPress, por lo que deshabilitar la clasificación de metabox por elemento será, en el mejor de los casos, hacky (el código anterior 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 de la casilla de correo (que hace más que simplemente configurar ordenable).

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

t31os
fuente
Nota: Este código ya no funciona con la versión actual de WordPress (3.9.1)
Philipp
0

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

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Matthew Boynes
fuente
0

Acabo de encontrar la manera simple, espero que el nuevo buscador ayude con esto. Suponiendo que pudieras agregar un archivo CSS en estilo administrador en cola, solo uso CSS para hacer eso y lo siento por mi mal inglés.

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

Espero eso ayude.

Rahendra Putra K
fuente