Deaktivieren Sie das Ziehen von Meta-Boxen?

Kann jemand diese functionalität deaktivieren, damit die Metaboxen nicht neu positioniert werden können?

Solutions Collecting From Web of "Deaktivieren Sie das Ziehen von Meta-Boxen?"

Ich hatte das gleiche Problem, und Google hat mich hierher geführt. Leider hat keine dieser Antworten geholfen, aber letztendlich habe ich die Antwort gefunden und es ist ganz einfach!

  1. Platzieren Sie zuerst eine JavaScript-Datei in die Warteschlange (ich werde diesen process nicht aufrüsten; es gibt viele Tutorials, die diesen process besser beschreiben können als ich). Ich admin_enqueue_scripts in admin_enqueue_scripts , und es funktionierte gut.
  2. Deaktivieren Sie die Sortierfunktion, indem Sie diese in die 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 , welches die Metabox-Drag-functionalität ( postbox.dev.js: 64 ) unterstützt. Dadurch wird auch der Cursor auf dem Metabox-Handle auf einen Standardmauszeiger anstelle eines Bewegungscursors umgeschaltet (Idee mit freundlicher Genehmigung von brasofilo unten).

Hoffe das hilft!

Edit: Ich sollte hinzufügen, dass es sich lohnt, einige der anderen Ratschläge hier zu befolgen und das Speichern der Metabox-Bestellung zu deaktivieren. Es wird Verwirrung vermeiden, wenn versehentlich etwas wieder aktiviert wird.

Zweiter Schnitt: Dieses Update wurde zum Wohle zukünftiger Generationen (und zukünftiger Google-Sucher) auf WordPress 3.3.1 getestet. Ich kann nicht mit anderen Versionen sprechen!

Der schnellste Weg ist das Deaktivieren des JS für diese function. Aber ich denke, es ist besser, wenn Sie auch den Stil für die Box abmelden und einen benutzerdefinierten Stil ohne die Effekte für die Maus und das Öffnen / Schließen-Symbol auf den Metaboxen initiieren.

 function fb_remove_postbox() { wp_deregister_script('postbox'); } add_action( 'admin_init', 'fb_remove_postbox' ); 

Ich habe eine ähnliche Frage mit dem Vorschlag beantwortet , das Ziehen zu erlauben, aber das Speichern der neuen Bestellung auf der Serverseite zu deaktivieren . Dadurch erhalten Sie möglicherweise mehr Kontrolle und sind zukunftssicherer, da sich das JavaScript schnell ändern kann. Das Protokoll für die Kommunikation mit dem Server bleibt jedoch möglicherweise robuster. In diesem Beispiel wird das Ziehen deaktiviert. Sie können es jedoch erweitern, um nach einer bestimmten Box oder Metapage 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'); } } 

Das WordPress-Javascript identifiziert die ziehbaren Metaboxen anhand ihres h3-Titels mit einer class von “hndle”. Es ist einfach genug, diese speziell zu deaktivieren, indem Sie auf die fragliche Metabox verweisen (wenn Sie benutzerdefinierte Metaboxen erstellen, haben Sie ihr einen Bezeichner zugewiesen) und alle classn deaktiviert, indem Sie den classnnamen entfernen oder umbenennen. In meinem Fall habe ich mehrere Separator-Typen, die ich mit .hndle h3s beschriftete, aber es ist unwahrscheinlich, dass jemand anderes die Dinge so gemacht 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 eine .js-Datei gehen, die Sie in Ihre functions.php-Datei eingereiht haben (egal, ob Sie sich in Ihrem Themes-Ordner oder in Ihrem Plugins-Ordner befindet). Die Enqueueing würde von einem admin_print_scripts, init oder einem anderen Hook aufgerufen werden, den Sie verwenden möchten, um Ihren Adminseiten etwas hinzuzufügen.

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

Ich würde auch diesen Javascript Hack hinzufügen:

  

… und dieses CSS:

 .postbox .hndle:hover { cursor:default; } 

Ich benutzte diesen Code, um die Meta-Boxen zu nutzen, aber ohne die Drag-and-Drop- und die Open / Close-functionen.

Ich habe bemerkt, dass diese Frage unbeantwortet bleibt, insofern der Fragesteller keine richtige Antwort auswählt.

Jan gab ein funktionierendes Beispiel, um die Metabox-Neuordnung zu stoppen, die über Ajax gespeichert wurde, während andere Vorschläge bezüglich des JS gaben.

Soweit ich es verstehe, ist alles, was Sie tun möchten, deaktivieren Ziehen, nichts mehr. Dazu benötigen Sie zwei Dinge, erstens eine function, um die Ajax-Speicheraktion abzufangen, zweitens müssen Sie auch das Ziehen und Ablegen der JS stoppen, ohne die functionalität irgendwo anders auf der Seite zu löschen, und dies auch selektiv tun ein Post-Typ oder eine bestimmte Metabox.

Mit Hilfe der Jans-function und einiger jQuery-functionen können wir das tun, ohne andere functionen zu zerstören, die das Postbox-Skript erzeugt, so …

PHP-Code für Theme-functionen Datei oder Plugin-Datei

Entfernen Sie 1 der entsprechenden Zeilen, um die Enqueue-function auszuführen.

 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 für die oben erwähnte JavaScript-Datei

Sehr einfache jQuery, die die sortierbare Metabox-class von geeigneten Elementen entfernt, dies verhindert das Ziehen.

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

Wie Sie sehen, habe ich in einem Beispiel Post-Typ hinzugefügt, um den Code hinzuzufügen, buchen Sie in diesem Fall. Sie haben jedoch erwähnt, dass Sie auch die Möglichkeit haben möchten, es für bestimmte Metaboxen zu deaktivieren.

Es kann gemacht werden, es gibt nur ein paar kleine Nebeneffekte, nämlich dass durch das Entfernen von classn aus bestimmten Metaboxen, um das Ziehen zu verhindern, verhindert wird, dass die Toggle-function funktioniert (dh die Metabox-Title Toggle-functionalität).

Das heißt, es kann getan werden …

Zuerst würden Sie die function disable_metabox_dragging auf aktualisieren.

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

Erneut müssen Sie die entsprechende Zeile wp_enqueue_script .

Das Array innerhalb des Localize-Aufrufs legt fest, welche Metaboxen deaktiviert werden sollen. Das leere 0-Schlüsselelement ist absichtlich vorhanden, da die function “Localize Script” alle 0-codierten Indizes im Array entfernt.

Zweitens, die neue JS-Datei, auf die in der obigen optimierten Enqueue-function 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 nur die ID für die Metaboxen ermitteln, die Sie ausblenden möchten, und sie an das Array übergeben, das die deaktivierten Metaboxen einstellt (im Aufruf wp_localize_scipt ).

Insgesamt denke ich nicht, dass die selektive Deaktivierung von Metaboxen keine Nachteile hat. Es gibt einfach keine Unterstützung, um die sortierbare Init-Aktion in WordPress neu zu konfigurieren. Daher ist das Deaktivieren der Metabox-Sortierung auf Elementbasis bestenfalls hacky (mein Code oben ist Beweise dafür). Idealerweise ist hier eine Aktion in WordPress erforderlich, um die sortierbare Init zu haken, aber diese ist derzeit in das Postbox-Javascript festgeschrieben (das mehr als nur das Sortieren von Sortierungen ermöglicht).

Auf jeden Fall hoffe ich, dass das geholfen hat, die ursprüngliche Frage zu beantworten.

Wenn Sie zu allen vorherigen Antworten hinzufügen möchten, wenn Sie auch verhindern möchten, dass WordPress benutzerdefinierte Positionen lädt, sollten Sie Folgendes tun (den post durch einen beliebigen Posttyp ersetzen):

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