php #wordpress #wordpress-theming #hook
#php #wordpress #wordpress-тематизация #крюк
Вопрос:
Мне нужно изменить статус сообщения с pending
на approved
при создании нового сообщения и если у автора есть одобренное сообщение раньше.
У меня есть такая функция, но код вообще не работает.
Пожалуйста, помогите:
add_filter('wp_insert_post', 'change_post_status_when_insert_post_data',10,2);
function change_post_status_when_insert_post_data($data) {
if($data['post_type'] == "post") {
$posts_args = array(
'author__in' => $id,
'post_type' => 'post',
'post_status' => 'approved',
'posts_per_page' => -1,
);
$user_posts = get_posts($posts_args);
$count = count($user_posts);
if($count > 0) {
$data['post_status'] = 'approved';
} else {
$data['post_status'] = 'pending';
}
}
return $data;
}
Ответ №1:
код вообще не работает
Потому что
wp_insert_post
это перехват действия, а не перехват фильтра. Следовательно, использованиеadd_filter
неверно.- Вы просили
wp_insert_post
предоставить вам два аргумента, но вы использовали один в своей функции обратного вызова. $data
это сообщениеobject
, это неarray
. Вы НЕ можете использовать его как$data['post_type']
.'post_status' => 'approved'
не существует. Смотрите Список допустимых статусов сообщений Docs- То, что вы ищете, — это статус сообщения
publish
NOTapproved
.
Следующий код находится в functions.php
файле вашей темы.
add_action('wp_insert_post', 'change_post_status_when_insert_post_data', 999, 2);
function change_post_status_when_insert_post_data($post_id, $post)
{
$posts_args = array(
'posts_per_page' => -1,
'author' => $post->post_author,
'post_status' => 'publish',
);
$user_posts = new WP_Query($posts_args);
$post_status = (('post' == $post->post_type) amp;amp; ($user_posts->found_posts) amp;amp; ('publish' != $post->post_status) amp;amp; ('trash' != $post->post_status)) ? 'publish' : 'pending';
if ('publish' == $post_status) {
wp_update_post(array(
'ID' => $post_id,
'post_status' => $post_status
));
}
}
Условия, которые я использовал для автоматической публикации сообщения:
post_type
Должно быть «сообщение»- И
- У автора уже должен быть хотя бы один опубликованный пост.
- И
- Не
post_status
должно бытьpublish
уже. - И
- Также
post_status
не должно бытьtrash
.
Также стоит упомянуть, что я использовал WP_Query
и его свойство found_posts
вместо использования get_posts
и count
, чтобы выяснить, опубликовал ли автор уже сообщение или нет.
Этот ответ был полностью протестирован на WordPress 5.8.1
и работает.