Прикрепление данных таксономии к сообщению с помощью wp вставить сообщение
Я пытаюсь внедрить переднюю систему учета, которая отображает данные таксономии в нескольких раскрывающихся полях выбора. Каждому из выпадающих списков присваивается имя с помощью "name" $arg
в wp_dropdown_categories()
.
wp_dropdown_categories( array(
'taxonomy' => 'location',
'hide_empty' => 0,
'orderby' => 'name',
'order' => 'ASC',
'name' => '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 );
Однако, когда я отправил новое сообщение, все стандартные данные сообщения (а также мой пользовательский тип сообщения) были в порядке, но таксономии - нет. Я явно делаю что-то не так, но что?
3 answers
Использовать wp_set_object_terms
после того, как у вас будет идентификатор записи для каждой таксономии:
...
$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' );
Вы можете сделать это с помощью 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 (у которого есть роль редактора ) к этому недавно созданному сообщению, и все работало так, как ожидалось.