Прикрепление данных таксономии к публикации с помощью wp_insert_post

17

Я пытаюсь внедрить систему публикации внешнего интерфейса, которая отображает данные таксономии в нескольких выпадающих полях выбора. Каждое из выпадающих имен названо с помощью «имени» $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 );

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

MartinJJ
источник

Ответы:

25

Используйте 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' );
Bainternet
источник
Я просто не знаю, где бы я был без вашей помощи, работал первый раз ... большое спасибо Bainternet. Помечено как ответили
MartinJJ
Рад, что смог помочь :)
Bainternet
Являются ли $ location и $ sale_rental массивами целых чисел или строк?
Дуг
5

Вы можете сделать это с помощью wp_insert_post , но вы также должны указать таксономию tax_input, чтобы она выглядела следующим образом:

$item['tax_input'] = array (
    'location'      => implode( ',', $location ),
    'sale_rental'   => implode( ',', $sale_rental ),
    'price'         => implode( ',', $price ),
)

Я использую implode()так, чтобы это $locationмог быть массив с несколькими терминами.

Также обратите внимание, что это работает только для неиерархических таксономий. Для иерархических таксономий вы должны предоставить массив вместо astring.

Томаш Каплер
источник
2

Источник проблемы

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

SysBot для спасения

Решением было то, что я написал плагин SysBot . Таким образом, я мог просто прикрепить пользователя SysBot (который играет роль редактора ) к этому вновь созданному посту, и все работало так, как ожидалось.

кайзер
источник