wp_set_object_terms() non sostituisce il termine, ma ne crea uno nuovo
Da una Pagina Sottomenu personalizzata se uso un codice statico come:
$post_id = 111;
$flightCategory = array( 25 );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
E aggiorno la pagina, assegna semplicemente i Termini di Tassonomia Personalizzati desiderati al CPT. Ma se procedo con il seguente codice, dove prendo i valori da un <form>
, non funziona come prima.
if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
$flightCount = count( $flightID );
foreach ( $flightID as $post_id ) {
$flightCategory = array( $flightCat ); //inattivo = 25, attivo = 26
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
}
$success = sprintf( __('<strong>SUCCESSO:</strong> %d Informazioni di volo sono state modificate', 'textdomain'), $flightCount);
} else {
$error = __('<strong>ERRORE:</strong> Non puoi passare campi vuoti', 'textdomain');
}
Quello che questo blocco di codice sta facendo è semplicemente aggiungere un nuovo Termine chiamato '25' con slug '25'. Ho provato a non passare un array come di seguito:
$flightCategory = $flightCat;
Ma il risultato è lo stesso. Cosa sto facendo di sbagliato?

In entrambi i casi, il problema non sono le altre cose, ma il valore principale che stai inviando al secondo parametro, nel tuo caso $flightCategory
:
$flightCategory = array( 25 );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
Ma nella versione successiva, in qualche modo, o letteralmente, stai passando qualcosa come di seguito:
$flightCategory = array( '25' );
var_dump( $flightCategory );
wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
Hai notato gli APICI SINGOLI attorno a 25
? Questo è ciò che sta causando il problema. Perché nel primo dump del codice vedrai:
array(1) { [0]=> int(25) }
E nel secondo:
array(1) { [0]=> string(2) "25" }
In realtà stai passando una stringa, e la funzione interpreta: Ok, ho il Nome del termine, così sia. Ma con un numero intero stai dicendo: Ehi funzione, ora ho l'ID del termine, aggiungi/aggiorna solo l'ID.
SOLUZIONE
Per risolvere il problema devi fare una cosa semplice:
$flightCategory = (int)$flightCat; //convertilo in intero qualsiasi cosa tu ottenga
oppure,
$flightCategory = array( (int)$flightCat ); //converti il valore dell'array in intero qualsiasi cosa tu ottenga
Scopri di più sul Type casting in PHP.
