wp_set_object_terms() no está reemplazando el término, sino creando uno nuevo

30 oct 2014, 08:31:28
Vistas: 23.4K
Votos: 5

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?

0
Todas las respuestas a la pregunta 1
1
17

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.

30 oct 2014 08:31:28
Comentarios

@MarkKaplun No creo que sea estúpido en absoluto. Debido a su diseño, tenemos la libertad de nombrar una categoría como '25'. La conversión de tipos es realmente muy importante en muchos casos.

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