Antworten:
Ich hatte das gleiche Problem und Google führte mich hierher. Leider hat keine dieser Antworten geholfen, aber letztendlich habe ich die Antwort herausgefunden, und es ist ganz einfach!
admin_enqueue_scripts
, und es hat gut funktioniert.Deaktivieren Sie die Sortierfunktion, indem Sie Folgendes in diese JavaScript-Datei einfügen:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
Im Wesentlichen deaktiviert dies nur jQuery UI Sortable , wodurch die Metabox-Drag-Funktionalität ( postbox.dev.js: 64 ) aktiviert wird . Dadurch wird der Cursor auf dem Metabox-Ziehpunkt auch auf einen Standard-Mauszeiger anstatt auf einen Bewegungscursor umgeschaltet (Idee mit freundlicher Genehmigung von brasofilo unten).
Hoffe das hilft!
Bearbeiten: Ich sollte hinzufügen, dass es sich wahrscheinlich lohnt, einige der anderen Ratschläge zu befolgen und das Speichern der Metabox-Bestellung zu deaktivieren. Dies verhindert Verwirrung über die Möglichkeit, dass etwas fälschlicherweise wieder aktiviert wird.
Zweite Bearbeitung: Zum Nutzen zukünftiger Generationen (und zukünftiger Google-Sucher) wurde dieses Update unter WordPress 3.3.1 getestet. Ich kann nicht mit anderen Versionen sprechen!
Der schnellste Weg ist, das JS für diese Funktion zu deaktivieren. Aber ich denke, es ist besser, wenn Sie auch den Stil für die Box abmelden und einen benutzerdefinierten Stil ohne die Auswirkungen für die Maus und das Öffnen / Schließen-Symbol auf die Meta-Boxen initiieren.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
nur in einem bestimmten Posttyp versenden ?
Ich beantwortete eine ähnliche Frage mit dem Vorschlag, das Ziehen zuzulassen, aber das Speichern der neuen Reihenfolge auf der Serverseite zu deaktivieren . Dies gibt Ihnen möglicherweise mehr Kontrolle und ist zukunftssicherer, da sich das JavaScript schnell ändern kann, das Protokoll für die Kommunikation mit dem Server jedoch möglicherweise robuster bleibt. In diesem Beispiel wird jegliches Ziehen deaktiviert. Sie können es jedoch erweitern, um nach einem bestimmten Kontrollkästchen oder einer bestimmten Metaseite zu suchen.
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
ist eine Aktion, kein Filter. Sie sollten nur die()
dort die Skriptausführung beenden und nichts zurückgeben. Ich werde meinen Code reparieren.
Das WordPress-Javascript identifiziert die ziehbaren Metaboxen anhand ihres h3-Titels mit der Klasse "hndle". Es ist einfach genug, diese zu deaktivieren, indem Sie auf die betreffende Metabox verweisen (wenn Sie benutzerdefinierte Metaboxen erstellen, haben Sie ihr einen Bezeichner zugewiesen) und alle Handle-Klassen deaktivieren, indem Sie den Klassennamen entfernen oder umbenennen. In meinem Fall habe ich mehrere Separatortypen, die ich mit .hndle h3s beschriftet habe, aber es ist unwahrscheinlich, dass jemand anderes die Dinge auf diese Weise getan hat. Sie können also tun, was ich unten getan habe, oder Sie können .find ('. Hndle'). Attr ('class', '') ... oder etwas Ähnliches verwenden. Dies würde in einer .js-Datei geschehen, die Sie in Ihrer functions.php-Datei in die Warteschlange gestellt haben (unabhängig davon, ob sie sich in Ihrem Themenordner oder in Ihrem Plug-in-Ordner befindet). Das Enqueueing würde von einem admin_print_scripts aufgerufen werden,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Ich würde auch diesen Javascript Hack hinzufügen:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... und dieses CSS:
.postbox .hndle:hover {
cursor:default;
}
Ich habe diesen Code verwendet, um die Meta-Boxen zu nutzen, aber ohne die Drag-and-Drop- und die Open / Close-Funktionen.
.postbox:hover .handlediv { display:none; }
in CSS verstecken die .handlediv
Mir ist aufgefallen, dass diese Frage unbeantwortet bleibt, sofern der Fragesteller keine richtige Antwort auswählt.
Jan gab ein funktionierendes Beispiel dafür, wie verhindert werden konnte, dass die Metabox-Nachbestellung über Ajax gespeichert wurde, während andere Vorschläge in Bezug auf das JS machten.
Soweit ich weiß, ist alles, was Sie tun möchten, das Ziehen zu deaktivieren, nichts weiter. Dazu benötigen Sie zwei Dinge, zum einen eine Funktion zum Abfangen der Ajax-Speicheraktion, zum anderen müssen Sie das Ziehen und Ablegen von JS stoppen, ohne die Funktionalität an einer anderen Stelle auf der Seite zu beeinträchtigen, und zum anderen müssen Sie dies selektiv für tun ein Beitragstyp oder eine bestimmte Metabox.
Mit der Jans-Funktion und einigen jQuery-Funktionen können wir dies tun, ohne andere Funktionen, die das Postbox-Skript erstellt, vollständig zu beeinträchtigen.
Deaktivieren Sie 1 der entsprechenden Zeilen, damit die Warteschlange funktioniert.
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;
}
Sehr einfache Abfrage, die die sortierbare Metabox-Klasse von anwendbaren Elementen entfernt, verhindert das Ziehen.
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
Wie Sie sehen, habe ich in 1 Beispiel einen Beitragstyp hinzugefügt, um den Code hinzuzufügen. Buchen Sie in diesem Fall. Sie erwähnten jedoch, dass Sie auch die Möglichkeit haben möchten, es für bestimmte Metaboxen zu deaktivieren.
Es kann getan werden, es gibt nur ein paar kleine Nebenwirkungen, darunter, dass durch Entfernen von Klassen aus bestimmten Metaboxen, um das Ziehen zu verhindern, auch die Umschaltfunktion (dh die Funktion zum Umschalten des Metaboxtitels) beeinträchtigt wird.
Das heißt, es kann getan werden ...
Zuerst würden Sie die disable_metabox_dragging
Funktion aktualisieren auf ..
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' ) );
}
Beachten Sie, dass Sie die entsprechende wp_enqueue_script
Zeile auskommentieren müssen .
Das Array innerhalb des localize-Aufrufs bestimmt, welche Metaboxen deaktiviert werden sollen. Das leere Element mit dem Schlüssel 0 ist absichtlich vorhanden, da die localize-Skriptfunktion alle Indizes mit dem Schlüssel 0 im Array entfernt.
Zweitens die neue JS-Datei, auf die in der oben beschriebenen Enqueue-Funktion verwiesen wird.
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');
} );
});
Sie müssen lediglich die ID für die Metaboxen ermitteln, die Sie ausblenden möchten, und diese an das Array übergeben, das die deaktivierten Metaboxen festlegt (im wp_localize_scipt
Aufruf).
Insgesamt glaube ich nicht, dass das selektive Deaktivieren von Metaboxen Nachteile mit sich bringt. Es gibt nur keine Unterstützung für das Neukonfigurieren der sortierbaren Init-Aktion in WordPress. Das Deaktivieren der Metabox-Sortierung auf Elementbasis ist also bestenfalls hacky (mein Code oben) Beweise dafür). Im Idealfall ist hier eine Aktion in WordPress erforderlich, um das sortierbare Init zu verknüpfen, die jedoch derzeit in das Postfach-Javascript fest codiert ist (das mehr als nur sortierbares Setup leistet).
Auf jeden Fall hoffe ich, dass dies dazu beigetragen hat, die ursprüngliche Frage zu beantworten.
Um alle vorherigen Antworten zu ergänzen und zu verhindern, dass WordPress benutzerdefinierte Positionen lädt, sollten Sie die folgenden Schritte ausführen (durch einen post
beliebigen Beitragstyp ersetzen ):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Habe gerade den einfachen Weg gefunden, hoffe neuer Sucher würde dabei helfen. Angenommen, Sie könnten eine CSS-Datei im Admin-Enqueue-Stil hinzufügen, dann verwende ich nur CSS, um dies zu tun, und entschuldige mein schlechtes Englisch.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Ich hoffe es hilft.
$('.postbox .hndle').css('cursor','default');
füge :::: Re: 2nd edit hinzu , du musst die Antwort in absehbarer Zeit weiter aktualisieren: P