Як встановити параметри екрана за замовчуванням?


20

Мені б хотілося, щоб можна було приховати мета-поля за допомогою параметрів екрана, замість того, щоб видаляти їх або обмежувати їх ролями користувачів, мета - просто зняти галочку з мета-поля для користувача.

Я бачу, як це було б складно, оскільки будь-який код, який змінив би базу даних для користувача, не дозволятиметься запускатися кожного разу, коли він потрапляє на сторінку, оскільки він просто скинеться. Але розумніші люди, ніж я кодую ядро, тож, можливо, є спосіб. А якщо є, я вмираю знати.

Будь-які ідеї?


За іменем користувача вам слід створити свій власний плагін, який заповнює всіх користувачів прапорець поруч із їх іменем і зачепить у фільтр для відображення метаполев або кількох метаполев.
Wyck

За замовчуванням ви маєте в виду , вони повинні застосовуватися один раз , коли створюється новий користувач, правильно?
Рарст

Відповіді:


25

Ви посилаєтесь на метабокси на екрані публікації адміністратора, чи не так?

Для цього вам не потрібен плагін, просто занесіть у файл function.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 );
    }
}

В основному, що відбувається - це те, що для користувача, який зараз увійшов у систему, ви змінюєте збережені мета-значення в таблиці wp_usermeta.

Існує два способи використання цієї функції: ви можете підключитись до 'user_register' або підключити до 'admin_init'.

Перевага використання "user_register" полягає в тому, що ця функція буде запущена лише тоді, коли зареєстрований новий користувач (таким чином, нижчі накладні витрати). Однак для користувачів, які вже існують, це не буде працювати.

Якщо ви хочете, щоб він працював для користувачів, які вже існують, тоді підключіть до 'admin_init'. Недоліком звичайно є те, що тепер ця функція спрацьовує кожного разу, коли користувач переходить на сторінку адміністратора.


15
Це не тематичне завдання і не належить до function.php.
fuxia

6
@toscho Я не дуже з цим згоден. Звичайно, ви можете помістити це в плагін, але якщо, наприклад, ви створюєте тему для себе або, можливо, для клієнта, якому не потрібно бачити певні поля, то навіщо додавати додаткові накладні витрати, які поставляються з включенням цього в плагін. Запустивши його у файл function.php, ви гарантуєте, що досвід роботи з темою є послідовним, не переконуючись, що плагін встановлений та активований.
drebabels

10
За допомогою плагіна немає накладних витрат. Це міф, який повинен вмирати миттєво. Крім того, ваше обмеження використання не було частиною питання. Вашу відповідь читають тисячі новачків. Ви допоможете їм найкращим кодом, який ви можете написати, а не тим, що спрацьовує в певних ситуаціях. :)
fuxia

+1 Хороша відповідь - іноді ви хочете встановити це чітко. Це хороша база, і, звичайно, цей код можна легко змінити, коли його потрібно викликати (наприклад, додати нового користувача), так що ви дійсно встановлюєте параметри «за замовчуванням» і не форсувати варіанти для користувачів, які їх змінюють. Я додаю цей код у functions.phpфайл своєї теми, оскільки параметри за замовчуванням призначені для конкретного проекту, який представлений / розміщений темою, яку я розробляю.
cwd

1
Через пару місяців після написання цієї відповіді фільтри додавали до ядра, роблячи цю відповідь застарілою.
WraithKenny

16

У ньому є default_hidden_meta_boxesфільтр, get_hidden_meta_boxes()який дозволяє змінювати, які не відображаються до тих пір, поки користувач не змінив свої налаштування в екрані.


7

У мене є кодові коментарі щодо трьох уже опублікованих рішень, але також загальний коментар

Вони представляють неоптимальний вибір: або скасуйте прапорець Налаштування екрана користувача; або поважайте його, але ігноруйте ваш код, якщо користувач коли-небудь міняв прапорці, навіть для інших мета-ящиків або до того, як ваш код був у WP. Здається, що шанобливий вибір корисний лише в тому випадку, якщо всі ваші користувачі новачки. Найкращим рішенням буде встановити спеціальний параметр користувача, щоб визначити, чи змінили ваші конкретні параметри meta_box користувачем, і дотримуйтесь цього. Ні, я цього коду не написав! Має бути легко ... :)

Три розміщені рішення:

1. Рішення WraithKenny - це hidden_meta_boxesрішення, яке перекриває користувацькі варіанти. Зверніть увагу, він охоплює всі типи публікацій ("повідомлення", "сторінка", "посилання", "вкладення" та будь-які спеціальні типи публікацій). Це добре, якщо ви не хочете, щоб воно було конкретним. Ви вказали пост_типи у своїх add_meta_box()дзвінках. Ви можете спробувати співставити їх або просто крилати, оскільки ті, що не відповідають, будуть ігноровані. Якщо ви хочете знати тип_файли у фільтрі, ви можете використовувати додатковий 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. Як каже Рарст, default_hidden_meta_boxesповажає користувальницькі варіанти. Як і у випадку hidden_meta_boxes, ви можете використовувати параметр $ screen для розмежування пост_типів.

3. Функція set_user_metaboxes () Drebabels також поважає параметр user_option. Зауважте, що це на екрані редагування "пост" жорстко закодовано. Щоб обробити екран редагування сторінки на сторінці та інші постіти, введіть код у цю петлю:

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

Так, get_user_metaмає бути get_user_option. Для одного сайту це не має значення, і навіть для мультисайтів це, мабуть, не має значення. Дивіться wp-admin / include / ajax-Actions.php для того, чому: update_user_optionмає глобальний параметр 'true'.


1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

Існує також hidden_meta_boxesфільтр, який "зніме" галочку з метабокса (зробивши його прихованим) при кожному завантаженні сторінки (але взагалі не доведеться оновлювати базу даних). Якщо ви просто хочете його вимкнути для нових користувачів, поки вони самі не встановлять прапорець, скористайтеся відповіддю Рарста.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.