Как отобразить уведомление администратора после изменения редактирования пользовательского типа записи

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

Я сделал ограничение для пользовательского типа записи “vereine”. Это работает, но в админке уведомление, что пользовательская запись опубликована (а не черновик). Как я могу добавить сообщение? Вот код для ограничения

function post_published_limit() {
    $max_posts = 1; // количество максимальных записей Verein
    $author = $post->vereinsmanager; // ограничение только для vereinsmanager

    $count = count_user_posts( $author, 'vereine'); 

    if ( $count > $max_posts ) {
        // если больше 1, тогда установить статус черновика и выдать уведомление для vereinsmanager
        
        $post = array('post_status' => 'draft');
        wp_update_post( $post );
        
    }
}
add_action( 'publish_vereine', 'post_published_limit' );

спасибо за вашу помощь, приветствую

Вам нужно сохранить уведомление в базе данных, чтобы при обновлении страницы уведомление могло быть отображено. Существует много способов сохранить уведомление в базе данных (я использую Persist Admin Notices шаблон для моих плагинов), но для целей этой демонстрации я использую простое временное transient,

 add_action( 'publish_vereine', 'post_published_limit' );
 function post_published_limit() {
    $max_posts = 1; // количество максимальных записей Verein
    $author = $post->vereinsmanager; // ограничение только для vereinsmanager

    $count = count_user_posts( $author, 'vereine'); 

    if ( $count > $max_posts ) {
        // если больше 1, тогда установить статус черновика и выдать уведомление для vereinsmanager
        
        $post = array('post_status' => 'draft');
        wp_update_post( $post );
        //сохранить временное уведомление с истечением срока через 5 минут
        set_transient('vereine_post_notice', 'You can only publish 1 post at a time', 5 * MINUTE_IN_SECONDS);
    }
}

затем подключитесь к процессу уведомления администратора,

add_action('admin_notices', 'display_notice');
function display_notice(){
  $notice = get_transient('vereine_post_notice');
  if(!empty($notice)){
    echo '<p>'.$notice.'</p>';
  }
}

Ответ или решение

Для реализации задачи отображения уведомления админа после изменения записи пользовательского типа поста "vereine", в WordPress предлагается использовать метод ограничения публикации. Ваш код изначально предусматривает эту функциональность, но существует потребность в добавлении уведомления для пользователя, когда пост пересматривается как черновик из-за превышения лимита. Рассмотрим, как можно улучшить ваш подход с использованием WordPress-транзиентов для временного хранения уведомлений.

Шаг 1: Ограничение количества публикаций

Ваш код для ограничения количества постов выглядит функционально, хотя есть несколько заметок по улучшению:

function post_published_limit($post_id) {
    $max_posts = 1; // максимальное количество публикаций
    $author_id = get_post_field('post_author', $post_id); // получение ID автора

    // Считаем количество опубликованных постов у автора
    $count = count_user_posts($author_id, 'vereine', true);

    if ($count > $max_posts) {
        // Изменение статуса поста на черновик и установка уведомления
        $post = array('ID' => $post_id, 'post_status' => 'draft');
        wp_update_post($post);

        // Установка временного уведомления
        set_transient('vereine_post_notice', 'Вы можете опубликовать только 1 запись за раз.', 5 * MINUTE_IN_SECONDS);
    }
}
add_action('publish_vereine', 'post_published_limit');

Шаг 2: Отображение уведомления администратора

Теперь добавим функцию, которая будет выводить уведомление в административной панели, основываясь на транзиентах.

function display_notice() {
    // Получаем уведомление, если оно установлено
    $notice = get_transient('vereine_post_notice');

    if (!empty($notice)) {
        echo '<div class="notice notice-warning is-dismissible">';
        echo '<p>' . esc_html($notice) . '</p>';
        echo '</div>';

        // Удаляем транзиент после отображения
        delete_transient('vereine_post_notice');
    }
}
add_action('admin_notices', 'display_notice');

Пояснения

  1. Исправления и улучшения кода: Обратите внимание на параметр post_id в функции post_published_limit, который необходим для получения ID автора. Также исправлено использование глобального объекта $post.

  2. Уведомление: При помощи WordPress-транзиентов set_transient и get_transient создается временное уведомление, которое будет храниться в базе данных в течение указанного времени (например, 5 минут).

  3. Безопасность и производительность: Использование esc_html() в функции display_notice обеспечивает защиту от XSS-атак путём экранирования пользовательского ввода.

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

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

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