Как после сохранения или публикации поста вернуться на исходную страницу

Вопрос или проблема

При просмотре списка постов на странице администратора 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, вы можете создать простой плагин, который использует несколько хуков и фильтров. С помощью этого плагина вы сможете перенаправляться на ту страницу, с которой вы перешли на редактирование поста.

Шаги для реализации перенаправления

  1. Изменение ссылки редактирования в списке постов: Используйте фильтр post_row_actions, чтобы закрепить параметр final_destination, который содержит текущий URL страницы администрирования.

  2. Добавление скрытого поля в форму редактирования поста: Используйте экшен edit_form_advanced, чтобы добавить скрытое поле с значением параметра final_destination.

  3. Проверка после сохранения поста: Используйте фильтр redirect_post_location, чтобы проверить наличие final_destination в массиве POST и произвести перенаправление по указанному URL.

  4. Изменение ссылки редактирования в административной панели: Используйте экшен 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&amp;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 .= '&amp;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&amp;msg=page';
            wp_redirect($url);
            exit;
            break;
        case "page":
            $url = admin_url() . 'edit.php?post_type=page&amp;msg=page';
            wp_redirect($url);
            exit;
            break;
    }
}

Заключение

С вышеописанными решениями вы сможете обеспечить более удобный пользовательский опыт, перенаправляя администраторов или редакторов обратно на исходные страницы после редактирования постов. Это особенно полезно для сайтов с большим количеством контента, повысив удобство работы с интерфейсом WordPress.

Оцените материал
Добавить комментарий

Капча загружается...