Как установить параметры экрана по умолчанию?

22 апр. 2011 г., 05:18:33
Просмотры: 37.2K
Голосов: 27

Я хотел бы иметь возможность скрывать мета-боксы с помощью параметров экрана, вместо их удаления или ограничения для определенных ролей пользователей. Цель состоит в том, чтобы просто "снять галочку" с мета-бокса для пользователя.

Я понимаю, что это может быть сложно, поскольку любой код, который вносит изменения в базу данных для пользователя, не должен выполняться каждый раз при загрузке страницы, так как это приведет к сбросу настроек. Но разработчики ядра WordPress умнее меня, так что, возможно, есть способ. И если он существует, я очень хочу его узнать.

Есть какие-нибудь идеи?

2
Комментарии

Для каждого имени пользователя вам придется создать собственный плагин, который добавляет флажок рядом с именем каждого пользователя и интегрируется с фильтром для отображения метабоксов или нескольких метабоксов.

Wyck Wyck
22 апр. 2011 г. 07:07:00

Под по умолчанию вы подразумеваете, что они должны применяться один раз при создании нового пользователя, верно?

Rarst Rarst
22 апр. 2011 г. 14:43:01
Все ответы на вопрос 4
7
25

Вы имеете в виду метабоксы на экране редактирования записи в админке, верно?

Для этого не нужен плагин, просто добавьте следующий код в файл functions.php.

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // Это мета-ключи, которые нам нужно обновить
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // Позволяет использовать функцию без хука user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Устанавливаем порядок по умолчанию, если он еще не задан
    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 );
    }

    // Устанавливаем скрытые метабоксы по умолчанию, если они еще не заданы
    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 );
    }
}

По сути, этот код изменяет сохраненные meta_values в таблице wp_usermeta для текущего авторизованного пользователя.

Есть два способа использовать эту функцию: можно подключиться к хуку 'user_register' или к хуку 'admin_init'.

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

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

14 июн. 2011 г. 11:32:34
Комментарии

Это не задача для темы и не должна помещаться в functions.php.

fuxia fuxia
14 июн. 2011 г. 16:05:25

@toscho Я не совсем согласен с этим. Конечно, можно поместить это в плагин, но если, например, вы создаёте тему для себя или клиента, которому не нужно видеть определённые блоки, зачем добавлять дополнительные сложности управления, связанные с включением этого в плагин? Разместив код в файле functions.php, вы гарантируете единообразие работы темы без необходимости следить за установкой и активацией плагина.

drebabels drebabels
29 июн. 2011 г. 15:32:41

Использование плагина не создаёт дополнительной нагрузки. Это миф, который нужно развеять немедленно. Кроме того, ограничения вашего сценария использования не были частью вопроса. Ваш ответ читают тысячи новичков. Вы поможете им, предоставив лучший код, который можете написать, а не тем, что работает лишь в некоторых специфических ситуациях. :)

fuxia fuxia
29 июн. 2011 г. 20:15:09

+1 Хороший ответ - иногда действительно нужно явно задать эти параметры. Это хорошая база, и конечно, этот код можно легко модифицировать для вызова при необходимости (например, при добавлении нового пользователя), так что вы действительно устанавливаете "умолчательные" настройки, а не навязываете их пользователям, которые их меняют. Я добавлю этот код в файл functions.php своей темы, так как стандартные настройки предназначены для конкретного проекта, который представлен/реализован в разрабатываемой мной теме.

cwd cwd
3 нояб. 2011 г. 16:54:34

Хотят ли люди, чтобы их шорткоды продолжали работать даже после смены темы? То же самое касается этого типа функций... Более того, я помещаю плагин в папку mu-plugins, чтобы клиент не мог его легко отключить (это работает и для одиночных установок WP).

brasofilo brasofilo
5 мая 2012 г. 15:48:38

Через пару месяцев после написания этого ответа в ядро были добавлены фильтры, сделавшие этот ответ устаревшим.

WraithKenny WraithKenny
1 мар. 2013 г. 19:05:44

Я считаю, что @toscho прав в контексте создания надежных тем и плагинов для широкого распространения. Однако важно учитывать, что помимо тысяч новичков, пытающихся модифицировать готовые темы, есть также множество разработчиков, создающих индивидуальные темы с нуля для одного клиента, предназначенные для работы в конкретном контексте. Иногда в таком случае у вас есть функции админки, которые неразрывно связаны с кастомной темой. Включение их в код темы не кажется худшей идеей, если это так.

squarecandy squarecandy
30 нояб. 2016 г. 20:34:19
Показать остальные 2 комментариев
0
19

В WordPress существует фильтр default_hidden_meta_boxes в функции get_hidden_meta_boxes(), который позволяет изменять метабоксы, скрытые по умолчанию, пока пользователь не изменил свои предпочтения в настройках экрана.

24 авг. 2011 г. 18:22:37
0

У меня есть комментарии к коду по трём уже опубликованным решениям, а также общий комментарий.

Они представляют неоптимальный выбор: либо переопределить выбор пользователя в настройках экрана (Screen Options), либо уважать его, но тогда ваш код будет игнорироваться, если пользователь когда-либо изменял эти настройки, даже для других метабоксов или до того, как ваш код появился в WordPress. Кажется, уважительный вариант полезен только если все ваши пользователи новые. Лучшим решением было бы установить пользовательскую опцию для определения, были ли изменены настройки по умолчанию именно для вашего метабокса, и учитывать это. Нет, я ещё не написал такой код! Должно быть просто... :)

Три опубликованных решения:

1. Решение WraithKenny с фильтром hidden_meta_boxes переопределяет user_option. Обратите внимание, что оно применяется ко всем типам записей ('post', 'page', 'link', 'attachment' и любым пользовательским типам). Это нормально, если вам не нужна специфичность. Вы указывали типы записей в своих вызовах 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' и любые пользовательские типы записей
        // $hidden[]= 'foo_box_id';
        // /или/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. Как говорит Rarst, фильтр default_hidden_meta_boxes учитывает user_option. Как и с hidden_meta_boxes, вы можете использовать параметр $screen для различия типов записей.

3. Функция set_user_metaboxes() от Drebabels также учитывает user_option. Обратите внимание, она жёстко закодирована для экрана редактирования 'post'. Для обработки экранов 'page' и других типов записей оберните код в этот цикл:

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // добавьте любые пользовательские типы записей здесь:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // Это мета-ключи, которые нам нужно обновить
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // Остальное совпадает с кодом drebabels,
       // с заменой '*_user_meta()' на '*_user_option()'

       // Чтобы можно было использовать без хука user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Устанавливаем порядок по умолчанию, если он ещё не задан
       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 );
       }

       // Устанавливаем скрытые по умолчанию, если они ещё не заданы
       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/includes/ajax-actions.php для понимания почему: update_user_option имеет глобальный параметр 'true'.

23 июн. 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;
}

Также существует фильтр hidden_meta_boxes, который будет "снимать галочку" с метабокса (делая его скрытым) при каждой загрузке страницы (но без необходимости обновлять базу данных). Если вы хотите, чтобы он был выключен только для новых пользователей до тех пор, пока они сами не поставят галочку, используйте решение Rarst.

1 мар. 2013 г. 19:00:54