Вопрос или проблема
Я создал пользовательский тип записи с таксономией и теперь хочу разрешить пользователям (из определенной группы пользователей) публиковать только один единственный пост в конкретной категории.
Если пользователь уже опубликовал пост, он может только редактировать свой собственный пост (у меня уже есть PHP для этого).
Я нашел много решений, при которых пользователи могут публиковать только в определенной категории или только редактировать свои собственные посты, но нигде нет условия, что пользователь может опубликовать только один пост.
Эту функциональность можно рассматривать как “второй профиль”, это должно быть похоже на профиль (Пользователи могут опубликовать один пост, редактировать этот пост, все пользователи и гости могут просматривать пост).
У меня есть несколько идей, возможно, условие, если у пользователя 0 постов в категории, то у него есть право на публикацию?
Вы можете использовать WP_Query, чтобы получить посты, созданные пользователем в определенной категории, а также тип записи.
Чтобы найти посты определенной категории, вы можете использовать следующий фрагмент:
$query = new WP_Query( 'category_name=staff' );
Чтобы найти посты автора, вы можете использовать следующий фрагмент:
$query = new WP_Query( 'author=123' );
Объедините это в один запрос, и если вернутся какие-либо посты, значит, пользователь уже создал пост.
Для справки, посмотрите эту ссылку
Ответ или решение
Для реализации задачи, связанной с ограничением пользователей на создание единственного поста в определенной категории кастомного типа записи, необходимо использовать несколько подходов, основанных на функциональности WordPress. Давайте подробно рассмотрим, как это можно сделать, в том числе с использованием WP_Query и условной логики.
Шаг 1: Определение кастомного поста и категории
Сначала убедитесь, что у вас уже создан кастомный тип записи и соответствующая таксономия. Например, если ваш кастомный тип записи называется profile
, а категория – staff
, это будет основой для последующей проверки прав.
Шаг 2: Проверка на существующий пост
Передавая контроль над возможностью создания нового поста, мы должны проверить, есть ли у данного пользователя уже созданный пост в определенной категории. Это можно сделать с помощью WP_Query, где будет применен фильтр по пользователю и категории.
Вот пример кода, который необходимо будет использовать в функции, обрабатывающей функционал создания поста:
function allow_only_one_post($user_ID) {
$args = array(
'post_type' => 'profile', // Указываем наш кастомный пост
'author' => $user_ID, // Фильтруем по автору
'tax_query' => array(
array(
'taxonomy' => 'category', // Указываем таксономию
'field' => 'slug',
'terms' => 'staff', // Указываем категорию
),
),
);
$query = new WP_Query($args);
// Если юзер уже создал пост, возвращаем ошибку
if ($query->have_posts()) {
return false; // или выводим сообщение об ошибке
}
return true; // Пользователь может создать пост
}
Шаг 3: Подключение к процессу создания поста
Теперь, когда у нас есть логика проверки, необходимо внедрить вызов этой функции в процесс создания поста. Это можно сделать через хук pre_get_posts
или через свой собственный обработчик при сохранении поста.
Вот пример:
add_action('pre_get_posts', 'restrict_single_post_creation');
function restrict_single_post_creation($query) {
if (!is_admin() || !$query->is_main_query()) {
return;
}
// Получаем текущего пользователя
$user_ID = get_current_user_id();
if (!allow_only_one_post($user_ID)) {
// Здесь можно перенаправить пользователя или вывести ошибку
wp_die(__('Вы уже создали пост в этой категории. Вы можете только редактировать его.'));
}
}
Шаг 4: Разрешение редактирования поста
Вы упомянули, что у вас уже есть реализованная логика для редактирования собственных постов. Убедитесь, что эта логика корректно связывается с проверкой, реализованной выше.
function user_can_edit_post($post_id) {
$post_author = get_post_field('post_author', $post_id);
return get_current_user_id() === (int)$post_author;
}
Заключение
Приведенные выше шаги и код помогут вам ограничить пользователей определенной группы на создание лишь одного поста в заданной категории, позволяя при этом редактировать его. Используйте разработанную логику и не забывайте тестировать функционал для обеспечения корректной работы всех сценариев.
Строки, связующие логику создания и редактирования постов, могут быть сложны, и тестирование крайне важно для выявления возможных ошибок и обеспечения удобства пользователей. Не забывайте следить за обновлениями WordPress для сохранения совместимости вашего кода.