Если нужно из стороннего источника формировать посты в базе 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()
