Как передать сообщение с помощью template_redirect

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

Я использую следующую функцию для перенаправления поста на другой с помощью пользовательского поля. Она работает хорошо, пока я не добавил строку#8, чтобы передать ID, чтобы я мог получить его в посте (в который было перенаправлено) и показать пользовательское сообщение, что вы перенаправлены из того конкретного поста:

function project_do_redirect() {
    if( !is_singular( 'mycpt' ) && !is_single() )
        return;

    global $post;
    $redirect_post_id = get_post_meta( $post->ID, 'redirect', true );
    $redirect_url = $redirect_post_id ? get_permalink( $redirect_post_id ) : false;
    $redirect_url = esc_url( add_query_arg( 'redir_from', $post->ID, $redirect_url ) );
    if( $redirect_post_id ) {
        wp_redirect( $redirect_url, 301 );
        exit;
    }
}
add_action( 'template_redirect', 'project_do_redirect' );

Проблема в следующем:
Если я был перенаправлен из поста #12 в пост #13, ?redir_from= показывает 13 вместо 12. Так что дело не работает так, как ожидалось.

Итак, не передавая никаких параметров в URL, как я могу передать сообщение на перенаправленную страницу?

Вы можете подойти к проблеме с другой стороны и поискать пост на основе HTTP_REFERER, доступного в супер глобальной переменной $_SERVER:

http://php.net/manual/en/reserved.variables.server.php

Вы можете выполнить поиск страницы на основе URL $_SERVER['HTTP_REFERER'] и получить информацию о посте таким образом. Вы также можете сделать свои 301 более чистыми, не добавляя переменные запроса реферера и вынести 301 в .htaccess или конфигурацию Apache в виде однострочных:

RedirectPermanent /old-path /new-path

Ответ или решение

Для успешной передачи сообщения при редиректе в WordPress с помощью функции template_redirect, необходимо учесть несколько ключевых аспектов. Основная цель — передать информацию о предыдущем посте без необходимости добавления параметров в URL. Ниже приведен подробный подход к решению этой задачи.

1. Использование HTTP_REFERER

Одним из решающих моментов в вашей задаче является использование переменной $_SERVER['HTTP_REFERER']. Эта переменная содержит адрес страницы, с которой пользователь был перенаправлен. Мы можем использовать её для получения информации о предыдущем посте.

function project_do_redirect() {
    if( !is_singular('mycpt') && !is_single() )
        return;

    global $post;
    $redirect_post_id = get_post_meta($post->ID, 'redirect', true);
    $redirect_url = $redirect_post_id ? get_permalink($redirect_post_id) : false;

    if($redirect_post_id) {
        // Сохраним ID источника в сессии для дальнейшего использования
        if (!session_id()) {
            session_start();
        }
        $_SESSION['redir_from'] = $post->ID;

        wp_redirect($redirect_url, 301);
        exit;
    }
}
add_action('template_redirect', 'project_do_redirect');

2. Отображение сообщения на целевой странице

Теперь, когда мы сохранили ID перенаправленного поста в сессии, мы можем показать сообщение на целевой странице.

function display_redirect_message() {
    if (isset($_SESSION['redir_from'])) {
        $redirect_from_id = intval($_SESSION['redir_from']);
        $redirect_from_post = get_post($redirect_from_id);

        if ($redirect_from_post) {
            echo '<p>Вы были перенаправлены с поста: <a href="'. get_permalink($redirect_from_id) .'">'. esc_html($redirect_from_post->post_title) .'</a></p>';
            unset($_SESSION['redir_from']); // Очистим сессию после использования
        }
    }
}
add_action('the_content', 'display_redirect_message');

3. Удаление параметров из URL

Использование сессий устраняет необходимость в передаче параметров через URL, что приводит к более чистым 301 редиректам.

4. Заключение

Таким образом, использование сессий и HTTP_REFERER позволяет вам передавать сообщения между редиректами без необходимости добавления лишних параметров в URL. Это решение улучшает читаемость ваших ссылок и снижает вероятность путаницы для пользователей. Optimizating mode and clarity are achieved concurrently using these techniques.

Этот подход позволяет не только передавать информацию о постах, но и сохраняет код максимально лаконичным и понятным.

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

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