Jak ustawić domyślne opcje ekranu?

20

Chciałbym móc ukrywać meta-skrzynki za pomocą opcji ekranu, zamiast je usuwać lub ograniczać do ról użytkowników, celem jest po prostu „odznaczenie” meta-boxu dla użytkownika.

Rozumiem, że byłoby to trudne, ponieważ żaden kod, który wprowadziłby zmianę DB dla użytkownika, nie byłby uruchamiany przy każdym wejściu na stronę, ponieważ po prostu resetuje się. Ale mądrzejsi ludzie niż ja kodują rdzeń, więc może jest jakiś sposób. A jeśli tak, to umieram, żeby wiedzieć.

Jakieś pomysły?

rozwijać się
źródło
Dla każdej nazwy użytkownika musisz utworzyć własną wtyczkę, która wypełnia wszystkich użytkowników polem wyboru obok ich nazwy i łączy się z filtrem pokazującym meta-pola lub wiele meta-pól.
Wyck
Przez domyślnie znaczy powinny one być stosowane raz, gdy tworzony jest nowy użytkownik, prawda?
Rarst

Odpowiedzi:

25

Masz na myśli metaboksy na ekranie posta administratora, prawda?

Do tego nie potrzebujesz wtyczki, po prostu upuść następujące elementy w pliku 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 );
    }
}

Zasadniczo dzieje się tak, że dla aktualnie zalogowanego użytkownika zmieniasz niektóre zapisane wartości meta_wartości w tabeli wp_usermeta.

Istnieją dwa sposoby korzystania z tej funkcji: możesz podłączyć się do „user_register” lub możesz podłączyć się do „admin_init”.

Zaletą używania „user_register” jest to, że ta funkcja będzie uruchamiana tylko po zarejestrowaniu nowego użytkownika (a zatem niższe koszty ogólne). Jednak nie będzie działać dla użytkowników, którzy już istnieją.

Jeśli chcesz, aby działał dla użytkowników, którzy już istnieją, podłącz się do 'admin_init'. Wadą jest oczywiście to, że teraz ta funkcja jest uruchamiana za każdym razem, gdy użytkownik przechodzi na stronę administratora.

drebabels
źródło
15
To nie jest praca motywu i nie należy do funkcji.php.
fuxia
6
@toscho Nie zgadzam się z tym. Oczywiście możesz umieścić to we wtyczce, ale jeśli na przykład tworzysz motyw dla siebie lub być może dla klienta, który nie musi widzieć niektórych pól, to po co dodawać dodatkowe koszty zarządzania związane z włączaniem go do wtyczki. Upuszczając go do pliku functions.php, zapewniasz spójność działania motywu bez konieczności upewnienia się, że wtyczka jest zainstalowana i aktywowana.
drebabels
10
Za pomocą wtyczki nie ma narzutu. To mit, który musi natychmiast umrzeć. Ponadto ograniczenie użytkowania nie było częścią pytania. Twoja odpowiedź jest czytana przez tysiące nowicjuszy. Pomożesz im z najlepszym kodem, jaki możesz napisać, a nie z czymś, co działa w określonych sytuacjach. :)
fuxia
+1 Dobra odpowiedź - czasami chcesz to ustawić wyraźnie. Jest to dobra baza i oczywiście ten kod można łatwo zmodyfikować, aby w razie potrzeby można go było wywoływać (na przykład dodając nowego użytkownika), dzięki czemu naprawdę ustawiasz opcje „domyślne” i nie wymuszasz opcji na użytkownikach, którzy je zmieniają. Dodam ten kod do functions.phppliku mojego motywu, ponieważ domyślne opcje dotyczą konkretnego projektu, który jest reprezentowany / mieści się w opracowywanym przeze mnie motywie.
cwd
1
Kilka miesięcy po napisaniu tej odpowiedzi dodano filtry do rdzenia, dzięki czemu ta odpowiedź stała się nieaktualna.
WraithKenny
16

Istnieje default_hidden_meta_boxesfiltr, get_hidden_meta_boxes()który pozwala modyfikować, które nie są wyświetlane, dopóki użytkownik nie zmodyfikował swoich preferencji w opcjach ekranu.

Rarst
źródło
7

Mam komentarze do kodu dotyczące trzech opublikowanych już rozwiązań, ale także komentarz ogólny

Przedstawiają wybór nieoptymalny: albo przesłonić pole wyboru Opcje ekranu użytkownika; lub uszanuj go, ale zignoruj ​​kod, jeśli użytkownik kiedykolwiek zmienił pola wyboru, nawet w przypadku innych meta_box lub zanim kod był w WP. Wydaje się, że pełen szacunku wybór jest użyteczny tylko wtedy, gdy wszyscy użytkownicy są nowi. Najlepszym rozwiązaniem byłoby ustawienie niestandardowej opcji użytkownika w celu ustalenia, czy określone ustawienia domyślne meta_box zostały zmienione przez użytkownika, i przestrzeganie tego. Nie, nie napisałem tego kodu! Powinno być łatwe ... :)

Trzy opublikowane rozwiązania:

1. Rozwiązanie WraithKenny hidden_meta_boxesto takie, które zastępuje opcję user_option. Uwaga: obejmuje wszystkie typy postów („post”, „strona”, „link”, „załącznik” i wszelkie niestandardowe typy postów). W porządku, chyba że chcesz, żeby było specyficzne. Podałeś typ postu w swoich add_meta_box()połączeniach. Możesz spróbować dopasować je lub po prostu uskrzydlić, ponieważ te, które nie pasują, zostaną zignorowane. Jeśli chcesz znać typ postu w filtrze, możesz użyć dodatkowego screenparametru:

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. Jak mówi Rarst, default_hidden_meta_boxesszanuje opcję user_option. Tak jak w przypadku hidden_meta_boxes, możesz użyć parametru $ screen do rozróżnienia typów post_.

3. Funkcja set_user_metaboxes () Drebabels również uwzględnia opcję user_option. Uwaga: jest na stałe zakodowany na ekranie edycji „po”. Aby obsłużyć ekran edycji „strony” i inne typy post_, zawiń kod w tej pętli:

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

Tak, get_user_metapowinno być get_user_option. W przypadku pojedynczej witryny nie ma to znaczenia, a nawet w przypadku wielu witryn prawdopodobnie nie ma znaczenia. Zobacz wp-admin / obejmuje / ajax-Actions.php, aby dowiedzieć się, dlaczego: update_user_optionma parametr globalny „true”.

Kitchin
źródło
1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

Istnieje również hidden_meta_boxesfiltr, który „odznaczałby” metaboks (powodując, że jest ukryty) przy każdym ładowaniu strony (ale nie musiałby w ogóle aktualizować bazy danych). Jeśli chcesz tylko wyłączyć tę opcję dla nowych użytkowników, dopóki sami nie zaznaczą tego pola, skorzystaj z odpowiedzi Rarsta.

WraithKenny
źródło