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

25 мая 2011 г., 17:25:48
Просмотры: 44.5K
Голосов: 23

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

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

0
Все ответы на вопрос 3
3
37

Используйте 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' );
25 мая 2011 г. 17:34:58
Комментарии

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

MartinJJ MartinJJ
25 мая 2011 г. 17:45:27

Рад, что смог помочь :)

Bainternet Bainternet
25 мая 2011 г. 17:50:01

Являются ли $location и $sale_rental массивами целых чисел или строк?

Doug Doug
24 окт. 2014 г. 00:47:41
0

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

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

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

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

17 сент. 2012 г. 15:00:33
1

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

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

SysBot приходит на помощь

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

25 янв. 2013 г. 23:05:04
Комментарии

Это объясняет, почему wp_insert_post при запуске через cron не добавлял термины таксономий!

MediaFormat MediaFormat
1 сент. 2023 г. 17:00:18