Cum se setează opțiunile implicite ale ecranului?
Mi-ar plăcea să pot ascunde meta box-urile folosind opțiunile de ecran, în loc să le elimin sau să le restricționez la rolurile utilizatorilor, scopul fiind doar să "debifez" meta box-ul pentru utilizator.
Înțeleg că acest lucru ar fi dificil deoarece orice cod care ar face o modificare în baza de date pentru un utilizator nu ar putea fi rulat de fiecare dată când accesează pagina, pentru că s-ar reseta. Dar dezvoltatorii core-ului sunt mai pricepuți decât mine, așa că poate există o modalitate. Și dacă există, sunt nerăbdător să aflu.
Aveți idei?

Te referi la metabox-urile din ecranul de administrare al articolelor, corect?
Pentru asta nu ai nevoie de un plugin, doar adaugă următorul cod în fișierul functions.php.
// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {
// Acestea sunt cheile meta pe care va trebui să le actualizăm
$meta_key['order'] = 'meta-box-order_post';
$meta_key['hidden'] = 'metaboxhidden_post';
// Astfel poate fi folosit fără a fi legat de user_register
if ( ! $user_id)
$user_id = get_current_user_id();
// Setează ordinea implicită dacă nu a fost setată încă
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 );
}
// Setează elementele ascunse implicite dacă nu au fost setate încă
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 );
}
}
Practic, ceea ce se întâmplă este că pentru utilizatorul curent autentificat, modifici niște valori meta salvate în tabelul wp_usermeta.
Există două modalități de a folosi această funcție: poți să o legi fie de 'user_register', fie de 'admin_init'.
Avantajul folosirii 'user_register' este că această funcție se va executa doar când un nou utilizator este înregistrat (deci overhead mai mic). Totuși, nu va funcționa pentru utilizatorii care există deja.
Dacă vrei să funcționeze pentru utilizatorii existenți, atunci leag-o de 'admin_init'. Dezavantajul este că acum funcția se va executa de fiecare dată când un utilizator accesează pagina de administrare.

Aceasta nu este o sarcină pentru teme și nu ar trebui să fie plasată în fișierul functions.php.

@toscho Nu sunt de acord cu asta. Desigur, ai putea pune acest cod într-un plugin, dar dacă, de exemplu, construiești o temă pentru tine sau pentru un client care nu are nevoie să vadă anumite casete, de ce să adaugi suprasolicitarea administrativă care vine cu includerea acestuia într-un plugin? Prin plasarea lui în fișierul functions.php, te asiguri că experiența pentru temă este consistentă fără a fi nevoie să verifici dacă un plugin este instalat și activat.

Nu există suprasolicitare prin utilizarea unui plugin. Acesta este un mit care trebuie să dispară imediat. În plus, restricția ta de utilizare nu făcea parte din întrebare. Răspunsul tău este citit de mii de începători. Îi vei ajuta cu cel mai bun cod pe care îl poți scrie, nu cu ceva care funcționează într-un fel doar în anumite situații specifice. :)

+1 Răspuns bun - uneori chiar vrei să setezi aceste opțiuni explicit. Este o bază bună, iar acest cod poate fi ușor modificat pentru a fi apelat atunci când este necesar (de exemplu, la adăugarea unui nou utilizator), astfel încât să setezi cu adevărat opțiunile "implicite" și nu să forțezi opțiuni asupra utilizatorilor care le schimbă. Voi adăuga acest cod în fișierul functions.php
al temei mele, deoarece opțiunile implicite sunt pentru un proiect specific, care este reprezentat/găzduit de tema pe care o dezvolt.

Oamenii doresc ca shortcode-urile lor să continue să funcționeze chiar dacă schimbă temele? Același lucru se aplică și acestui tip de funcție... Mai mult, am plasat plugin-ul în folderul mu-plugins
, astfel încât clientul să nu-l poată dezactiva ușor (acest lucru funcționează și pentru instalările WP single:).

La câteva luni după ce acest Răspuns a fost scris, au fost adăugate filtre în nucleu, făcând acest răspuns inutilizabil.

Cred că @toscho are dreptate în contextul construirii de teme și plugin-uri robuste pentru distribuție largă. Cu toate acestea, este important să luăm în considerare faptul că, pe lângă mii de începători care încearcă să modifice teme preconstruite, există și mulți dezvoltatori care creează teme personalizate de la zero pentru un singur client, destinate să funcționeze într-un singur context. Uneori, în acest caz, ai funcționalități de administrare care sunt strâns legate de tema personalizată. Nu pare cea mai proastă idee să le incluzi în codul temei dacă acesta este cazul.

Există filtrul default_hidden_meta_boxes
în get_hidden_meta_boxes()
care permite modificarea cutiilor meta care nu sunt afișate, atâta timp cât utilizatorul nu și-a modificat preferințele în opțiunile ecranului.

Am comentarii despre cele trei soluții deja postate, dar și un comentariu general
Ele prezintă o alegere suboptimă: fie suprascriu alegerea utilizatorului din caseta de selectare Screen Options; fie o respectă, dar codul tău este ignorat dacă utilizatorul a modificat vreodată casetele de selectare, chiar și pentru alte meta_boxes, sau înainte ca codul tău să fie în WP. Se pare că alegerea respectuoasă este utilă doar dacă toți utilizatorii tăi sunt noi. Cea mai bună soluție ar fi să setezi o opțiune personalizată pentru utilizator pentru a determina dacă impliciturile meta_box tale specifice au fost modificate de utilizator și să le respecți. Nu, nu am scris acel cod! Ar trebui să fie ușor... :)
Cele trei soluții postate:
1. Soluția lui WraithKenny cu hidden_meta_boxes
este cea care suprascrie user_option. Reține că acoperă toate tipurile de postări ('post', 'page', 'link', 'attachment' și orice tipuri personalizate de postări). Este în regulă, cu excepția cazului în care vrei să fie specifică. Ai specificat tipurile de postări în apelurile tale add_meta_box()
. Poți încerca să le potrivești sau să încerci la nimereală, deoarece cele care nu se potrivesc vor fi ignorate. Dacă vrei să știi tipul de postare în filtru, poți folosi parametrul suplimentar 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', and any custom post types
// $hidden[]= 'foo_box_id';
// /or/
// $hidden= array_diff($hidden, array('foo_box_id'));
}
return $hidden;
}
2. După cum spune Rarst, default_hidden_meta_boxes
respectă user_option. La fel ca la hidden_meta_boxes
, poți folosi parametrul $screen pentru a distinge tipurile de postări.
3. Funcția set_user_metaboxes() a lui Drebabels respectă și ea user_option. Reține că este hard-codată pentru ecranul de editare 'post'. Pentru a gestiona ecranul de editare 'page' și alte tipuri de postări, înfășoară codul în această buclă:
function set_user_metaboxes($user_id=NULL) {
$post_types= array( 'post', 'page', 'link', 'attachment' );
// adaugă orice tipuri personalizate de postări aici:
// $post_types[]= 'my_custom_post_type';
foreach ($post_types as $post_type) {
// Acestea sunt metacheile pe care va trebui să le actualizăm
$meta_key= array(
'order' => "meta-box-order_$post_type",
'hidden' => "metaboxhidden_$post_type",
);
// Restul este la fel ca codul lui drebabels,
// cu '*_user_meta()' schimbat în '*_user_option()'
// Astfel, poate fi folosită fără a fi conectată la user_register
if ( ! $user_id)
$user_id = get_current_user_id();
// Setează ordinea implicită dacă nu a fost setată încă
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 );
}
// Setează cele implicite ascunse dacă nu au fost setate încă
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 );
}
}
}
Da, get_user_meta
ar trebui să fie get_user_option
. Pentru site-uri single nu contează, iar chiar și pentru multi-site probabil că nu. Vezi wp-admin/includes/ajax-actions.php pentru motivul: update_user_option
are parametrul global 'true'.

add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
$hidden[] = 'your_metabox';
return $hidden;
}
Există și filtrul hidden_meta_boxes
care va "debifa" metabox-ul (făcându-l invizibil) la fiecare încărcare de pagină (fără a fi necesară actualizarea bazei de date). Dacă doriți să fie dezactivat doar pentru utilizatorii noi până când îl activează manual, folosiți soluția lui Rarst.
