Установите список по умолчанию "Просмотр" в администраторе


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

 10
Author: Zach, 2011-11-28

3 answers

Хотя наличие функции постоянных настроек в ядре приятно, может потребоваться довольно много времени, прежде чем она будет фактически принята. WordPress 3.5 все еще довольно далеко.

Поэтому давайте вместо этого увеличим глобальный массив $_REQUEST.

add_action( 'load-edit.php', 'wpse34956_force_excerpt' );
function wpse34956_force_excerpt() {
    $_REQUEST['mode'] = 'excerpt';
}

Это приведет к блокировке режимов, заставляя excerpt постоянно работать в режиме, поэтому давайте позволим пользователю решать, но сохраняем его постоянным, используя метаданные пользователя:

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {
    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode', $_REQUEST['mode'] );
        return;
    }
    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode', true ) )
        $_REQUEST['mode'] = $mode;
}

Вы можете дополнительно интерполировать post_type во все, приняв во внимание переменную $_GET['post_type'] когда доступно.

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {

    // take into account post types that support excerpts
    $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
    if ( $post_type && !post_type_supports( $post_type, 'excerpt' ) )
        return; // don't care

    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, $_REQUEST['mode'] );
        return;
    }

    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, true ) )
        $_REQUEST['mode'] = $mode;
}

Виола! Режим постоянного списка для каждого типа сообщений для каждого пользователя, без взломов.

 9
Author: soulseekah, 2012-03-30 18:43:27

Экран просмотра записи переключается с представления списка на представление отрывка на основе значения параметра "режим" в строке запроса. Если параметр "режим" не задан, то WordPress по умолчанию использует представление списка.

К сожалению, этот параметр не поддается фильтрации , поэтому нет простого способа управлять им программно.

Поэтому я собираюсь сделать то, чего никогда не делал... Я собираюсь рассказать вам, как взломать ядро, чтобы это работало...

Добавление фильтра

Открыть /wp-admin/includes/class-wp-posts-list-table.php и найдите метод prepare_items() (около строки 81).

В строке 99 WordPress проверяет, был ли установлен параметр "режим" в запросе, и использует его для установки глобальной переменной $mode:

$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

Мы собираемся изменить эту строку, чтобы отфильтровать настройки по умолчанию. Измените эту строку на:

$mode = empty( $_REQUEST['mode'] ) ? apply_filters( 'default-posts-list-mode', 'list' ) : $_REQUEST['mode'];

Теперь перейдите в файл вашей темы functions.php и добавьте следующий код:

add_filter( 'default-posts-list-mode', 'my_default_posts_list_mode' );
function my_default_posts_list_mode( $default ) {
    return 'excerpt';
}

Это подключит фильтр и вернет режим выдержки по умолчанию.

С тех пор, как мой личный правило о взломе Ядра требует, чтобы все взломы были возвращены в проект (таким образом, они могут быть перенесены в ядро и больше не считаются взломом), я открыл билет Trac для этого улучшения и представил приведенный выше код в качестве исправления. Пожалуйста, взвесьте билет, чтобы он мог попасть в ядро для версии 3.5 (мы слишком запаздываем в цикле для версии 3.4, но мы можем попытаться протолкнуть это для следующей версии).

 5
Author: EAMann, 2020-06-15 08:21:38

Итак, вскоре после того, как я назначил награду, я пришел к следующему решению. Это поведение по умолчанию во всех отношениях, за исключением того, что оно выбирает представление отрывка для любого типа записи, который вы хотите (вместо представления списка по умолчанию).

<?php

add_action( 'admin_init', 'my_admin_init' ); // initiate admin hook

function my_admin_init() {
    // if mode is not set redirect to a default mode.
    if(!isset($_GET['mode'])) {
        if('forms' == $_GET['post_type'] || 'client-quotes' == $_GET['post_type'] ) {
            wp_redirect( admin_url( 'edit.php?mode=excerpt&' . http_build_query( $_GET ) ) );
            exit;
        }
    }
}

?>

ПРИМЕЧАНИЕ: Я рекомендую подход Soulseekah, если вы не хотите, чтобы он запоминал выбор пользователя, вы можете немного включить мой код в его код. ПРИМЕЧАНИЕ 2: Если/когда патч EAMann является частью ядра, очевидно, что его метод будет лучшим, поскольку для этого вам не потребуется идти длинным обходным путем. Мне просто это не нравится в данный момент, так как вам нужно отредактировать основные файлы.

 2
Author: Hosh Sadiq, 2012-03-30 23:24:22