Хотя наличие постоянных настроек в ядре - это хорошо, может пройти довольно много времени, прежде чем оно действительно будет принято. 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;
}
Виола! Режим постоянного списка для каждого типа поста на пользователя, без хаков.
Экран просмотра постов переключается с просмотра списка на просмотр фрагментов в зависимости от значения параметра mode в строке запроса. Если параметр «mode» не задан, WordPress по умолчанию принимает вид списка.
К сожалению, этот параметр не фильтруется, поэтому нет простого способа контролировать его программно.
Поэтому я собираюсь сделать то, чего никогда не делаю ... Я расскажу вам, как взломать Core, чтобы сделать эту работу ...
Добавление фильтра
Откройте
/wp-admin/includes/class-wp-posts-list-table.php
и найдитеprepare_items()
метод (около строки 81).В строке 99 WordPress проверяет, был ли параметр «режим» установлен в запросе, и использует его для установки глобальной
$mode
переменной:Мы собираемся изменить эту строку, чтобы отфильтровать настройки по умолчанию. Измените эту строку на:
Теперь перейдите в
functions.php
файл вашей темы и добавьте следующий код:Это подключится к фильтру и вернет режим выписки по умолчанию.
Так как мое личное правило о взломе Core требует, чтобы все хаки были внесены обратно в проект (таким образом они могут быть перенесены в Core и больше не считаться хаком), я открыл Trac-тикет для этого улучшения и отправил код выше как патч. Пожалуйста, взвесьте тикет, чтобы он мог войти в ядро для 3.5 (мы опоздали в цикле для 3.4, но мы можем попытаться протолкнуть это для следующей версии).
источник
$_REQUEST
глобальныйadd_action( 'edit.php', ... )
и тому подобное, пока мы ждем, когда ядро примет исправление / предложение?$_REQUEST
объекта сам. Не стесняйтесь опубликовать еще один ответ с изложением того, как это можно сделать.Итак, вскоре после того, как я назначил награду, я нашел следующее решение. Это поведение по умолчанию во всех отношениях, за исключением того, что оно выбирает представление выдержки для любого типа сообщения (вместо представления по умолчанию).
ПРИМЕЧАНИЕ: я рекомендую подход Soulseekah, если вы не хотите, чтобы он запомнил выбор пользователя, вы можете немного включить мой код в его код. ПРИМЕЧАНИЕ 2: Если / когда патч EAMann является частью ядра, очевидно, что его метод будет лучшим, поскольку он не потребует от вас проделать длинный путь. Мне просто не нравится в данный момент, так как вы должны редактировать файлы ядра.
источник
paged
не менее, не принимается во внимание (разбиение на страницы) + использованиеwp_redirect
вместо необработанных заголовков может быть немного "чище", и я не уверен, насколько эффективно перенаправление. Помимо этого выглядит интересно. Кроме того,$_GET['post_type']
может не быть установлен, что приводит к предупреждению, если ошибки включены. +1 за усилие и терпение. Не понимал, что вопрос был таким старым.$_GET
переменные. Что касается$_GET['post_type']
, честно говоря, меня это не слишком беспокоило, поскольку я требовал, чтобы это было только для нестандартного типа сообщений, который всегда будет там. Очевидно, это можно опустить. @ EAMann, Вы правы, однако, это было лучшее решение, которое я мог придумать. Я попытался установить$_GET
параметры вручную , надеясь, что они будут установлены ДО того, как они будут прочитаны, но, похоже, это не так.