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

20

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

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

Есть идеи?

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

Ответы:

25

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

Для этого вам не нужен плагин, просто добавьте следующее в ваш файл 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 );
    }
}

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

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

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

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

drebabels
источник
15
Это не тематическая работа и не относится к functions.php.
fuxia
6
@ toscho Я не совсем согласен с этим. Естественно, вы могли бы поместить это в плагин, но если, например, вы создаете тему для себя или, возможно, для клиента, которому не нужно видеть определенные поля, то зачем добавлять дополнительные накладные расходы на управление, связанные с включением этого в плагин. Перетаскивая его в файл functions.php, вы гарантируете согласованность работы с темой, не проверяя, установлен ли плагин и активирован ли он.
drebabels
10
Там нет накладных расходов при использовании плагина. Это миф, который должен умереть мгновенно. Плюс, ваше ограничение использования не было частью вопроса. Ваш ответ читают тысячи новичков. Вы поможете им с лучшим кодом, который вы можете написать, а не с чем-то, что вроде работает в определенных ситуациях. :)
fuxia
+1 Хороший ответ - иногда вы хотите установить это явно. Это хорошая база, и, конечно, этот код может быть легко изменен для вызова при необходимости (например, добавление нового пользователя), так что вы действительно устанавливаете параметры по умолчанию, а не заставляете параметры пользователей, которые их изменяют. Я буду добавлять этот код в functions.phpфайл моей темы, потому что параметры по умолчанию предназначены для конкретного проекта, который представлен / размещен темой, которую я разрабатываю.
cwd
1
Через пару месяцев после написания этого Ответа фильтры добавлены в ядро, что делает этот ответ устаревшим.
WraithKenny
16

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

Rarst
источник
7

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

Они представляют собой неоптимальный выбор: либо отменить выбор опции «Параметры экрана» пользователя; или уважайте его, но игнорируйте ваш код, если пользователь когда-либо изменял флажки, даже для других meta_boxes, или до того, как ваш код был в WP. Кажется, уважительный выбор полезен, только если все ваши пользователи являются новыми. Лучшим решением было бы установить пользовательскую опцию пользователя, чтобы определить, были ли ваши конкретные значения по умолчанию для meta_box изменены пользователем, и уважать это. Нет, я не написал этот код! Должно быть легко ... :)

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

1. Решение WraithKenny hidden_meta_boxesпереопределяет user_option. Обратите внимание, что он охватывает все типы сообщений («публикация», «страница», «ссылка», «вложение» и любые пользовательские типы сообщений). Это хорошо, если вы не хотите, чтобы это было конкретным. Вы указали post_type в своих add_meta_box()звонках. Вы можете попытаться сопоставить их или просто использовать, поскольку те, которые не соответствуют, будут игнорироваться. Если вы хотите узнать post_type в фильтре, вы можете использовать дополнительный 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. Как говорит Rarst, default_hidden_meta_boxesуважает user_option. Как и в случае hidden_meta_boxes, вы можете использовать параметр $ screen, чтобы различать post_types.

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

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 / includes / 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фильтр, который «снимает» метабокс (делая его скрытым) при каждой загрузке страницы (но не должен обновлять базу данных вообще). Если вы просто хотите отключить его для новых пользователей, пока они сами не установят флажок, воспользуйтесь ответом Rarst.

WraithKenny
источник