wp_set_object_terms() no está reemplazando el término, sino creando uno nuevo
Desde una página de submenú personalizada, si uso un código estático como:
$post_id = 111;
$flightCategory = array( 25 );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
Y actualizo la página, simplemente asigna los Términos de Taxonomía Personalizados deseados al CPT. Pero si procedo con el siguiente código, donde estoy tomando los valores de un <form>
, no funciona como el anterior.
if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
$flightCount = count( $flightID );
foreach ( $flightID as $post_id ) {
$flightCategory = array( $flightCat ); //inactivo = 25, activo = 26
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
}
$success = sprintf( __('<strong>ÉXITO:</strong> %d Información de vuelo ha sido afectada', 'textdomain'), $flightCount);
} else {
$error = __('<strong>ERROR:</strong> No puedes pasar ningún campo vacío', 'textdomain');
}
Lo que este bloque de código está haciendo es simplemente añadir un nuevo Término llamado '25' con el slug '25'. Intenté no pasar un array como se muestra a continuación:
$flightCategory = $flightCat;
Pero el resultado es el mismo. ¿Qué estoy haciendo mal?

En ambos casos, el problema no son otras cosas, sino el valor principal que estás enviando al segundo parámetro, en tu caso $flightCategory
:
$flightCategory = array( 25 );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
Pero en la versión posterior, de alguna manera o literalmente, estás pasando algo como esto:
$flightCategory = array( '25' );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
¿Notaste las COMILLAS SIMPLES alrededor del 25
? Eso es lo que realmente está causando el problema. Porque en el primer código verás:
array(1) { [0]=> int(25) }
Y en el segundo:
array(1) { [0]=> string(2) "25" }
Realmente estás pasando una cadena, y la función entiende que, Bien, recibí el nombre del término, así será. Pero con un entero en realidad estás diciendo, Oye función, ahora recibí el ID del término, añade/actualiza solo el ID.
SOLUCIÓN
Para resolver el problema tienes que hacer algo simple:
$flightCategory = (int)$flightCat; //conviértelo a entero sin importar lo que obtengas
o,
$flightCategory = array( (int)$flightCat ); //convierte el valor del array a entero sin importar lo que obtengas
Aprende más sobre Type casting en PHP.
