tax_input не работает в wp_insert_post
Я использую wp_insert_post, и все поля работают, кроме tax_input. Есть ли ошибка в моем коде?
$customtax = array(
'product_link' => $link, // Ссылка на продукт
'product_price' => $price, // Цена продукта
'product_description' => $desc ); // Описание продукта
$my_post = array(
'post_title' => $title, // Заголовок поста
'post_content' => $content, // Содержание поста
'post_type' => 'products', // Тип поста
'tax_input' => $customtax // Таксономии
);
Заранее спасибо за помощь

Наиболее распространённая причина заключается в том, что вы выполняете этот код без контекста пользователя (например, в cron и т.д.). В контексте wp_insert_post()
WordPress проверяет, есть ли у пользователя права на таксономию. Нет пользователя — нет прав — нет назначенных терминов.
Обходной путь — сначала создать запись, а затем назначить ей термины. Когда термины назначаются явно через API-метод (например, wp_set_object_terms()
), проверка прав не выполняется.

Так что обходное решение - использовать wp_insert_post() без tax_input, а после завершения использовать wp_set_object_terms()? Но что, если это невозможно? Например, плагин, который позволяет фильтровать аргументы для wp_insert_post(), но не имеет хука для момента после завершения. Этот ответ может сработать, но он далёк от идеала. В wp_insert_post() и 'tax_input' есть что-то странное. Определённо должно быть чистое решение.

Как вы упомянули в комментарии, что плагин будет обрабатывать фильтры и не имеет хука, я считаю, что плагин в любом случае должен иметь хук wp_insert_post. Иначе как вы добавляете запись? Отвечаю спустя столько времени, потому что столкнулся с той же проблемой и нашел единственное решение.
$new_id = wp_insert_post($post_arr, true);
$status = wp_set_object_terms($new_id, $term_id, 'location');
Здесь location - это слаг таксономии. Надеюсь, это кому-то поможет в будущем..

При использовании tax_input для вставки записи обязательно используйте ID терминов таксономии, поскольку slugs (ярлыки) или названия, похоже, игнорируются
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => array('myTax', array(4,458,11478)),
);

Вопрос давний, но я потратил немало времени, чтобы понять, что функция вставки записи (wp_insert_post) ведёт себя таким образом при использовании внутри действия cron.
Вставка записи с последующим вызовом wp_set_object_terms — хорошее решение, однако в моём случае также сработала установка текущего пользователя перед вставкой записи
$user_id = 1;
$user = get_user_by( 'id', $user_id );
wp_set_current_user( $user_id, $user->user_login);
$new_id = wp_insert_post($my_post);

Как отметил @Rarst, WordPress проверяет во время выполнения wp_insert_post(), имеет ли текущий пользователь разрешение на добавление терминов таксономии. Это также видно из post.php строка:3352:
if ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) {
wp_set_post_terms( $post_ID, $tags, $taxonomy );
}
Если вы выполняете код wp_insert_post без авторизованного пользователя, вы можете установить текущего пользователя с помощью метода wp_set_current_user().
$user = get_user_by('ID', $user_id);
if( $user ){
wp_set_current_user( $user_id, $user->user_login );
}

Возможно, функция wp_insert_post()
изменилась, или, может быть, никто не заглядывал в её код, но на сегодняшний день ответ такой:
$customtax = array(
'myTax' => array(1,2,3),
);
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_type' => 'products',
'tax_input' => $customtax
);
Где 1,2,3 — это ID терминов таксономии.
И да, текущий пользователь должен иметь возможность назначать термины, в противном случае попробуйте использовать функцию wp_set_object_terms()
после wp_insert_post()
.
