Вт. Ноя 11th, 2025
WordPress Taxonomy

Если нужно из стороннего источника  формировать посты в базе WordPress, чаще всего это делается с помощью функции wp_insert_post.  Отладив программу, запуская ее через web-интерфейс админки, я столкнулся с проблемой, что посты записываются не верно, используя запуск через cron. А именно: не записываются таксономии. Т.е., например, нет возможности задать категорию поста. В этом посте о простом способе решении этой проблемы.

Для записи поста я использовал похожий код:

$args = array(
  'comment_status'  => 'closed',
  'ping_status'     => 'closed',
  'post_author'     => 1,
  'post_content'    => $content,
  'post_status'     => 'publish',
  'post_title'      => $title,
  'post_type'       => 'movie',
  'tax_input'       => array(
    'genre' => array('term1', 'term2', 'term3')
  )
);
$wp_movie_id = wp_insert_post($args);

Который отлично работал в web-интерфейсе, но не работал при запуске, через cron. Долго искал решение проблемы и наткнулся на приведенную ниже статью. Там говорится, что для записи таксономий, через функцию  wp_insert_post у cron не хватает прав. Странно, я пробовал запуск скрипта и под root — ситуация та же. Но решение проблемы есть, и оно довольно простое.

Решение проблемы заключается в использовании функции wp_set_object_terms для работы с таксономией. Т.е., после создания записи, и получения ее ID в $wp_movie_id (как в предыдущем примере), мы прикрипляем запись к элементу таксономии таким образом:

wp_set_object_terms( $wp_movie_id, $terms, $taxonomy);

где:

$wp_movie_id — ID записи, которой нужно присвоить элемент таксономии;
$terms — Названия элеменов таксономии, для присвоения;
$taxonomy — таксономия (например, ‘category’ ).

После таких изменений в коде, скрипт прекрасно работает при запуске из командной строки и при вызове из cron.

Дополнительная информация:

WordPress taxonomy terms don’t insert when cron job executes wp_insert_post()