web-dev-qa-db-fra.com

wp_set_object_terms () ne remplace pas le terme, mais en crée un nouveau

À partir d'une page de sous-menu personnalisée si j'utilise un code dur tel que:

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

Et actualisez la page, il affecte simplement les termes de taxonomie personnalisée souhaités au CPT. Mais si je continue avec le code suivant, où je prends les valeurs d'un <form>, il ne fonctionnera pas comme auparavant.

if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
    $flightCount = count( $flightID );
    foreach ( $flightID as $post_id ) {
        $flightCategory = array( $flightCat ); //inactive = 25, active = 26
        wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
    }
    $success = sprintf( __('<strong>SUCCESS:</strong> %d Flight information has been affected', 'textdomain'), $flightCount);
} else {
    $error = __('<strong>ERROR:</strong> You can\'t pass any empty field', 'textdomain');
}

Ce que fait ce bloc de code, il ajoute simplement un nouveau terme nommé "25" avec un slug "25". J'ai essayé de ne pas passer un tableau comme ci-dessous:

$flightCategory = $flightCat;

Mais le résultat est identique. Qu'est-ce que je fais mal?

3
Mayeenul Islam

Dans les deux cas, le problème n'est pas les autres choses, mais la valeur principale de ce que vous envoyez au deuxième paramètre, dans votre cas, $flightCategory:

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

Mais sur la version ultérieure, vous passez littéralement quelque chose comme ci-dessous:

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

Avez-vous noté le DEVIS UNIQUE autour de 25? C'est en fait la cause du problème. Parce que sur le premier dump de code, vous verrez:

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

Et sur le second:

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

Vous passez en fait une chaîne, et la fonction comprend que, OK, j'ai le Nom du terme , ainsi soit-il. Mais avec un entier que vous dites réellement, Hey, vous avez maintenant l’identifiant du terme, ajoutez/mettez à jour l’ID uniquement}.

SOLUTION

Pour résoudre le problème, vous devez faire une chose simple:

$flightCategory = (int)$flightCat; //make it integer whatever you get

ou,

$flightCategory = array( (int)$flightCat );  //make the array value integer whatever you get

En savoir plus sur PHP Transtypage de types .

9
Mayeenul Islam