wp_set_object_terms() non sostituisce il termine, ma ne crea uno nuovo

30 ott 2014, 08:31:28
Visualizzazioni: 23.4K
Voti: 5

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?

0
Tutte le risposte alla domanda 1
1
17

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.

30 ott 2014 08:31:28
Commenti

@MarkKaplun Non lo trovo affatto stupido. Grazie al suo design abbiamo la libertà di chiamare una categoria '25'. Il type casting è in realtà molto importante in molti casi.

Justin Waulters Justin Waulters
13 feb 2019 04:50:55