Вопрос или проблема
При просмотре списка постов на странице администратора wp-admin/edit.php
, я нажимаю на редактирование. Затем я завершаю редактирование поста, нажимаю на сохранение или публикацию и ожидаю, что меня вернут на исходную страницу списка администраторов, с которой я начал.
То же самое и когда я смотрю пост на фронтенде и нажимаю на ссылку редактирования в панели инструментов администратора. После завершения редактирования поста я хочу вернуться на исходный экран, на котором я был.
Для меня это кажется наиболее предсказуемым поведением, и я удивлён, что WordPress не действует так “из коробки”.
Это поведение должно быть согласовано со всеми пользовательскими типами постов.
Это можно реализовать с помощью простого пользовательского плагина с 2 действиями и 2 фильтрами.
Сначала используйте фильтр post_row_actions
, чтобы изменить ссылку редактирования на странице администратора и прикрепить к ней пользовательский запрос, называемый final_destination, с URI текущей страницы.
Затем мы можем использовать действие edit_form_advanced
, чтобы добавить скрытое поле в форму редактирования поста со значением параметра GET
final_destination.
Теперь мы можем использовать фильтр redirect_post_location
, чтобы проверить наличие final_destination в массиве POST
и вернуть редирект, если он установлен.
Наконец, нам также нужно изменить панель инструментов администратора, чтобы ссылка на редактирование там также содержала установленный параметр final_destination. Для этого мы можем использовать действие admin_bar_menu
.
Таким образом, весь плагин будет выглядеть примерно так:
<?php
/*
Plugin Name: Post Edit Redirects
Description: При просмотре поста, а затем нажатии на редактирование поста, после сохранения поста вы должны быть перенаправлены обратно
на исходную страницу. То же самое касается случая, когда вы на экране администратора смотрите список постов и затем нажимаете редактировать.
Этот модуль решает все это.
Version: 1.0
*/
// Измените ссылку редактирования на страницах списков постов, чтобы включить конечное местоположение, чтобы мы могли перенаправить сюда после завершения редактирования.
add_filter('post_row_actions', 'post_edit_redirects_post_row_actions', 10, 1);
function post_edit_redirects_post_row_actions($actions) {
$actions['edit'] = str_replace('action=edit', 'action=edit&final_destination=' . urlencode($_SERVER['REQUEST_URI']), $actions['edit']);
return $actions;
}
// Измените форму редактирования поста, чтобы включить скрытое поле для конечного местоположения
add_action('edit_form_advanced', 'post_edit_redirects_edit_form_advanced');
function post_edit_redirects_edit_form_advanced() {
if (!empty($_GET['final_destination'])) {
echo '<input id="final_destination" name="final_destination" type="hidden" value="' . urldecode($_GET['final_destination']) . '">';
}
}
// После сохранения поста проверьте наличие конечного местоположения для перенаправления.
add_filter('redirect_post_location', 'post_edit_redirects_redirect_post_location');
function post_edit_redirects_redirect_post_location($location) {
if (!empty($_POST['final_destination'])) {
return $_POST['final_destination'];
}
}
// Измените панель инструментов администратора, чтобы ссылка на редактирование имела прикрепленную строку запроса final_destination
add_action('admin_bar_menu', 'post_edit_redirects_admin_bar_menu', 999);
function post_edit_redirects_admin_bar_menu(WP_Admin_Bar $wp_admin_bar) {
$all_nodes = $wp_admin_bar->get_nodes();
// Невозможно редактировать узел, поэтому удалите все и добавьте их обратно, осуществляя редактирование.
foreach($all_nodes as $key => $val) {
$current_node = $all_nodes[$key];
$wp_admin_bar->remove_node($key);
if($key == 'edit') {
$current_node->href .= '&final_destination=' . urlencode($_SERVER['REQUEST_URI']);
}
$wp_admin_bar->add_node($current_node);
}
}
Другой вариант решения:
function wp_redirect_post_location( $location ) {
if ( 'post' == get_post_type() ) {
if ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) )
return admin_url( "edit.php?post_type=post" );
}
return $location;
}
add_filter( 'redirect_post_location', 'wp_redirect_post_location' );
Скопируйте код в файл функций вашей дочерней темы. Скопируйте все от // до последнего }}
//перенаправление после создания
add_action('save_post','redirect_page');
function redirect_page(){
$type= get_post_type();
switch ($type){
case "post":
$url= admin_url().'edit.php?msg=post';
wp_redirect($url);
exit;
break;
case "product":
$url= admin_url().'edit.php?post_type=product&msg=page';
wp_redirect($url);
exit;
break;
case "page":
$url= admin_url().'edit.php?post_type=page&msg=page';
wp_redirect($url);
exit;
break;
} }
Ответ или решение
Чтобы обеспечить перенаправление обратно на оригинальную страницу после сохранения или публикации поста в WordPress, вы можете создать простой плагин, который использует несколько хуков и фильтров. С помощью этого плагина вы сможете перенаправляться на ту страницу, с которой вы перешли на редактирование поста.
Шаги для реализации перенаправления
-
Изменение ссылки редактирования в списке постов: Используйте фильтр
post_row_actions
, чтобы закрепить параметрfinal_destination
, который содержит текущий URL страницы администрирования. -
Добавление скрытого поля в форму редактирования поста: Используйте экшен
edit_form_advanced
, чтобы добавить скрытое поле с значением параметраfinal_destination
. -
Проверка после сохранения поста: Используйте фильтр
redirect_post_location
, чтобы проверить наличиеfinal_destination
в массивеPOST
и произвести перенаправление по указанному URL. -
Изменение ссылки редактирования в административной панели: Используйте экшен
admin_bar_menu
для изменения ссылки редактирования в админ-панели, добавив к ней параметрfinal_destination
.
Полный код плагина
<?php
/*
Plugin Name: Post Edit Redirects
Description: Перенаправление на оригинальную страницу после редактирования поста.
Version: 1.0
*/
// Изменяем ссылку редактирования в списках постов
add_filter('post_row_actions', 'post_edit_redirects_post_row_actions', 10, 1);
function post_edit_redirects_post_row_actions($actions) {
$actions['edit'] = str_replace('action=edit', 'action=edit&final_destination=' . urlencode($_SERVER['REQUEST_URI']), $actions['edit']);
return $actions;
}
// Добавляем скрытое поле для финальногоURL в форму редактирования
add_action('edit_form_advanced', 'post_edit_redirects_edit_form_advanced');
function post_edit_redirects_edit_form_advanced() {
if (!empty($_GET['final_destination'])) {
echo '<input id="final_destination" name="final_destination" type="hidden" value="' . urldecode($_GET['final_destination']) . '">';
}
}
// Перенаправление после сохранения поста
add_filter('redirect_post_location', 'post_edit_redirects_redirect_post_location');
function post_edit_redirects_redirect_post_location($location) {
if (!empty($_POST['final_destination'])) {
return $_POST['final_destination'];
}
return $location;
}
// Изменяем ссылку редактирования в админской панели
add_action('admin_bar_menu', 'post_edit_redirects_admin_bar_menu', 999);
function post_edit_redirects_admin_bar_menu(WP_Admin_Bar $wp_admin_bar) {
$all_nodes = $wp_admin_bar->get_nodes();
foreach($all_nodes as $key => $val) {
$current_node = $all_nodes[$key];
$wp_admin_bar->remove_node($key);
if($key == 'edit') {
$current_node->href .= '&final_destination=' . urlencode($_SERVER['REQUEST_URI']);
}
$wp_admin_bar->add_node($current_node);
}
}
Альтернативное решение
Если вы ищете более простое решение, вы можете использовать следующий код в файле функций вашей дочерней темы. Этот код перенаправит пользователя назад на экран редактирования после сохранения поста.
add_action('save_post','redirect_page');
function redirect_page(){
$type = get_post_type();
switch ($type) {
case "post":
$url = admin_url() . 'edit.php?msg=post';
wp_redirect($url);
exit;
break;
case "product":
$url = admin_url() . 'edit.php?post_type=product&msg=page';
wp_redirect($url);
exit;
break;
case "page":
$url = admin_url() . 'edit.php?post_type=page&msg=page';
wp_redirect($url);
exit;
break;
}
}
Заключение
С вышеописанными решениями вы сможете обеспечить более удобный пользовательский опыт, перенаправляя администраторов или редакторов обратно на исходные страницы после редактирования постов. Это особенно полезно для сайтов с большим количеством контента, повысив удобство работы с интерфейсом WordPress.