it-swarm.com.de

Kann ich erzwingen, dass sich eine Metabox in einer Spalte befindet?

Angenommen, ich habe eine benutzerdefinierte Metabox für die Seite zum Hinzufügen/Bearbeiten von Posts erstellt, die eine große Breite hat (nicht für die Verwendung in der Seitenleiste geeignet). Es gibt eine Möglichkeit, sie nur in der mittleren Spalte zu belassen und zu sortieren, ohne dass der Benutzer sie ziehen kann zur Seitenleiste?

5
Charlie Chao

Zunächst einmal danke ich RyanLoremIpsum dafür, dass er mich in die richtige Richtung geleitet hat. Ich habe die Lösung für mein Problem gefunden, bei der die Methode aus dem von Ryan vorgeschlagenen Post verwendet wird. Metabox blockieren - Nicht erweitern, nicht verschieben und die Antwort aus jQuery-UI sortierbar - Nicht auf eine bestimmte Liste fallen lassen , um zu verhindern, dass ein bestimmtes Objekt in einen anderen Ablagebereich fällt.

Wenn Sie das Platzieren von Metaboxen in der Seitenleiste verhindern möchten, gehen Sie wie folgt vor:

  1. Fügen Sie Ihren Metabox-Elementen eine Filterklasse .no-sidebar hinzu.

    Mithilfe des Filters postbox_classes_post_METABOX_NAME können wir benutzerdefinierte Klassen einschließen, die bei ihrer Erstellung an diese bestimmte Metabox angehängt werden.

    public function my_normal_metabox( $classes ) {
        $classes[] = 'no-sidebar';
        return $classes;
    }
    add_filter( 'postbox_classes_post_my_meta_box', array( $this, 'my_normal_metabox' ) );
    
  2. Fügen Sie auf der Administrationsseite einen Fußzeilenskriptblock hinzu, um zu verhindern, dass .no-sidebar-Metaboxen in die Seitenleiste verschoben werden.

    Hier zielen wir auf den normalen Container (der die Widgets außerhalb der Seitenleiste enthält), um das jQuery UI Sortable WidgetbeforeStop -Ereignis zu binden und zu prüfen, ob es sich beim Container in der Seitenleiste um den Empfang einer .no-sidebar-Metabox handelt. Wenn ja, geben Sie false zurück, um das Löschen abzubrechen.

    function my_admin_print_footer_scripts()
    {
        ?><script type="text/javascript">/* <![CDATA[ */
            jQuery(function($) {
                $("#normal-sortables")
                    .sortable({ beforeStop: function (event, ui) { 
                        if ($("#side-sortables").find('.no-sidebar').length) {
                            // can the sort before adding the element to the sidebar
                            return false;
                        }
                    } })
                    // refresh the instance
                    .sortable('refresh');
            });
        /* ]]> */</script><?php
    }
    add_action( 'admin_print_footer_scripts', array( $this, 'my_admin_print_footer_scripts' ), 99 );
    

Diese Methode stellt sicher, dass zukünftige Metaboxen mit der Klasse no-sidebar nur im normalen Container sortiert werden können. Ein mögliches UX-Problem besteht darin, dass der Benutzer das Platzhalterfeld weiterhin sehen kann, während er die Metabox über den Seitenleistenbereich zieht. Dies könnte den Benutzer zu der Annahme verleiten, dass es ihm nicht gelungen ist, die Box beim ersten Mal zu sortieren.

3
Charlie Chao

Wenn das Meta-Feld unterhalb des Inhaltsbereichs angezeigt werden soll, verwenden Sie den Kontextparameter 'normal'. Siehe Funktionsreferenz/Meta-Box hinzufügen - Parameter . Anfänglich sollte Ihre Meta-Box nur zur Seitenleiste gehen, wenn der Kontextparameter auf "Seite" gesetzt ist.

Um es dem Benutzer unmöglich zu machen, es zur Seite zu ziehen, lesen Sie die Antwort unter " Metabox blockieren - Nicht erweitern, nicht bewegen ".

  1. Schreiben Sie eine Funktion, um dem Postfachelement, das von postbox.js verarbeitet wird, eine benutzerdefinierte Klasse hinzuzufügen.
  2. Die oben verlinkte Antwort enthält ein Skript, das das Verschieben und Sortieren aller Meta-Boxen, die Ihre benutzerdefinierte Klasse verwenden, deaktiviert.

Da Sie Ihr Meta-Postfach sortierbar machen möchten, während Sie es auf die Spalte unter dem Inhaltsbereich beschränken, können Sie feststellen, welcher Teil von postbox.js bestimmt, ob ein Postfach unter dem Inhalt oder in der Seitenleiste festgelegt ist. Es scheint, dass Sie möchten, dass es in #poststuff und nicht in # side-sortables erscheint. Ich habe im Moment kein Skript, um dies zu tun, aber hoffentlich hat dies Sie in die richtige Richtung gelenkt.

4
iyrin