Deaktivieren Sie das Ziehen von Meta-Boxen?

17

Weiß jemand, wie man diese Funktionalität deaktiviert, damit die Meta-Boxen nicht neu positioniert werden können?

fxfuture
quelle

Antworten:

13

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!

  1. Stellen Sie zunächst eine JavaScript-Datei in die Warteschlange (ich werde diesen Prozess nicht wiederholen; es gibt viele Tutorials, die diesen Prozess besser beschreiben können als ich). Ich habe mich angeschlossen admin_enqueue_scripts, und es hat gut funktioniert.
  2. 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!

Chris Van Patten
quelle
+1 weniger stressfreie Lösung für das Q, IMHO natürlich. Und viele Schwergewichte gewichtet;) :::: Ich benutze nur den JS für alle und $('.postbox .hndle').css('cursor','default');füge :::: Re: 2nd edit hinzu , du musst die Antwort in absehbarer Zeit weiter aktualisieren: P
brasofilo
Das Manipulieren des CSS vom JS aus ist clever! Ich werde das zu meiner Antwort hinzufügen.
Chris Van Patten
Dieser Code funktioniert mit aktuellem WordPress 3.9.1 - sehr schön! :)
Philipp
4

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' );
bueltge
quelle
Was ist, wenn Sie nur das Ziehen für eine bestimmte Metabox für einen bestimmten benutzerdefinierten Beitragstyp deaktivieren möchten?
NetConstructor.com
4
Dies funktioniert, aber es deaktiviert auch andere Funktionen wie den Post-Status
fxfuture 06.10.10
Ich denke ja, aber ich teste das nicht. Sie können sich mit dem Plugin Adminimize auf einfache Weise verstecken.
Bueltge
1
Schön! Wie würden wir das admin_initnur in einem bestimmten Posttyp versenden ?
Brasofilo
1
schien zunächst eine perfekte Lösung zu sein - aber leider deaktiviert dies auch alle Funktionen zum Hinzufügen von Kategorie / Taxonomie ...
Freitag,
4

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');
   }
}
Jan Fabry
quelle
Danke Jan - Ich habe dies zu meiner functions.php hinzugefügt, aber es macht nichts?
Fxfuture
@fxfuture: Blöd von mir, check_ajax_refererist eine Aktion, kein Filter. Sie sollten nur die()dort die Skriptausführung beenden und nichts zurückgeben. Ich werde meinen Code reparieren.
Jan Fabry
Ja, Ihre Korrektur funktioniert nicht. Oder, FireFox und Chrome speichern die Seite aus irgendeinem Grund im Cache. : /
Zack
3

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");
});
Aryan Duntley
quelle
2

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.

Maxime
quelle
Gute Ergänzung zu @bueltge Antwort (i verwendet eine Kombination von beiden) - obwohl Sie auch die jQuery - Bit überspringen könnte, und fügen Sie .postbox:hover .handlediv { display:none; }in CSS verstecken die .handlediv
ptriek
0

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.

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

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

jQuery / JS für die oben angegebene Javascript-Datei

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_draggingFunktion 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_scriptZeile 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_sciptAufruf).

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.

t31os
quelle
Hinweis: Dieser Code funktioniert nicht mehr mit der aktuellen Version von WordPress (3.9.1)
Philipp
0

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 postbeliebigen Beitragstyp ersetzen ):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Matthew Boynes
quelle
0

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.

Rahendra Putra K
quelle