Come impostare le opzioni di visualizzazione predefinite?
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?

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.

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

@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.

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. :)

+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.

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:).

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

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ì.

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.

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'.

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.
