Установите список по умолчанию "Просмотр" в администраторе
Я ищу способ установить параметры "Просмотр" по умолчанию в разделе типы записей в области администрирования. Например, по умолчанию сообщения будут по умолчанию отображаться в виде "списка" вместо "выдержки" - я хотел бы изменить это на выдержку по умолчанию - каков был бы наилучший способ добиться этого? Я немного поискал по этому поводу, но до сих пор застрял в грязи. Любая помощь будет очень признательна. Спасибо!
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;
}
Виола! Режим постоянного списка для каждого типа сообщений для каждого пользователя, без взломов.
Экран просмотра записи переключается с представления списка на представление отрывка на основе значения параметра "режим" в строке запроса. Если параметр "режим" не задан, то 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, но мы можем попытаться протолкнуть это для следующей версии).
Итак, вскоре после того, как я назначил награду, я пришел к следующему решению. Это поведение по умолчанию во всех отношениях, за исключением того, что оно выбирает представление отрывка для любого типа записи, который вы хотите (вместо представления списка по умолчанию).
<?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 является частью ядра, очевидно, что его метод будет лучшим, поскольку для этого вам не потребуется идти длинным обходным путем. Мне просто это не нравится в данный момент, так как вам нужно отредактировать основные файлы.