Come impostare le opzioni di visualizzazione predefinite?

22 apr 2011, 05:18:33
Visualizzazioni: 37.2K
Voti: 27

Mi piacerebbe poter nascondere le meta box utilizzando le opzioni di visualizzazione, invece di rimuoverle o limitarle ai ruoli utente. L'obiettivo è semplicemente "deselezionare" la meta box per l'utente.

Capisco che questo potrebbe essere complicato poiché qualsiasi codice che apporterebbe una modifica al database per un utente non potrebbe essere eseguito ogni volta che accedono alla pagina perché si resetterebbe semplicemente. Ma le persone più esperte di me hanno programmato il core, quindi forse c'è un modo. E se esiste, sono ansioso di scoprirlo.

Qualche idea?

2
Commenti

Per il nome utente dovresti creare un tuo plugin personalizzato che mostri tutti gli utenti con una casella di spunta accanto al nome e si colleghi a un filtro per visualizzare le meta box, o più meta box.

Wyck Wyck
22 apr 2011 07:07:00

Con default intendi che dovrebbero essere applicati una sola volta quando viene creato un nuovo utente, corretto?

Rarst Rarst
22 apr 2011 14:43:01
Tutte le risposte alla domanda 4
7
25

Ti riferisci ai metabox nella schermata di amministrazione degli articoli, giusto?

Per quello non hai bisogno di un plugin, basta inserire il seguente codice 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) {

    // Queste sono le metachiavi che dovremo aggiornare
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // Questo permette di usare la funzione senza agganciarla a user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Imposta l'ordine predefinito se non è ancora stato impostato
    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 );
    }

    // Imposta i metabox nascosti predefiniti se non sono ancora stati impostati
    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 );
    }
}

Sostanzialmente ciò che succede è che per l'utente attualmente loggato, vengono modificati alcuni meta_values salvati nella tabella wp_usermeta.

Ci sono due modi per usare questa funzione: puoi agganciarla a 'user_register' oppure a 'admin_init'.

Il vantaggio di usare 'user_register' è che questa funzione verrà eseguita solo quando viene registrato un nuovo utente (quindi minore overhead). Tuttavia non funzionerà per utenti già esistenti.

Se vuoi che funzioni per utenti già esistenti, allora agganciala a 'admin_init'. Lo svantaggio ovviamente è che ora questa funzione verrà eseguita ogni volta che un utente accede alla pagina di amministrazione.

14 giu 2011 11:32:34
Commenti

Questo non è un lavoro per un tema e non dovrebbe stare in un functions.php.

fuxia fuxia
14 giu 2011 16:05:25

@toscho Non sono completamente d'accordo. Naturalmente potresti metterlo in un plugin, ma se ad esempio stai costruendo un tema per te stesso o per un cliente che non ha bisogno di vedere certe scatole, perché aggiungere il sovraccarico di gestione che deriva dall'includerlo in un plugin? Inserendolo nel file functions.php garantisci che l'esperienza con il tema sia coerente senza dover assicurare che un plugin sia installato e attivato.

drebabels drebabels
29 giu 2011 15:32:41

Non c'è alcun sovraccarico nell'usare un plugin. Questo è un mito che deve morire all'istante. Inoltre, la tua restrizione d'uso non faceva parte della domanda. La tua risposta viene letta da migliaia di principianti. Li aiuterai con il miglior codice che puoi scrivere, non con qualcosa che funziona solo in alcune situazioni specifiche. :)

fuxia fuxia
29 giu 2011 20:15:09

+1 Risposta valida - a volte è effettivamente utile impostare questi valori esplicitamente. Rappresenta una buona base, e ovviamente questo codice può essere facilmente modificato per essere richiamato quando necessario (ad esempio aggiungendo un nuovo utente), in modo da impostare veramente le opzioni "predefinite" senza forzare le opzioni per gli utenti che le modificano. Aggiungerò questo codice al file functions.php del mio tema poiché le opzioni predefinite sono per un progetto specifico, che viene rappresentato/gestito dal tema che sto sviluppando.

cwd cwd
3 nov 2011 16:54:34

Le persone vogliono che i loro shortcode continuino a funzionare anche se cambiano tema? Lo stesso vale per questo tipo di funzione... Inoltre, inserisco il plugin nella cartella mu-plugins, così non può essere disabilitato facilmente dal cliente (funziona anche per installazioni singole di WP:).

brasofilo brasofilo
5 mag 2012 15:48:38

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

WraithKenny WraithKenny
1 mar 2013 19:05:44

Penso che @toscho abbia ragione nel contesto della creazione di temi e plugin robusti per una distribuzione ampia. Tuttavia, è importante considerare che oltre a migliaia di principianti che cercano di modificare temi predefiniti, ci sono anche molti sviluppatori che creano temi personalizzati da zero per un singolo cliente destinati a funzionare in un singolo contesto. A volte in quel caso hai funzionalità di amministrazione che sono intrinsecamente legate al tema personalizzato. Non sembra la peggiore idea includerle nel codice del tema se è così.

squarecandy squarecandy
30 nov 2016 20:34:19
Mostra i restanti 2 commenti
0
19

Esiste il filtro default_hidden_meta_boxes in get_hidden_meta_boxes() che permette di modificare quali meta box non vengono mostrati, purché l'utente non abbia modificato le sue preferenze nelle opzioni dello schermo.

24 ago 2011 18:22:37
0

Ho dei commenti sul codice riguardo alle tre soluzioni già pubblicate, ma anche un commento generale

Presentano una scelta non ottimale: o sovrascrivere la scelta dell'utente nelle Opzioni Schermo; o rispettarla ma avere il proprio codice ignorato se l'utente ha mai modificato le caselle, anche per altri 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 impostare un'opzione utente personalizzata per determinare se i valori predefiniti del tuo specifico meta_box sono stati modificati dall'utente, e rispettare quello. No, non ho scritto quel codice! Dovrebbe essere facile... :)

Le tre soluzioni pubblicate:

1. La soluzione hidden_meta_boxes di WraithKenny è quella che sovrascrive la user_option. Nota che copre tutti i tipi di post ('post', 'page', 'link', 'attachment', e qualsiasi custom post type). Va bene a meno che non si voglia essere specifici. Hai specificato i post_type nelle tue chiamate add_meta_box(). Puoi provare a farli corrispondere, o semplicemente lasciar perdere poiché quelli che non corrispondono verranno ignorati. Se vuoi conoscere il post_type nel filtro, puoi usare il parametro extra screen:

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', e qualsiasi custom post type
        // $hidden[]= 'foo_box_id';
        // /oppure/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. Come dice Rarst, default_hidden_meta_boxes rispetta la user_option. Come con hidden_meta_boxes, puoi usare il parametro $screen per distinguere i post_type.

3. La funzione set_user_metaboxes() di Drebabels rispetta anch'essa la user_option. Nota che è hard-coded per la schermata di modifica 'post'. Per gestire la schermata di modifica 'page' e altri post_type, avvolgi il codice in questo loop:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // aggiungi qui eventuali custom post type:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // Questi sono i metakey che dovremo aggiornare
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // Il resto è lo stesso codice di drebabels,
       // con '*_user_meta()' cambiato in '*_user_option()'

       // Così può essere usato senza hook su user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Imposta l'ordine predefinito se non è ancora stato impostato
       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 );
       }

       // Imposta i predefiniti nascosti se non sono ancora stati impostati
       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_meta dovrebbe essere get_user_option. Per single-site non importa, e anche per multi-site probabilmente no. Vedi wp-admin/includes/ajax-actions.php per il motivo: update_user_option ha il parametro globale 'true'.

23 giu 2013 14:11:41
0
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

Esiste anche il filtro hidden_meta_boxes che "deselezionerebbe" il metabox (rendendolo nascosto) ad ogni caricamento della pagina (senza dover aggiornare il database). Se vuoi che sia disattivato solo per i nuovi utenti finché non selezionano manualmente la casella, utilizza la risposta di Rarst.

1 mar 2013 19:00:54