Прикрепление данных таксономии к записи с помощью wp_insert_post
Я пытаюсь реализовать систему публикации с фронтенда, которая отображает данные таксономии в нескольких выпадающих списках. Каждый из выпадающих списков именуется с использованием параметра "name" $arg
в wp_dropdown_categories()
.
wp_dropdown_categories( array(
'taxonomy' => 'location',
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'name' => 'location',
) );
Как видите, таксономия - "location" и имя селекта тоже "location".
Затем я добавляю переменные для каждого выпадающего списка таксономии вместе с post_title, post_content и т.д.:
$title = trim( $_POST['wpuf_post_title'] );
$content = trim( $_POST['wpuf_post_content'] );
$tags = wpuf_clean_tags( $_POST['wpuf_post_tags'] );
$customcategory = trim( $_POST['customcategory'] );
$cat = trim( $_POST['cat'] );
$location = trim( $_POST['location'] );
$sale_rental = trim( $_POST['sale_rental'] );
$price = trim( $_POST['price'] );
Наконец, я добавляю дополнительную информацию в массив, готовый к отправке через wp_insert_post()
. Я не уверен, правильно ли я делаю, добавляя tax_input
в массив как показано ниже, хотя именно это я понял из документации:
'tax-input' => array(
$location,
$sale_rental,
$price
),
Так что в итоге всё выглядит так:
$my_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => $post_status,
'post_author' => $userdata->ID,
'post_category' => array( $_POST['cat'] ),
'post_type' => $customcategory,
'tags_input' => $tags,
'tax_input' => array(
$location,
$sale_rental,
$price
),
);
$post_id = wp_insert_post( $my_post );
Однако, когда я отправляю новую запись, все стандартные данные записи (а также мой пользовательский тип записи) добавляются нормально, но таксономии - нет. Я явно делаю что-то не так, но что?

Используйте wp_set_object_terms
после получения ID записи для каждой таксономии:
...
$post_id = wp_insert_post( $my_post );
wp_set_object_terms( $post_id, $location, 'location' );
wp_set_object_terms( $post_id, $sale_rental, 'sale_rental' );
wp_set_object_terms( $post_id, $price, 'price' );

Я даже не знаю, где бы я был без вашей помощи, сработало с первого раза... огромное спасибо, Bainternet. Отмечено как решенное.

Вы можете сделать это с помощью wp_insert_post, но также необходимо указать таксономию в параметре tax_input
, поэтому это должно выглядеть так:
$item['tax_input'] = array (
'location' => implode( ',', $location ),
'sale_rental' => implode( ',', $sale_rental ),
'price' => implode( ',', $price ),
)
Я использую implode()
, чтобы $location
мог быть массивом с несколькими терминами.
Также обратите внимание, что это работает только для неиерархических таксономий. Для иерархических таксономий необходимо передавать массив вместо строки.

Источник проблемы
После некоторых исследований по этой теме, мне посоветовали проверить внутренние механизмы (что я и сделал). Поскольку я импортировал записи из внешнего источника как пользовательский тип записи, я просто установил пользователя как -1
(вместо создания бота-пользователя). Проблема, с которой я столкнулся, заключалась в том, что функция wp_insert_post()
при установке параметра tax_input
внутренне проверяет права пользователя, которых у несуществующего пользователя, очевидно, нет.
SysBot приходит на помощь
Решением стало создание плагина SysBot. Таким образом, я мог просто привязать пользователя SysBot (с ролью редактора) к новой записи, и все заработало так, как ожидалось.
