Benutzerdefinierte Metaboxen standardmäßig reduzieren

7

Ich habe einige benutzerdefinierte Metaboxen für meinen Post-Write-Bildschirm erstellt. Gibt es eine Möglichkeit, einige von ihnen standardmäßig reduziert anzuzeigen?

Nur für den Fall, dass ich nicht die richtigen Begriffe verwende oder in meiner Frage nicht klar bin, werde ich Folgendes erläutern:

Die Metaboxen auf dem Post-Write-Bildschirm haben einen Kippschalter in der oberen rechten Ecke des Felds. Wenn Sie mit der Maus über diesen Bereich fahren, wird ein kleiner Abwärtspfeil und die Worte "Zum Umschalten klicken" angezeigt. Wenn Sie darauf klicken, wird die Metabox ausgeblendet, der Inhalt wird ausgeblendet und nur die Titelleiste der Metabox angezeigt. Ich spreche nicht von den Bildschirmoptionen, durch die die gesamten Metaboxen verschwinden (nur für das angegebene Konto). Ich möchte nur, dass bestimmte Metaboxen standardmäßig für alle WP-Benutzer im reduzierten Modus angezeigt werden.

AKTUALISIEREN:

Nachdem ich in Hakres Antwort gelesen hatte, dass der Umschaltstatus für den Benutzer gespeichert ist, wollte ich einige Erläuterungen dazu hinzufügen, wie es funktionieren soll. Ich bin mir nicht sicher, ob dies möglich ist, aber ich möchte, dass die Metaboxen standardmäßig reduziert werden, wenn der Beitrag neu ist. Wenn der Benutzer sie erweitert, sollten sie erweitert werden. Ich möchte jedoch, dass diese Einstellungen für den jeweiligen Beitrag lokal bleiben. Wenn sie also einen neuen Beitrag erstellen, werden alle Metaboxen reduziert.

matt
quelle

Antworten:

7

Um eine Metabox anzuzeigen, die standardmäßig reduziert oder geschlossen ist, ist es gut zu wissen, dass sie durch Hinzufügen closedzu ihrem Klassenattribut geschlossen angezeigt wird. Alle closedHauptdivs der Meta-Boxen, deren Klassenname enthalten ist, werden in geschlossener Form angezeigt.

Wenn Sie auf den Pfeil klicken, wird er entfernt oder hinzugefügt (umgeschaltet). Dies erfolgt interaktiv auf der Post-Editor-Seite. Das closedmanuelle Hinzufügen des Klassennamens funktioniert nur, wenn Sie dies in Ihrem Browser mit einem Entwicklertool wie Firebug oder ähnlichem tun.

Da Wordpress normalerweise den Status des Umschaltstatus jeder Metabox verfolgt, sollten Sie darauf achten, den Umschaltstatus nur so einzustellen, dass er beim ersten Besuch eines bestimmten Benutzers im Editor oder beim Hinzufügen zu Benutzern geschlossen wird.

Die Daten, welche dieser Metaboxen geschlossen sind, werden in den Benutzeroptionen gespeichert. Jedes Mal, wenn Sie ein Feld umschalten, wird eine Ajax-Anforderung angezeigt, in der es gespeichert wird:

update_user_option($user->ID, "closedpostboxes_$page", $closed, true);

$closedist eine durch Kommas getrennte Liste aller Metabox-IDs, die geschlossen sind. $pageist für den Post-Editor (den, nach dem Sie gefragt haben) auf "post" gesetzt. Wenn also ein neuer Benutzer erstellt wird (oder das Plugin für alle vorhandenen Benutzer installiert ist), können Sie diese Einstellung mit der ID Ihrer Metabox erweitern. Dies sollte den Job machen.

Das einzige, was Sie wissen müssen, ist die ID Ihrer Metabox, aber ich bin mir ziemlich sicher, dass Sie diese bereits kennen. Wenn nicht, überprüfen Sie Ihren Code, in dem Sie die Metabox registrieren.

Zusätzlich können Sie neben den geschlossenen auch diejenigen festlegen, die übrigens ausgeblendet sind und den Kontrollkästchen entsprechen. hiddenpostboxes_$pageDann ist es die Option.

Aktualisieren

Ein Code zum Hinzufügen der Option wurde abgeschnitten:

function collapseBoxForUser($userId, $page, $boxId) {
    $optionName = "closedpostboxes_$page";
    $close = get_user_option($optionName, $userId);
    $closeIds = explode(',', $close);
    $closeIds[] = $boxId;
    $closeIds = array_unique($clodeIds); // remove duplicate Ids
    $close = implode(',', $closeIds);
    update_user_option($userId, $optionName, $close);
}

Rufen Sie diese Funktion einfach mit den richtigen Werten auf und sie fügt Ihre boxId in den Wert ein. Wenn der Editor das nächste Mal diesen Wert für den Bildschirm lädt (z. B. über eine Ajax-Anforderung), sollte dieses Feld geschlossen angezeigt werden.

hakre
quelle
Ich habe versucht, 'class' => "geschlossen" in das Array einzufügen, das die Metaboxen einrichtet, aber sie werden standardmäßig erweitert und die Klasse wird auf "Postfach" gesetzt, obwohl ich keine Ahnung habe, wo das gesetzt ist. Außerdem habe ich meiner Frage ein Update hinzugefügt.
Matt
@matt - das sollte erklären, wie das auf der Seite funktioniert, wenn alle Skripte funktionieren usw. - so informativ, nicht als Lösung. Stellen Sie stattdessen die Option für den Benutzer ein, der Rest sollte nur für Sie funktionieren.
hakre
Nur zur Verdeutlichung werde ich "update_user_option ($ user-> ID," closedpostboxes_ $ page ", $ closed, true) setzen." mit dem Code zum Erstellen meiner Metabox. Muss ich etwas durch die Metabox-ID ersetzen?
Matt
@matt: Ich habe ein Codefragment hinzugefügt, das es klarer machen soll. Wissen Sie, wo Sie Ihre MetaboxID finden? Wenn Sie sich die HTML-Quelle ansehen, sollten Sie sie für Ihre Box identifizieren können. Andernfalls fügen Sie die Codezeile hinzu, in der Sie Ihre Metabox registrieren.
hakre
@matt: und denken Sie daran, dies nur einmal pro Benutzer aufzurufen (nicht einmal jedes Mal, wenn Sie die Metabox erstellen), da sonst das Feld immer geschlossen angezeigt wird.
hakre
6

Eine andere Möglichkeit, dies zu tun, besteht darin, den Hook in get_user_option zu verwenden:

function closed_meta_boxes( $closed ) {
    if ( false === $closed )
        $closed = array( 'submitdiv', 'postcustom', 'anothermetaboxid' );

    return $closed;
}
add_filter( 'get_user_option_closedpostboxes_{post_type_slug}', 'closed_meta_boxes' );
sorich87
quelle
Das sieht vielversprechend aus, aber kann mir jemand einen Link geben, über den ich weitere Informationen zum Filter 'get_user_option_closedpostboxes_ {post_type_slug}' finden kann? Und / oder lassen Sie uns wissen, wofür die Zeichenfolge 'anothermetaboxid' ist? Danke. :)
Ban-Geoengineering
Sie können auch in Betracht ziehen, die Zeile "if (false === $ closed)" in "if (leer ($ geschlossen))" zu ändern, da $ geschlossen bei meinen Tests ein leeres Array ist.
Ban-Geoengineering
1

Sie können sich in den Benutzerregister-Hook einbinden und die Postfachstatusänderungen anwenden. Diese werden dann einfach ausgeführt, wenn ein neuer Benutzer erstellt wird.

add_action( 'user_register', 'set_user_closedboxes' );
function set_user_closedboxes( $uid ) {
    update_user_meta( $uid, 'closedpostboxes_{type}',array('submitdiv','postcustom'));
}

Wo {type}sollte Ihr anwendbarer Beitragstyp sein, und das Array sollte IDs der auszublendenden Felder enthalten (submitdiv und postcustom sind zwei Beispiele).

Sie müssen eine Abfrage schreiben, wenn Sie vorhandene Benutzer aktualisieren möchten. Die oben genannten sollten jedoch neu erstellte / registrierte Benutzer abdecken.

Code ist ungetestet, aber ich sehe keinen Grund, warum es nicht funktionieren sollte. Melden Sie sich zurück, wenn Probleme auftreten.

Ich hoffe, das hilft..

t31os
quelle
Bitte nehmen Sie am Chat teil.
hakre
Scheint, als hätte ich den Chat leider verpasst ... irgendwelche Kommentare zu meinem obigen Vorschlag, sich an die Registrierung / Erstellung neuer Benutzer zu binden?
t31os
1
funktioniert gut für mich. Vergessen Sie nicht, {type} durch den Slug des Post-Typs zu ersetzen, den Sie ansprechen (Post, Seite, benutzerdefinierter Post-Typ usw.)
somatisch