Вопрос или проблема
Я использую следующую функцию для перенаправления поста на другой с помощью пользовательского поля. Она работает хорошо, пока я не добавил строку#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.
Этот подход позволяет не только передавать информацию о постах, но и сохраняет код максимально лаконичным и понятным.