Respuestas:
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!
admin_enqueue_scripts
y funcionó bien.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!
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' );
admin_init
solo en algún tipo de publicación específica?
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');
}
}
check_ajax_referer
es 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.
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");
});
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.
.postbox:hover .handlediv { display:none; }
CSS para ocultar el .handlediv
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í ...
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 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_dragging
funció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_script
lí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_scipt
llamada).
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.
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 post
con cualquier tipo de publicación):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
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.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2da edición , tendrás que seguir actualizando la Respuesta en el futuro previsible: P