Вопрос или проблема
Я провел большую часть дня, просматривая прошлые вопросы и ответы, и не нашел ничего, что адресует то, что я пытаюсь сделать. Может быть, я неправильно сформулировал свой поиск.
Предположим, у меня есть категория записей для документов, которые отражают текущих членов комитета. Я могу создать элемент меню WP для конкретной записи в WordPress. Однако пользователи могут отправлять новые записи, используя плагин USP Pro. Теперь элемент меню должен указывать на недавно обновленную запись. Я хочу избежать необходимости обновлять меню каждый раз, когда добавляется новая запись.
Я создал функцию шорткода в файле functions.php, чтобы получить самую последнюю запись для категории (аргумент шорткода). Когда я пытаюсь перенаправить на постоянную ссылку для этой записи, я получаю пустую страницу.
//[latestpost]
function get_latest_post( $atts) { extract( shortcode_atts( array( 'cat' => '', ), $atts, 'latestpost' ) ); $args = array( 'posts_per_page' => 1, // нам нужна только последняя запись, так что получаем эту запись $ 'cat' => $cat, // используем id категории, можно также заменить на category_name$ //'category_name' => 'SLUG OF FOO CATEGORY, ); $q = new WP_Query( $args); if ( $q->have_posts() ) { while ( $q->have_posts() ) { $q->the_post(); //Ваши шаблонные теги и разметка, например: //the_title(); $link=get_permalink($post); // echo $link; // echo $cat; if ( wp_redirect( $link) ) { exit; } } wp_reset_postdata(); } } add_shortcode('latestpost','get_latest_post')`
Я добавил несколько echo выражений, чтобы подтвердить, что функция получает правильную категорию ($cat) и постоянную ссылку. Они появляются на странице, но страница не перенаправляется.
Использую WordPress 5.1 с дочерней темой twenty seventeen.
Спасибо за вашу помощь.
Если вы хотите выполнить любое перенаправление, вам нужно отправить заголовок до того, как сайт отправит любой вывод.
Шорткоды выполняются, когда контент получен, разобран и напечатан. Так что сайт уже частично отправлен в браузер, и вы не сможете выполнять никакие перенаправления больше.
Поэтому вам следует запускать свой код, используя какой-либо хук, который срабатывает до отправки любого вывода в браузер. Вы можете использовать хук wp
, например.
Если вы действительно хотите, чтобы шорткод вызывал перенаправление, тогда:
- Отображайте ссылку вместо этого – это будет менее запутанно для пользователей, я думаю.
- Вам придется выполнить перенаправление в JS:
.
function get_latest_post( $atts) {
extract( shortcode_atts( array(
'cat' => '',
), $atts, 'latestpost' ) );
$args = array(
'posts_per_page' => 1, // нам нужна только последняя запись, так что получаем эту запись $
'cat' => $cat, // используем id категории, можно также заменить на category_name$
//'category_name' => 'SLUG OF FOO CATEGORY,
);
$q = new WP_Query( $args);
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// Ваши шаблонные теги и разметка, например:
// the_title();
$link=get_permalink($post);
// echo $link;
// echo $cat;
echo '<script type="text/javascript>document.location.href = "' . $link . '";</script>'
return; // вы хотите только одно перенаправление на вашем сайте
}
wp_reset_postdata();
}
}
add_shortcode( 'latestpost', 'get_latest_post' );
Ответ или решение
Чтобы создать элемент меню, который будет динамически перенаправлять пользователей на самый последний пост в определённой категории на WordPress, вам нужно учитывать несколько ключевых моментов и оптимизировать вашу конфигурацию. В этом ответе я предоставлю вам пример, как это реализовать.
Проблема
Вы хотите, чтобы меню вашего сайта автоматически отображало последний обновленный пост в заданной категории без необходимости вручную обновлять его каждый раз при появлении нового контента. Поскольку вы используете плагин USP Pro и сталкиваетесь с проблемами перенаправления, вам потребуется использовать правильные хук-методы WordPress для реализации данной функциональности.
Решение
Вместо использования шорткода для перенаправления, который выполняется после отправки заголовков (что вызывает проблемы), я предлагаю использовать хук wp
для перенаправления пользователя при загрузке страницы.
Шаги по реализации
- Добавьте следующий код в файл
functions.php
вашей темы:
function redirect_to_latest_post() {
// Укажите ID категории, для которой нужно получить последний пост
$category_id = 1; // Замените на нужный вам ID категории
// Настройка аргументов запроса для получения последнего поста
$args = array(
'posts_per_page' => 1,
'cat' => $category_id,
);
// Выполнение WP_Query для получения последнего поста
$latest_post_query = new WP_Query($args);
// Проверяем, есть ли посты
if ( $latest_post_query->have_posts() ) {
// Получаем данные о посте
$latest_post_query->the_post();
$link = get_permalink();
// Перенаправление на последний пост
wp_redirect($link);
exit; // Завершаем выполнение скрипта после редиректа
}
// Сброс данных поста
wp_reset_postdata();
}
// Применяем хук 'template_redirect', чтобы выполнить переадресацию
add_action('template_redirect', 'redirect_to_latest_post');
Пояснения по коду:
- В указанном коде мы используем
WP_Query
, чтобы получить последний пост из обозначенной вами категории. - Убедитесь, что вы заменили
1
на фактический ID категории, которая вас интересует. - Функция
wp_redirect
используется для перенаправления пользователя, иexit
останавливает выполнение последующего кода, чтобы избежать нежелательных ошибок.
Преимущества данного подхода
- Автоматизация: Этот метод позволяет автоматически перенаправлять пользователей на последний пост, избегая дополнительных действий со стороны администратора сайта.
- Удобство пользователя: Регулярно обновляемый контент будет легче находить, что увеличивает вовлечённость пользователей.
- Оптимизация: Благодаря использованию необходимых хуков WordPress, код работает эффективно и не вызывает дополнительных проблем с производительностью.
Заключение
Внедряя вышеописанное решение, вы сделаете ваш сайт более интерактивным и удобным для пользователей, а также облегчит процесс управления контентом. Обязательно протестируйте изменения на локальной среде или staging-сервере, чтобы убедиться в правильности работы перед запуском на живом сайте.
Если возникают дополнительные вопросы или неясности, пожалуйста, не стесняйтесь обращаться за разъяснениями.