Disabilitare il trascinamento di meta box?


17

Qualcuno sa come disabilitare questa funzionalità in modo che i meta box non possano essere riposizionati?

Risposte:


13

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!

  1. Innanzitutto, accoda un file JavaScript (non ripeterò questo processo; ci sono molti tutorial che possono descrivere questo processo meglio di me). Mi sono agganciato admin_enqueue_scriptse ha funzionato bene.
  2. 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!


+1 soluzione senza problemi in meno per Q, IMHO ovviamente. E molti pesi massimi ponderati;) :::: Sto usando solo il JS per tutti, aggiungendo $('.postbox .hndle').css('cursor','default');:::: Ri: 2a modifica , dovrete continuare ad aggiornare la Risposta nel prossimo futuro: P
brasofilo,

Manipolare il CSS dal JS è intelligente! Lo aggiungerò alla mia risposta.
Chris Van Patten,

Questo codice funziona con l'attuale WordPress 3.9.1 - molto bello! :)
Philipp,

4

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

che dire se vuoi solo disabilitare il trascinamento per un metabox specifico su un tipo di post personalizzato specifico?
NetConstructor.com il

4
Funziona ma disabilita anche altre funzionalità come lo stato dei post
fxfuture,

Penso di si, ma non lo provo. Puoi nascondere con il plug-in Adminimize come un modo semplice.
bueltge

1
Ben fatto! Come lo spediremmo admin_initsolo in un determinato tipo di posta?
brasofilo,

1
all'inizio sembrava una soluzione perfetta - ma purtroppo - questo disabilita anche tutte le funzionalità per l'aggiunta di categoria / tassonomia ...
ptriek

4

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

Grazie Jan - L'ho aggiunto al mio Functions.php ma non fa nulla?
fxfuture,

@fxfuture: Silly me, 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.
Jan Fabry,

Sì, la tua correzione non funziona ... Oppure, FireFox e Chrome stanno memorizzando nella cache la pagina per qualche motivo. : /
Zack

3

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

2

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.


Buona aggiunta alla risposta @bueltge (ho usato una combinazione di entrambi) - anche se potresti anche saltare il bit jQuery e aggiungere .postbox:hover .handlediv { display:none; }CSS per nascondere il .handlediv
ptriek

0

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 ..

Codice PHP per file di funzioni del tema o file plugin

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 / JS per il file Javascript indicato in precedenza

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_draggingfunzione 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_scriptriga 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_sciptchiamata).

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.


Nota: questo codice non funziona più con la versione corrente di WordPress (3.9.1)
Philipp

0

Per aggiungere a tutte le risposte precedenti, se si desidera impedire a WordPress di caricare posizioni personalizzate, è necessario eseguire le operazioni seguenti (sostituire postcon qualsiasi tipo di post):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.