Cum se setează opțiunile implicite ale ecranului?

22 apr. 2011, 05:18:33
Vizualizări: 37.2K
Voturi: 27

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?

2
Comentarii

Pentru fiecare nume de utilizator, ar trebui să creezi un fel de plugin personalizat care să adauge un checkbox lângă numele fiecărui utilizator și să se conecteze la un filtru pentru afișarea metadatelor (meta boxes) sau a mai multor metadate.

Wyck Wyck
22 apr. 2011 07:07:00

Prin implicit te referi că acestea ar trebui aplicate o singură dată când un nou utilizator este creat, corect?

Rarst Rarst
22 apr. 2011 14:43:01
Toate răspunsurile la întrebare 4
7
25

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.

14 iun. 2011 11:32:34
Comentarii

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

fuxia fuxia
14 iun. 2011 16:05:25

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

drebabels drebabels
29 iun. 2011 15:32:41

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

fuxia fuxia
29 iun. 2011 20:15:09

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

cwd cwd
3 nov. 2011 16:54:34

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

brasofilo brasofilo
5 mai 2012 15:48:38

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.

WraithKenny WraithKenny
1 mar. 2013 19:05:44

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.

squarecandy squarecandy
30 nov. 2016 20:34:19
Arată celelalte 2 comentarii
0
19

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.

24 aug. 2011 18:22:37
0

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

23 iun. 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;
}

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.

1 mar. 2013 19:00:54