tax_input не работает в wp_insert_post

29 нояб. 2015 г., 19:35:09
Просмотры: 14.7K
Голосов: 10

Я использую 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  // Таксономии
);

Заранее спасибо за помощь

0
Все ответы на вопрос 7
2
28

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

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

29 нояб. 2015 г. 20:35:00
Комментарии

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

Chief Alchemist Chief Alchemist
28 дек. 2016 г. 18:13:08

Спасибо! Я уже начал лысеть, пытаясь понять, почему это работает у меня (вошедшего в систему), но не у пользователей (не вошедших). (Я пытаюсь добавить cpt после отправки формы.) Это, вероятно, стоит упомянуть в документации, потому что совсем не очевидно.

Studocwho Studocwho
19 сент. 2024 г. 22:40:51
0
11

Оказывается, tax_input не работает, если пользователь не имеет прав для работы с пользовательской таксономией:

wp-includes/post.php (wp_insert_post): Изображение с описанием проблемы в файле post.php

Поэтому либо добавьте соответствующие права, либо используйте wp_set_object_terms()

27 нояб. 2017 г. 15:18:57
0

Как вы упомянули в комментарии, что плагин будет обрабатывать фильтры и не имеет хука, я считаю, что плагин в любом случае должен иметь хук wp_insert_post. Иначе как вы добавляете запись? Отвечаю спустя столько времени, потому что столкнулся с той же проблемой и нашел единственное решение.

$new_id = wp_insert_post($post_arr, true);
$status = wp_set_object_terms($new_id, $term_id, 'location');

Здесь location - это слаг таксономии. Надеюсь, это кому-то поможет в будущем..

21 мар. 2019 г. 21:19:27
0

При использовании tax_input для вставки записи обязательно используйте ID терминов таксономии, поскольку slugs (ярлыки) или названия, похоже, игнорируются

$my_post = array(
'post_title'    => $title,
'post_content'  => $content,
'post_type'     => 'products',
'tax_input' => array('myTax', array(4,458,11478)),
);
6 окт. 2016 г. 16:46:36
1

Вопрос давний, но я потратил немало времени, чтобы понять, что функция вставки записи (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);
26 апр. 2020 г. 04:55:12
Комментарии

Это не сработало для меня

Thiago Dias Thiago Dias
8 нояб. 2023 г. 00:50:22
0

Как отметил @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 );

    }
20 июн. 2019 г. 10:16:52
0

Возможно, функция 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().

28 июн. 2023 г. 15:03:21