Вопрос или проблема
Я сделал ограничение для пользовательского типа записи “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');
Пояснения
-
Исправления и улучшения кода: Обратите внимание на параметр
post_id
в функцииpost_published_limit
, который необходим для получения ID автора. Также исправлено использование глобального объекта$post
. -
Уведомление: При помощи WordPress-транзиентов
set_transient
иget_transient
создается временное уведомление, которое будет храниться в базе данных в течение указанного времени (например, 5 минут). -
Безопасность и производительность: Использование
esc_html()
в функцииdisplay_notice
обеспечивает защиту от XSS-атак путём экранирования пользовательского ввода.
Таким образом, после внесения предложенных изменений вы сможете эффективно управлять публикацией статей и уведомлениями для административных пользователей при превышении лимита. Эффективное использование трезентов обеспечивает надежную работу системы уведомлений.