Come impostare le opzioni dello schermo predefinite?


20

Mi piacerebbe poter nascondere le meta-box usando le opzioni dello schermo, invece di rimuoverle o limitarle ai ruoli dell'utente, l'obiettivo è semplicemente "deselezionare" la meta-box per l'utente.

Vedo come sarebbe complicato dato che qualsiasi codice che avrebbe apportato una modifica al DB per un utente non avrebbe potuto essere eseguito ogni volta che accedeva alla pagina perché si sarebbe semplicemente resettato. Ma le persone più intelligenti di me codificano il nucleo, quindi forse c'è un modo. E se c'è, muoio dalla voglia di sapere.

Qualche idea?


Per nome utente dovresti creare il tuo plugin di sorta che popola tutti gli utenti con una casella di controllo accanto al loro nome e si aggancia in un filtro per mostrare meta box o più meta box.
Wyck,

Di default intendi che dovrebbero essere applicati una volta quando viene creato un nuovo utente, giusto?
Rarst

Risposte:


25

Ti riferisci ai metabox nella schermata dei post dell'amministratore giusto?

Per questo non hai bisogno di un plug-in, basta inserire quanto segue nel tuo file Functions.php.

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

Fondamentalmente ciò che sta accadendo è che per l'utente attualmente connesso, si stanno modificando alcuni meta_valori salvati nella tabella wp_usermeta.

Esistono due modi per utilizzare questa funzione, è possibile collegarsi a "user_register" oppure agganciare a "admin_init".

Il vantaggio di usare 'user_register' è che questa funzione si attiverà solo quando viene registrato un nuovo utente (quindi un overhead inferiore). Tuttavia, non funzionerà per gli utenti che già esistono.

Se vuoi che funzioni per gli utenti che già esistono, aggancia "admin_init". Lo svantaggio ovviamente è che ora questa funzione viene attivata ogni volta che un utente accede alla pagina di amministrazione.


15
Questo non è un lavoro a tema e non appartiene a un function.php.
fuxia

6
@toscho Non sono davvero d'accordo. Naturalmente potresti metterlo in un plugin, ma se per esempio stai costruendo un tema per te stesso o forse per un cliente che non ha bisogno di vedere determinate caselle, allora perché aggiungere l'overhead di gestione aggiuntivo che viene fornito includendo questo in un plugin. Rilasciandolo nel file Functions.php si garantisce che l'esperienza per il tema sia coerente senza che sia necessario assicurarsi che un plugin sia installato e attivato.
drebabels,

10
Non vi è alcun sovraccarico utilizzando un plug-in. Questo è un mito che deve morire all'istante. Inoltre, la limitazione dell'utilizzo non faceva parte della domanda. La tua risposta è letta da migliaia di novizi. Li aiuterai con il miglior codice che puoi scrivere, non con qualcosa che funziona in alcune situazioni specifiche. :)
fuxia

+1 Buona risposta - a volte vuoi impostarle in modo esplicito. È una buona base, e ovviamente questo codice può essere modificato facilmente per essere chiamato quando necessario (aggiungendo un nuovo utente, ad esempio), in modo da impostare davvero le opzioni "predefinite" e non forzare le opzioni sugli utenti che le cambiano. Aggiungerò questo codice al functions.phpfile del mio tema perché le opzioni predefinite sono per un progetto specifico, che è rappresentato / ospitato dal tema che sto sviluppando.
Cwd,

1
Un paio di mesi dopo che questa risposta è stata scritta, i filtri sono stati aggiunti al core rendendo questa risposta obsoleta.
WraithKenny,

16

C'è un default_hidden_meta_boxesfiltro get_hidden_meta_boxes()che permette di modificare che non sono mostrati fintanto che l'utente non ha modificato le sue preferenze nelle opzioni dello schermo.


7

Ho commenti in codice su tre soluzioni già pubblicate, ma anche un commento generale

Presentano una scelta non ottimale: sovrascrivere la scelta della casella di controllo Opzioni schermo dell'utente; o rispettalo ma fai ignorare il tuo codice se l'utente ha mai cambiato le caselle di controllo, anche per altre meta_box, o prima che il tuo codice fosse in WP. Sembra che la scelta rispettosa sia utile solo se tutti i tuoi utenti sono nuovi. La soluzione migliore sarebbe quella di impostare un'opzione utente personalizzata per determinare se le impostazioni predefinite specifiche della meta_box sono state modificate dall'utente e rispettarle. No, non ho scritto quel codice! Dovrebbe essere facile ... :)

Le tre soluzioni pubblicate:

1. La hidden_meta_boxessoluzione di WraithKenny è quella che sostituisce l'opzione_utente. Nota che copre tutti i tipi di post ("post", "pagina", "link", "allegato" e tutti i tipi di post personalizzati). Va bene se non vuoi che sia specifico. Hai specificato post_type nelle tue add_meta_box()chiamate. Puoi provare ad abbinarli o semplicemente ad ala poiché quelli che non corrispondono verranno ignorati. Se vuoi conoscere il post_type nel filtro, puoi usare il screenparametro extra :

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. Come dice Rarst, default_hidden_meta_boxesrispetta l'opzione_utente. Come per hidden_meta_boxes, puoi usare il parametro $ screen per distinguere post_types.

3. La funzione set_user_metaboxes () di Drebabels rispetta anche l'opzione_utente. Nota che è hardcoded per la schermata di modifica 'post'. Per gestire la schermata di modifica della "pagina" e altri post_types, avvolgi il codice in questo loop:

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

Sì, get_user_metadovrebbe essere get_user_option. Per il sito singolo non importa, e probabilmente anche per il sito multiplo. Vedi wp-admin / Includes / ajax-actions.php per il motivo: update_user_optionha il parametro globale "vero".


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

C'è anche un hidden_meta_boxesfiltro che "deselezionerebbe" il metabox (rendendolo nascosto) ad ogni caricamento della pagina (ma non dovrebbe aggiornare affatto il database). Se lo desideri solo per i nuovi utenti fino a quando non selezionano la casella, usa la risposta di Rarst.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.