Вопрос или проблема
Я создал пользовательский тип записи и создал запись в пользовательской форме на фронте, используя авторизованного пользователя, и установил статус “в ожидании”. Теперь я хочу показать предварительный просмотр созданной записи, как у опубликованной записи.
Я открыл URL, как администратор http://localhost/project/?post_type=deals&p=3305
но это работает только для администратора, а не для автора.
Другими словами, как показать ожидающую пользовательскую запись только для предварительного просмотра автору.
мой код—>>
'public' => true,'publicly_queryable' => true,'show_ui' => true,
Пожалуйста, помогите
Если вы выполните get_permalink($post_id), вы должны получить ссылку на предварительный просмотр. Я сделал то же самое для своего сайта. Автор должен иметь возможность видеть это, если не установлены какие-либо конкретные фильтры, которые этому препятствуют.
На самой записи я использую это, чтобы показать, что она в ожидании.
if ( get_post_status( $post_id ) == 'pending' ) {
echo '<div class="site__notice uppercase">Это предварительный просмотр. Этот профиль еще не был одобрен.</div>';
}
Можете ли вы поделиться каким-либо кодом или предоставить дополнительную информацию?
Это сработало после добавления кода ниже в functions.php
function preview_draft_posts($query) { if ( is_admin() || get_query_var('suppress_filters') ) return $query; $query->set('post_status', array('publish', 'pending', 'draft')); return $query; } if(isset($_GET['p']) && isset($_GET['post_type']) && ($_GET['post_type'] == 'deals' || $_GET['post_type'] == 'events')&& get_current_user_id() > 0){ global $wpdb; $deal_posts = $wpdb->prefix . 'posts'; $sql_claim ="SELECT ID FROM $deal_posts WHERE ID='".$_GET['p']."' AND post_author=".get_current_user_id(); $myrows = $wpdb->get_row( $sql_claim, ARRAY_A ); if(isset($myrows['ID']) ){ add_filter('pre_get_posts', 'preview_draft_posts'); } }
Ответ или решение
Предварительный просмотр пользовательского типа записи со статусом "ожидает"
Если вы создали пользовательский тип записи (custom post type) в WordPress и хотите предоставить авторам возможность просматривать записи со статусом "ожидает" (pending), вам потребуется внести изменения в файл functions.php
вашей темы. Данная инструкция поможет вам правильно настроить функционал, чтобы авторы могли видеть предварительный просмотр своих записей перед их публикацией.
Шаг 1: Фильтрация запросов
Для начала вам нужно создать функцию, которая будет фильтровать запросы к записям, разрешая авторам видеть записи с статусом "ожидает". Добавьте следующий код в файл functions.php
:
function preview_draft_posts($query) {
// Проверяем, не находимся ли мы в админке или уже отключены фильтры.
if (is_admin() || get_query_var('suppress_filters'))
return $query;
// Устанавливаем возможные статусы записи для отображения.
$query->set('post_status', array('publish', 'pending', 'draft'));
return $query;
}
// Проверка запроса на получение параметров p и post_type
if (isset($_GET['p']) && isset($_GET['post_type']) && ($_GET['post_type'] == 'deals' || $_GET['post_type'] == 'events') && get_current_user_id() > 0) {
global $wpdb;
$deal_posts = $wpdb->prefix . 'posts';
// Запрос к базе данных для проверки, принадлежит ли запись текущему автору
$sql_claim = "SELECT ID FROM $deal_posts WHERE ID='" . intval($_GET['p']) . "' AND post_author=" . get_current_user_id();
$myrows = $wpdb->get_row($sql_claim, ARRAY_A);
// Если запись принадлежит автору, добавляем фильтр
if (isset($myrows['ID'])) {
add_filter('pre_get_posts', 'preview_draft_posts');
}
}
Шаг 2: Отображение уведомления о статусе записи
Также рекомендуется отображать уведомление, если запись имеет статус "ожидает". Это поможет пользователю понять, что запись еще не была опубликована. Вот пример кода, который можно использовать для этого:
if (get_post_status($post_id) == 'pending') {
echo '<div class="site__notice uppercase">Это предварительный просмотр. Этот пост еще не одобрен.</div>';
}
Как это работает
-
Фильтр
pre_get_posts
: Этот фильтр позволяет вам изменять WP_Query перед выполнением запроса. Мы настроили его так, чтобы включать записи со статусами "опубликовано", "ожидает" и "черновик". -
Проверка прав доступа: Код проверяет, действительно ли текущий пользователь является автором записи, которую он пытается просмотреть. Это делается с помощью SQL-запроса к базе данных.
-
Уведомление для пользователя: Данный баннер дадут понять авторам, что их работа еще не завершена, и запись не видна никому, кроме них.
Заключение
Эти изменения помогут вам легко настроить предварительный просмотр записей со статусом "ожидает" для авторов в WordPress. Таким образом, авторы смогут видеть свои работы и вносить в них изменения до момента публикации.
Не забудьте протестировать изменения на локальной среде, прежде чем внедрять их на рабочий сайт. Убедитесь, что ваше решение работает как задумано и не вызывает других проблем с производительностью или функциональностью сайта.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!