WordPress как изменить статус сообщения с ожидающего на одобренный

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 NOT approved .

Следующий код находится в 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 и работает.