Установка настроек экрана администратора и порядка метабоксов по умолчанию

6 сент. 2010 г., 02:44:19
Просмотры: 21.5K
Голосов: 31

Я отчаянно ищу способ (любой способ) установить параметры "настроек экрана" и порядок метабоксов по умолчанию через файл functions.php. Может кто-нибудь помочь с этим вопросом?

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

Обновление 2014: Для тех, кому нужно просто изменить порядок метабоксов, см. ответ Nabil ниже.

rinogo rinogo
11 авг. 2017 г. 00:10:34
Все ответы на вопрос 3
13
25

Настройка порядка метабоксов на страницах редактирования записей

Вам потребуется удалить метабоксы и добавить их снова в нужном вам порядке.

Для отключения метабоксов: (настройте под свои нужды, посмотрите id метабокса в HTML-коде, чтобы узнать, какое имя использовать в качестве первого параметра функций)

function my_remove_meta_boxes() {

    remove_meta_box('postcustom', 'post', 'core');

    remove_meta_box('commentsdiv', 'post', 'core');

    ...
}

add_action( 'admin_menu', 'my_remove_meta_boxes' );

После их удаления вы можете использовать функцию add_meta_box, чтобы добавить их в новые позиции: http://codex.wordpress.org/Function_Reference/add_meta_box. Порядок метабоксов зависит от порядка вызова функции add_meta_box. Например: с помощью следующего фрагмента кода метабокс комментариев будет расположен перед метабоксом пользовательских полей.

function my_add_meta_boxes( $post_type, $post ) {
    if ( ('publish' == $post->post_status || 'private' == $post->post_status) && post_type_supports($post_type, 'comments') )
        add_meta_box('commentsdiv', __('Комментарии'), 'post_comment_meta_box', $post_type, 'normal', 'core');

    if ( post_type_supports($post_type, 'custom-fields') )
        add_meta_box('postcustom', __('Пользовательские поля'), 'post_custom_meta_box', $post_type, 'normal', 'core');

    ...
}

add_action( 'add_meta_boxes', 'my_add_meta_boxes' );

Возможно, вам будет полезно посмотреть файл wp-admin/edit-form-advanced.php

Настройка отображаемых колонок на странице списка записей

Вам нужно использовать фильтр manage_{$post_type}_posts_columns. Например: следующий фрагмент кода удалит колонку комментариев.

function my_remove_columns( $posts_columns ) {
    unset( $posts_columns['comments'] );

    return $posts_columns;
}

add_filter( 'manage_post_posts_columns', 'my_remove_columns' );

Настройка количества результатов по умолчанию на странице списка записей

Используйте фильтры 'edit_{$post_type}_per_page' и 'edit_posts_per_page'.

function my_edit_post_per_page( $per_page, $post_type ) {

    $edit_per_page = 'edit_' . $post_type . '_per_page';
    $per_page = (int) get_user_option( $edit_per_page );
    if ( empty( $per_page ) || $per_page < 1 )
        $per_page = 1;

    return $per_page;
}

add_filter( 'edit_posts_per_page', 'my_edit_post_per_page' );

Для настройки конкретного типа записи:

  • используйте add_filter( 'edit_{post type}_per_page', 'my_edit_post_per_page' ); например add_filter( 'edit_post_per_page', 'my_edit_post_per_page' ); для записей, add_filter( 'edit_page_per_page', 'my_edit_post_per_page' ); для страниц.

  • или используйте условие внутри вашей функции. Например:

    function my_edit_post_per_page( $per_page, $post_type ) {

    if( $post_type == 'post' ) {
        $edit_per_page = 'edit_' . $post_type . '_per_page';
        $per_page = (int) get_user_option( $edit_per_page );
        if ( empty( $per_page ) || $per_page < 1 )
            $per_page = 1;
    }
    
    return $per_page;
    
6 сент. 2010 г. 11:02:57
Комментарии

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

NetConstructor.com NetConstructor.com
6 сент. 2010 г. 11:13:16

то есть технически это не один вопрос, а целых два вопроса?

Tom J Nowell Tom J Nowell
6 сент. 2010 г. 11:18:16

Я обновил свой ответ. Дайте знать, если нужно больше деталей.

sorich87 sorich87
6 сент. 2010 г. 11:41:46

@sorich87 спасибо за ваш ответ, однако, насколько я помню, не было возможности точно указать порядок каждого метабокса, или я ошибаюсь? Возможно, мне стоит быть немного более конкретным. По сути, я ищу различные фрагменты кода, которые позволят мне предустановить различные настройки для всех пользователей без необходимости входа в каждую учетную запись. Примеры: установка точного порядка метабоксов на страницах редактирования записей, настройка отображаемых колонок на странице списка записей, установка количества результатов по умолчанию на странице списка записей... и тому подобное. Заранее спасибо.

NetConstructor.com NetConstructor.com
7 сент. 2010 г. 07:41:29

Я обновил свой ответ.

sorich87 sorich87
7 сент. 2010 г. 10:17:53

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

NetConstructor.com NetConstructor.com
7 сент. 2010 г. 14:26:59

Извините, в коде была ошибка. Я его исправил. Обратите внимание на параметр $post_type, который позволяет указать конкретный тип записи.

sorich87 sorich87
7 сент. 2010 г. 15:59:46

@sorich87 ваш код работает, но теперь, если пользователь изменит настройки экрана, чтобы отображать другое значение, страница будет показывать только значение, заданное через файл функций. Мне нужно было установить параметры по умолчанию, но если пользователь вручную изменит настройки экрана, должны отображаться его собственные настройки.

NetConstructor.com NetConstructor.com
9 сент. 2010 г. 01:49:05

@sorich87 и еще... как мне установить настройки только для одного конкретного типа записи, не затрагивая остальные?

NetConstructor.com NetConstructor.com
9 сент. 2010 г. 01:49:30

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

NetConstructor.com NetConstructor.com
10 сент. 2010 г. 09:48:21

Я добавил новые примеры.

sorich87 sorich87
12 сент. 2010 г. 15:24:12

еще один пример, пожалуйста. Допустим, у вас есть 5 пользовательских типов записей. Теперь предположим, что для post_type1 вы хотите установить значение в 5 записей, для post_type2 установить значение в 2 записи, а для всех остальных установить значение по умолчанию в 10 записей. Не могли бы вы показать, как будет выглядеть этот код? Также, есть ли возможность установить эти значения как значения по умолчанию, если только пользователь не установит значение вручную. Если да, то как можно принудительно установить значение, которое пользователь не сможет изменить? И наконец, когда вы выбираете "настройки экрана", это значение не обновляется/не отражает значение, которое фактически отображается.

NetConstructor.com NetConstructor.com
12 сент. 2010 г. 19:38:14

Для тех, кто просто пытается изменить порядок метабоксов, этот ответ больше не является лучшим подходом. Смотрите ответ Набиля.

rinogo rinogo
11 авг. 2017 г. 00:11:43
Показать остальные 8 комментариев
1
12

В следующем примере замените {CPT} на название типа записи, например post, page, book, event, imaginary, foobar... Таким образом, если у вас есть тип записи с названием event, вам нужно добавить фильтр для get_user_option_meta-box-order_event.

add_filter( 'get_user_option_meta-box-order_{CPT}', 'metabox_order' );
function metabox_order( $order ) {
    return array(
        'normal' => join( 
            ",", 
            array(       // vvv  Расположите здесь так, как вам нужно
                'customdiv-{CPT}',
                'authordiv',
                'slugdiv',
            )
        ),
    );
}

Примечания:

  • Наряду с normal, вы также можете использовать side и advanced
  • Значения представляют собой идентификаторы div, разделенные запятыми. Их можно получить, просмотрев исходный код страницы, или можно попробовать угадать
  • Любой метабокс, который существует, но не включен в ваш пользовательский порядок, будет автоматически добавлен в конец вашего списка.
29 авг. 2014 г. 11:32:14
Комментарии

Меня немного смутила номенклатура {CPT}; чтобы уточнить, если у вас есть тип записи с именем event, вам нужно будет добавить фильтр для get_user_option_meta-box-order_event.

rinogo rinogo
11 авг. 2017 г. 00:13:32
1

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

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

В идеале, пользователи с ролью администратора всё ещё могли бы перемещать свои метабоксы, но подписчики и авторы выиграли бы от единообразия в расположении всех метабоксов.

Существует ли такой плагин? Мне не удалось его найти.

Этот плагин мог бы быть вариантом, так как он просто запрещает пользователям перемещать метабоксы, но он не обновлялся десять лет. https://wordpress.org/plugins/unsortable-meta-box/

22 дек. 2023 г. 21:00:17
Комментарии

Если у вас возник новый вопрос, задайте его, нажав кнопку Задать вопрос. При необходимости укажите ссылку на этот вопрос для контекста. - Из отзыва

vancoder vancoder
22 дек. 2023 г. 22:28:03