wp_set_object_terms() не заменяет термин, а создает новый

30 окт. 2014 г., 08:31:28
Просмотры: 23.4K
Голосов: 5

Если из пользовательской страницы подменю я использую жестко закодированный вариант:

$post_id = 111;
$flightCategory = array( 25 );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

И обновляю страницу, она просто назначает нужные термины пользовательской таксономии для CPT. Но если я использую следующий код, где я беру значения из <form>, он не работает как предыдущий.

if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
    $flightCount = count( $flightID );
    foreach ( $flightID as $post_id ) {
        $flightCategory = array( $flightCat ); // неактивный = 25, активный = 26
        wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
    }
    $success = sprintf( __('<strong>УСПЕШНО:</strong> %d Информация о полете была изменена', 'textdomain'), $flightCount);
} else {
    $error = __('<strong>ОШИБКА:</strong> Нельзя передавать пустые поля', 'textdomain');
}

Этот блок кода просто добавляет новый термин с названием '25' и ярлыком '25'. Я попробовал не передавать массив, как показано ниже:

$flightCategory = $flightCat;

Но результат тот же. Что я делаю неправильно?

0
Все ответы на вопрос 1
1
17

В обоих случаях проблема не в других вещах, а в основном значении, которое вы передаёте во второй параметр, в вашем случае $flightCategory:

$flightCategory = array( 25 );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

Но в более поздней версии, каким-то образом, или буквально вы передаёте что-то вроде этого:

$flightCategory = array( '25' );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );

Вы заметили ОДИНАРНЫЕ КАВЫЧКИ вокруг 25? Это как раз и вызывает проблему. Потому что в первом коде дамп будет выглядеть так:

array(1) { [0]=> int(25) }

А во втором случае:

array(1) { [0]=> string(2) "25" }

Вы фактически передаёте строку, и функция понимает это как: Хорошо, я получил название термина, пусть будет так. Но с целым числом вы фактически говорите: Эй, функция, теперь я получил ID термина, добавь/обнови только ID.

РЕШЕНИЕ

Чтобы решить проблему, вам нужно сделать простую вещь:

$flightCategory = (int)$flightCat; //преобразовать в целое число, что бы вы ни получили

или

$flightCategory = array( (int)$flightCat );  //сделать значение массива целым числом, что бы вы ни получили

Узнайте больше о приведении типов в PHP.

30 окт. 2014 г. 08:31:28
Комментарии

@MarkKaplun Я не считаю это глупым. Благодаря такой реализации у нас есть свобода называть категорию, например, '25'. Приведение типов действительно очень важно во многих случаях.

Justin Waulters Justin Waulters
13 февр. 2019 г. 04:50:55