Программное добавление терминов к пользовательским типам записей
Я хочу назначить иерархический термин для пользовательского типа записи:
function create_frontles_posts() {
$x = 1;
do {
$post_id = wp_insert_post(array(
'comment_status' => 'closed', // закрыть комментарии
'ping_status' => 'closed', // закрыть пинги
'post_author' => 1, // ID автора
'post_name' => 'Tile'.$x, // имя поста
'post_title' => 'Tile', // заголовок поста
'post_status' => 'publish', // статус публикации
'post_type' => 'frontiles', // тип записи
));
wp_set_object_terms($post_id, array('mosaic-home'), 'tiles_categories', true);
$x++;
} while ($x <= 24);
}
Мне удалось автоматически создать 24 пользовательских записи, но не получается назначить им термин в этом процессе. Ранее я создал термин с помощью этой функции без проблем:
function example_insert_category() {
wp_insert_term(
'Mosaic - Home', // название термина
'tiles_categories', // таксономия
array(
'description' => 'Add Tiles here to load in first term', // описание
'slug' => 'mosaic-home' // ярлык
)
);
}
add_action('init','example_insert_category');
Что я делаю не так?

Я обнаружил проблему и её решение. Я отладил функцию "wp_set_object_terms" с помощью "is_wp_error" и получил сообщение "Invalid Taxonomy", после чего понял, что во время создания постов этот термин ещё не существовал. Поэтому я изменил хук на "init" в функции programmatically_create_post(), и вуаля!
Ниже представлен рабочий код:
<?php
// ДЕЙСТВИЯ ПРИ АКТИВАЦИИ ТЕМЫ ///////////////////////
if (isset($_GET['activated']) && is_admin()){
// 3. Добавляем термин "mosaic-home" в пользовательскую таксономию "tiles_categories"
function example_insert_category() {
wp_insert_term(
'Mosaic - Home',
'tiles_categories',
array(
'description' => 'Добавьте плитки сюда для загрузки в первом термине',
'slug' => 'mosaic-home'
)
);
}
add_action('init','example_insert_category');
// 4. Создаём цикл для генерации 24 записей
function create_frontles_posts() {
$x = 1;
do {
$post_id = wp_insert_post(array(
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_author' => 1,
'post_name' => 'tile'.$x,
'post_title' => 'Плитка',
'post_status' => 'publish',
'post_type' => 'frontiles',
// 'tax_input' => array('tiles_categories' => 2),
));
wp_set_object_terms($post_id, 'mosaic-home', 'tiles_categories', true);
$x++;
} while ($x <= 24);
}
// 5. Добавляем цикл в функцию для создания записей
function programmatically_create_post() {
// Инициализируем ID страницы значением -1. Это означает, что никакие действия ещё не выполнялись.
$post_id = -1;
$title='';
// Если страница ещё не существует, создаём её
if( null == get_page_by_title( $title ) ) {
create_frontles_posts();
} else {
// В противном случае прекращаем выполнение
$post_id = -2;
}
}
add_filter( 'init', 'programmatically_create_post' );
} // конец действий при активации
?>

Вот пример. Я постарался объяснить каждый процесс, происходящий в каждой строке. Надеюсь, этот код поможет вам легко понять, как это работает.
<?php
//создаем пустой массив для хранения идентификаторов вставляемых терминов
$terms = array();
//вставляем термин "Kathmandu" в пользовательскую таксономию "region"
$tax_insert_id = wp_insert_term('Kathmandu','region' );
//если термин "Kathmandu" успешно вставлен, его term_id возвращается и сохраняется в $tax_insert_id
//возвращенный term_id добавляется в массив $terms
$terms[] = $tax_insert_id['term_id'];
//вставляем термин "Banepa" в пользовательскую таксономию "region"
$tax_insert_id = wp_insert_term('Banepa','region' );
//если термин "Banepa" успешно вставлен, его term_id возвращается и сохраняется в $tax_insert_id
//возвращенный term_id добавляется в массив $terms
$terms[] = $tax_insert_id['term_id'];
//Создаем массив для поста
$post = array(
'post_title' => 'Заголовок',
'post_content' => 'Это тестовый текст',
'post_status' => 'publish',
'post_type' => 'post',
);
//Вставляем пост в WordPress с помощью wp_insert_post()
//если пост успешно создан, его post_id возвращается и сохраняется в $the_post_id
$the_post_id = wp_insert_post( $post );
//назначаем термины из массива $terms посту с идентификатором $the_post_id
wp_set_post_terms( $the_post_id, $terms, 'region' );

Спасибо, Карун! Но я пытаюсь протестировать код и получаю ошибку PHP "Fatal error: Cannot use object of type WP_Error as array in..." в этой строке: $terms[] = $tax_insert_id['term_id'];

Можешь посмотреть, как сейчас выглядит весь код здесь: http://pastebin.com/embed_iframe.php?i=gxp71NLt
