Владельцы сайтов на WordPress с темой WPCommunity иногда сталкиваются с проблемой: при попытке открыть предпросмотр черновика через фронтенд-редактор появляется ошибка 404, хотя запись существует и пользователь авторизован.
Эта проблема может возникнуть по разным причинам: после обновления WordPress, при смене темы, после установки нового плагина или даже без видимых причин. В этой статье я расскажу, как быстро диагностировать и исправить эту проблему.
WordPress по умолчанию не показывает черновики на фронтенде — это сделано для безопасности, чтобы обычные посетители не видели неопубликованные записи. Однако для авторизованных пользователей (особенно авторов записей) предпросмотр должен работать.
Проблема может возникнуть, если:
- Обновилась версия WordPress и изменилась логика обработки запросов
- Тема WPCommunity не учитывает особенности новой версии WordPress
- Конфликтуют плагины, влияющие на запросы
- Сбились настройки постоянных ссылок
- Повреждены файлы темы или плагинов
Универсальное решение
Независимо от причины, проблема решается добавлением небольшого кода в functions.php вашей дочерней темы. Это безопасное решение, которое не требует правки основных файлов темы и сохранится после её обновления.
Шаг 1. Создайте дочернюю тему (если ещё не сделали)
Если у вас нет дочерней темы, создайте папку /wp-content/themes/wpcommunity-child/ и файл style.css с таким содержимым:
/*
Theme Name: WPCommunity Child
Description: Дочерняя тема для WPCommunity
Template: wpcommunity
Version: 1.0.0
*/ Шаг 2. Добавьте код в functions.php
Создайте файл functions.php в папке дочерней темы и добавьте туда этот код:
<?php
/**
* WPCommunity Child Theme Functions
*/
// Разрешаем просмотр черновиков на фронтенде для авторизованных пользователей
add_action('pre_get_posts', function($query) {
// Только для основного запроса и только для авторизованных
if (!is_admin() && $query->is_main_query() && is_user_logged_in()) {
// Если это запрос к конкретному посту (по ID или предпросмотр)
if ($query->get('p') || $query->get('name') || isset($_GET['preview'])) {
$query->set('post_status', ['publish', 'draft', 'pending', 'future']);
}
}
}); Шаг 3. Сохраните и проверьте
- Сохраните файл
- Очистите кеш браузера (Ctrl+F5)
- Попробуйте снова открыть предпросмотр черновика
Код добавляется в хук pre_get_posts и изменяет параметры запроса: если пользователь авторизован и запрашивает конкретный пост (по ID или через параметр preview), в результаты включаются не только опубликованные записи, но и черновики (draft), ожидающие проверки (pending) и запланированные (future).
Дополнительная диагностика
Если код не помог, выполните простую диагностику:
- Проверьте статус записи в админке (Записи → Все записи)
- Сбросьте постоянные ссылки (Настройки → Постоянные ссылки → Сохранить)
- Отключите все плагины и проверьте предпросмотр
- Включите режим отладки WordPress, добавив в
wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true); После этого откройте предпросмотр и посмотрите файл /wp-content/debug.log — там будут конкретные ошибки.
Альтернативное решение для конкретного пользователя
Если нужно разрешить предпросмотр только для автора записи (более безопасный вариант), используйте этот код:
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && is_user_logged_in()) {
$post_id = $query->get('p');
if ($post_id) {
$post = get_post($post_id);
// Разрешаем только если пользователь — автор поста
if ($post && $post->post_author == get_current_user_id()) {
$query->set('post_status', ['publish', 'draft', 'pending', 'future']);
}
}
if (isset($_GET['preview']) && $_GET['preview'] == 'true') {
$query->set('post_status', ['publish', 'draft', 'pending', 'future']);
}
}
}); Профилактика
Чтобы проблема не возвращалась:
- Всегда используйте дочернюю тему для любых изменений
- Регулярно обновляйте WordPress и плагины
- Делайте резервные копии перед обновлениями
- Проверяйте предпросмотр после каждого обновления
Ошибка 404 при предпросмотре черновиков в теме WPCommunity — распространённая проблема, которая легко решается добавлением нескольких строк кода. Предложенное решение безопасно, не влияет на производительность сайта и сохраняется при обновлениях темы.
Если вы нашли это руководство полезным, поделитесь им с другими пользователями WPCommunity. А если у вас остались вопросы — задавайте в комментариях!
Статья написана на основе практического опыта решения проблемы. Все права на торговые марки принадлежат их владельцам.
Автор, ты случаем не в курсе, как избавиться от этой надоедливой ссылки «Выйти», которая постоянно выскакивает, даже если ее скрываешь через CSS?
Чтобы отключить ссылку «Выйти», вставь код в functions.php:
/* Отключаем пункт "Выйти" в меню ---------------------------*/add_filter('wpcommunity/user/logout_menu_item', '__return_false');
add_filter('wpcommunity/user/logout_menu_item', function($enabled) {
return false;
}, 9999);
Благодарю, как раз наподобие этого и искал!