предварительный просмотр одиночного поста пользовательского типа записи для статуса в ожидании

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

Я создал пользовательский тип записи и создал запись в пользовательской форме на фронте, используя авторизованного пользователя, и установил статус “в ожидании”. Теперь я хочу показать предварительный просмотр созданной записи, как у опубликованной записи.

Я открыл 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>';
}

Как это работает

  1. Фильтр pre_get_posts: Этот фильтр позволяет вам изменять WP_Query перед выполнением запроса. Мы настроили его так, чтобы включать записи со статусами "опубликовано", "ожидает" и "черновик".

  2. Проверка прав доступа: Код проверяет, действительно ли текущий пользователь является автором записи, которую он пытается просмотреть. Это делается с помощью SQL-запроса к базе данных.

  3. Уведомление для пользователя: Данный баннер дадут понять авторам, что их работа еще не завершена, и запись не видна никому, кроме них.

Заключение

Эти изменения помогут вам легко настроить предварительный просмотр записей со статусом "ожидает" для авторов в WordPress. Таким образом, авторы смогут видеть свои работы и вносить в них изменения до момента публикации.

Не забудьте протестировать изменения на локальной среде, прежде чем внедрять их на рабочий сайт. Убедитесь, что ваше решение работает как задумано и не вызывает других проблем с производительностью или функциональностью сайта.

Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью!

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

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