wp_set_object_terms() nu înlocuiește termenul, ci creează unul nou

30 oct. 2014, 08:31:28
Vizualizări: 23.4K
Voturi: 5

Dintr-o Pagină Submeniu personalizată, dacă folosesc un cod direct precum:

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

Și reîmprospătez pagina, acesta pur și simplu atribuie Termenii de Taxonomie Personalizați doriți către CPT. Dar dacă procedez cu următorul cod, unde preiau valorile dintr-un <form>, nu funcționează ca mai sus.

if( $flightID !== NULL && $flightCat !== '-1' && !empty( $flightCat ) ) {
    $flightCount = count( $flightID );
    foreach ( $flightID as $post_id ) {
        $flightCategory = array( $flightCat ); //inactiv = 25, activ = 26
        wp_set_object_terms( $post_id, $flightCategory, 'flight_categories' );
    }
    $success = sprintf( __('<strong>SUCCES:</strong> %d Informații despre zbor au fost afectate', 'textdomain'), $flightCount);
} else {
    $error = __('<strong>EROARE:</strong> Nu poți transmite niciun câmp gol', 'textdomain');
}

Ce face acest bloc de cod, pur și simplu adaugă un nou Termen numit '25' cu slug-ul '25'. Am încercat să nu transmit un array precum mai jos:

$flightCategory = $flightCat;

Dar rezultatul este același. Ce fac greșit?

0
Toate răspunsurile la întrebare 1
1
17

În ambele cazuri, problema nu este legată de alte aspecte, ci de valoarea principală pe care o transmiți celui de-al doilea parametru, în cazul tău $flightCategory:

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

Dar în versiunea ulterioară, cumva sau literal, tu transmiți ceva de genul următor:

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

Ai observat GHILIMELELE SIMPLE în jurul lui 25? Aceasta este de fapt cauza problemei. Pentru că în primul dump de cod vei vedea:

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

Iar în al doilea:

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

De fapt, tu transmiți un șir de caractere, iar funcția înțelege asta: Bine, am primit Numele termenului, așa să fie. Dar cu un întreg, tu spui de fapt: Hei funcție, am primit acum ID-ul termenului, adaugă/actualizează doar ID-ul.

SOLUȚIE

Pentru a rezolva problema, trebuie să faci un lucru simplu:

$flightCategory = (int)$flightCat; //converteste-l la întreg orice ai primi

sau,

$flightCategory = array( (int)$flightCat ); //convertește valoarea din array la întreg orice ai primi

Află mai multe despre Conversia de tip în PHP.

30 oct. 2014 08:31:28
Comentarii

@MarkKaplun Nu consider că este o prostie deloc. Datorită modului în care este proiectat, avem libertatea de a denumi o categorie '25'. Conversia tipurilor este de fapt foarte importantă în multe cazuri.

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