Wie stelle ich die Standard-Bildschirmoptionen ein?

20

Ich würde gerne in der Lage sein, Meta-Boxen mithilfe von Bildschirmoptionen auszublenden, anstatt sie zu entfernen oder auf Benutzerrollen zu beschränken. Das Ziel ist es, die Meta-Box für den Benutzer nur zu deaktivieren.

Ich sehe, wie schwierig dies wäre, da jeder Code, der eine DB-Änderung für einen Benutzer bewirken würde, nicht jedes Mal ausgeführt werden darf, wenn er auf die Seite gelangt, da er nur zurückgesetzt wird. Aber klügere Leute, als ich den Kern codiere, vielleicht gibt es einen Weg. Und wenn ja, dann möchte ich es unbedingt wissen.

Irgendwelche Ideen?

Developdaly
quelle
Pro Benutzername müssten Sie eine Art eigenes Plugin erstellen, das alle Benutzer mit einem Kontrollkästchen neben ihrem Namen ausfüllt und einen Filter zum Anzeigen von Meta-Boxen oder mehreren Meta-Boxen einbindet.
Wyck
Mit dem Standard meinen Sie sollten sie einmal angewendet werden , wenn neue Benutzer erstellt wird, richtig?
Rarst

Antworten:

25

Sie beziehen sich auf die Metaboxen auf dem Admin-Post-Bildschirm, oder?

Dafür brauchst du kein Plugin, lege einfach folgendes in deine functions.php-Datei.

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

Grundsätzlich passiert, dass Sie für den aktuell angemeldeten Benutzer einige gespeicherte Metawerte in der Tabelle wp_usermeta ändern.

Es gibt zwei Möglichkeiten, diese Funktion zu verwenden: Sie können sich entweder in 'user_register' oder in 'admin_init' einbinden.

Der Vorteil der Verwendung von 'user_register' besteht darin, dass diese Funktion nur ausgelöst wird, wenn ein neuer Benutzer registriert wird (daher geringerer Overhead). Es funktioniert jedoch nicht für Benutzer, die bereits vorhanden sind.

Wenn Sie möchten, dass es für Benutzer funktioniert, die bereits existieren, schließen Sie 'admin_init' an. Der Nachteil ist natürlich, dass diese Funktion jetzt jedes Mal ausgelöst wird, wenn ein Benutzer die Admin-Seite aufruft.

drebabels
quelle
15
Dies ist kein Theme Job und gehört nicht in eine functions.php.
fuxia
6
@toscho Dem stimme ich nicht wirklich zu. Natürlich können Sie dies in ein Plugin einfügen, aber wenn Sie beispielsweise ein Thema für sich selbst oder für einen Client erstellen, der bestimmte Felder nicht sehen muss, warum dann den zusätzlichen Verwaltungsaufwand, der mit dem Einfügen dieses Themas in ein Plugin verbunden ist, hinzufügen? Durch Ablegen in der Datei functions.php stellen Sie sicher, dass das Erlebnis für das Thema konsistent ist, ohne sicherstellen zu müssen, dass ein Plugin installiert und aktiviert ist.
Drebabels
10
Durch die Verwendung eines Plugins entsteht kein Overhead. Das ist ein Mythos, der sofort sterben muss. Außerdem war Ihre Nutzungsbeschränkung nicht Teil der Frage. Ihre Antwort wird von Tausenden von Neulingen gelesen. Sie helfen ihnen mit dem besten Code, den Sie schreiben können, und nicht mit etwas, das in bestimmten Situationen funktioniert. :)
fuxia
+1 Gute Antwort - manchmal möchten Sie diese explizit festlegen. Es ist eine gute Basis, und natürlich kann dieser Code leicht geändert werden, um bei Bedarf aufgerufen zu werden (z. B. Hinzufügen eines neuen Benutzers), sodass Sie wirklich die "Standard" -Optionen festlegen und keine Optionen für Benutzer erzwingen, die sie ändern. Ich werde diesen Code in die functions.phpDatei meines Themas einfügen, da die Standardoptionen für ein bestimmtes Projekt gelten, das durch das von mir entwickelte Thema dargestellt wird.
KWD
1
Ein paar Monate nachdem diese Antwort geschrieben wurde, wurden Filter zum Kern hinzugefügt, was diese Antwort obsolet machte.
WraithKenny
16

Es gibt einen default_hidden_meta_boxesFilter get_hidden_meta_boxes(), mit dem Sie Änderungen vornehmen können, die nicht angezeigt werden, solange der Benutzer seine Einstellungen in den Bildschirmoptionen nicht geändert hat.

Rarst
quelle
7

Ich habe Codekommentare zu drei bereits veröffentlichten Lösungen, aber auch einen allgemeinen Kommentar

Sie bieten eine suboptimale Auswahl: entweder die Auswahl der Bildschirmoptionen des Benutzers überschreiben; oder respektiere es, aber lasse deinen Code ignorieren, wenn der Benutzer jemals die Kontrollkästchen geändert hat, auch für andere meta_boxes oder bevor dein Code in WP war. Scheint, die respektvolle Wahl ist nur sinnvoll, wenn alle Ihre Benutzer neu sind. Die beste Lösung wäre, eine benutzerdefinierte Benutzeroption festzulegen, um festzustellen, ob Ihre spezifischen meta_box-Standardeinstellungen vom Benutzer geändert wurden, und dies zu respektieren. Nein, ich habe diesen Code nicht geschrieben! Sollte einfach sein ... :)

Die drei Lösungen veröffentlicht:

1. Die hidden_meta_boxesLösung von WraithKenny überschreibt die user_option. Beachten Sie, dass alle Beitragstypen ("Beitrag", "Seite", "Link", "Anhang" und alle benutzerdefinierten Beitragstypen) abgedeckt werden. Das ist in Ordnung, es sei denn, Sie möchten, dass es spezifisch ist. Sie haben den post_type in Ihren add_meta_box()Aufrufen angegeben. Sie können versuchen, diese zu finden, oder es einfach nur versuchen, da diejenigen, die nicht passen, ignoriert werden. Wenn Sie den post_type im Filter wissen möchten, können Sie den zusätzlichen screenParameter verwenden:

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. Respektiert, wie Rarst sagt, default_hidden_meta_boxesdie user_option. Wie bei hidden_meta_boxeskönnen Sie den Parameter $ screen verwenden, um post_types zu unterscheiden.

3. Die set_user_metaboxes () -Funktion von Drebabels berücksichtigt auch die user_option. Beachten Sie, dass es für den Bearbeitungsbildschirm "Post" fest programmiert ist. Um den Bearbeitungsbildschirm 'Seite' und andere post_types zu handhaben, schließen Sie den Code in diese Schleife ein:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

Ja, get_user_metasollte sein get_user_option. Für einzelne Standorte spielt es keine Rolle, und selbst für mehrere Standorte ist dies wahrscheinlich nicht der Fall. Siehe wp-admin / includes / ajax-actions.php für den Grund: Hat update_user_optionden globalen Parameter 'true'.

kitchin
quelle
1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

Es gibt auch hidden_meta_boxesFilter, die die Metabox bei jedem Laden der Seite "deaktivieren" (verbergen) (aber die Datenbank überhaupt nicht aktualisieren müssen). Wenn Sie es nur für neue Benutzer deaktivieren möchten, bis sie das Kontrollkästchen selbst aktivieren, verwenden Sie die Antwort von Rarst.

WraithKenny
quelle