wp_set_object_terms() не заменяет термин, а создает новый
Если из пользовательской страницы подменю я использую жестко закодированный вариант:
$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;
Но результат тот же. Что я делаю неправильно?

В обоих случаях проблема не в других вещах, а в основном значении, которое вы передаёте во второй параметр, в вашем случае $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.
