Risposte:
Ho avuto lo stesso problema e Google mi ha portato qui. Sfortunatamente nessuna di queste risposte ha aiutato, ma alla fine ho capito la risposta, ed è abbastanza facile!
admin_enqueue_scripts
e ha funzionato bene.Disabilita la funzionalità di ordinamento inserendo questo nel file JavaScript:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
Fondamentalmente questo disabilita semplicemente l' interfaccia utente jQuery ordinabile , che alimenta la funzionalità di trascinamento di metabox ( postbox.dev.js: 64 ). Questo sposta anche il cursore sull'impugnatura di metabox in un puntatore del mouse standard anziché in un cursore di spostamento (idea per gentile concessione di brasofilo di seguito).
Spero che sia di aiuto!
Modifica: dovrei aggiungere che probabilmente vale la pena seguire alcuni degli altri consigli qui e disabilitare il salvataggio dell'ordine metabox. Eviterà la confusione sull'opportunità che qualcosa viene riattivato per errore.
Seconda modifica: a beneficio delle generazioni future (e dei futuri ricercatori di Google), questa correzione è stata testata su WordPress 3.3.1. Non posso parlare con altre versioni!
Il modo più veloce è disattivare JS per questa funzione. Ma penso che sia meglio quando annulli la registrazione dello stile per la casella e inizi uno stile personalizzato senza gli effetti per il mouse e l'icona apri / chiudi sulle meta-scatole.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
solo in un determinato tipo di posta?
Ho risposto a una domanda simile con il suggerimento di consentire il trascinamento, ma disabilitare il salvataggio del nuovo ordine sul lato server. Questo potrebbe darti un maggiore controllo ed essere più a prova di futuro poiché JavaScript potrebbe cambiare rapidamente, ma il protocollo per comunicare con il server potrebbe rimanere più solido. In questo esempio viene disabilitato il trascinamento, ma è possibile espanderlo per verificare la casella o la meta pagina specifica.
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
è un'azione, non un filtro. Dovresti solo die()
lì per terminare l'esecuzione dello script, non restituire nulla. Riparerò il mio codice.
Il wordpress javascript identifica i metabox trascinabili dal loro titolo h3 con una classe di "hndle". È abbastanza semplice disabilitarli specificamente facendo riferimento al metabox in questione (se si stanno creando metabox personalizzati, gli sarà stato assegnato un identificatore) e disabilitando qualsiasi classe hndle rimuovendo il nome della classe o rinominandolo. Nel mio caso, ho diversi tipi di separatori che ho etichettato con .hndle h3's, ma è improbabile che qualcun altro abbia fatto le cose in questo modo. Quindi, puoi fare quello che ho fatto di seguito, oppure puoi usare .find ('. Hndle'). Attr ('class', '') .... o qualcosa di simile. Questo andrebbe in un file .js che hai accodato nel tuo file Functions.php (sia nella cartella dei temi che nella cartella dei plugin). L'accodamento verrebbe chiamato da admin_print_scripts,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Vorrei anche aggiungere questo Hack Javascript:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... e questo CSS:
.postbox .hndle:hover {
cursor:default;
}
Ho usato quel codice per sfruttare i meta-box ma senza le funzioni di trascinamento e apertura / chiusura.
.postbox:hover .handlediv { display:none; }
CSS per nascondere il .handlediv
Ho notato che questa domanda è rimasta senza risposta, nella misura in cui il richiedente non seleziona una risposta corretta.
Jan ha fornito un esempio pratico di come impedire che il riordino del metabox venga salvato su Ajax, mentre altri hanno dato suggerimenti in merito al JS.
Per quanto ho capito, tutto quello che vuoi fare è disabilitare il trascinamento, niente di più. Per fare ciò avrai bisogno di due cose, in primo luogo una funzione per intercettare l'azione di salvataggio di ajax, ma in secondo luogo devi anche interrompere il trascinamento della selezione JS senza uccidere la funzionalità in qualsiasi altra parte della pagina, e allo stesso tempo farlo in modo selettivo per un tipo di post o metabox particolare.
Usando la funzione Jans e alcuni jQuery possiamo farlo senza uccidere totalmente altre funzionalità create dallo script Postbox, in questo modo ..
Sblocca 1 delle righe appropriate per far funzionare l'accodamento.
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 molto semplice che rimuove la classe ordinabile metabox dagli elementi appliabili, questo impedisce il trascinamento.
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
Come puoi vedere, ho aggiunto 1 tipo di post di esempio per aggiungere il codice, in questo caso prenota. Comunque hai detto di voler avere anche la possibilità di disabilitarlo per specifici metabox.
Si può fare, ci sono solo alcuni piccoli effetti collaterali di quelli che, rimuovendo le classi da determinati metabox per impedire il trascinamento, impediscono anche che la funzione di attivazione / disattivazione funzioni (ad es. Il titolo di metabox attiva la funzionalità).
Detto questo, si può fare ...
Innanzitutto, aggiorni la disable_metabox_dragging
funzione 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' ) );
}
Ancora una volta, notando che è necessario decommentare la wp_enqueue_script
riga applicabile .
L'array all'interno della chiamata localize è ciò che determina quali metabox disabilitare, l'elemento vuoto 0 con chiave è lì intenzionalmente perché la funzione di localizzazione dello script rimuove qualsiasi indice con 0 chiavi nell'array.
In secondo luogo, il nuovo file JS a cui si fa riferimento nella funzione di accodamento ottimizzata sopra.
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');
} );
});
L'unica cosa che devi fare è determinare l'ID per i metabox che vuoi nascondere e passarli nell'array che imposta i metabox disabilitati (nella wp_localize_scipt
chiamata).
Nel complesso, non credo che disabilitare selettivamente i metabox sia privo di inconvenienti, non c'è proprio alcun supporto per riconfigurare l'azione init ordinabile in WordPress, quindi disabilitare l'ordinamento metabox su una base per elemento sarà alquanto confuso (il mio codice sopra è prova di ciò). Idealmente, ciò che è necessario qui è un'azione in WordPress per agganciare init ordinabile, ma che attualmente è codificato nella javascript postbox (che fa molto di più che impostare semplicemente ordinabile).
In ogni caso, spero che ciò abbia contribuito a rispondere alla domanda originale.
Per aggiungere a tutte le risposte precedenti, se si desidera impedire a WordPress di caricare posizioni personalizzate, è necessario eseguire le operazioni seguenti (sostituire post
con qualsiasi tipo di post):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Ho appena trovato il modo semplice, spero che un nuovo ricercatore possa aiutarlo. Supponendo che tu possa aggiungere un file css in stile admin enqueue, sto solo usando css per farlo e scusami per il mio cattivo inglese.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Spero che sia d'aiuto.
$('.postbox .hndle').css('cursor','default');
:::: Ri: 2a modifica , dovrete continuare ad aggiornare la Risposta nel prossimo futuro: P