WordPress implode & wp_insert_post Frage

Vor ein paar Tagen habe ich begonnen, an meiner neuen WordPress-basierten Website zu arbeiten.

Ich habe ein Plugin, das eine Autos database zur Verfügung stellt. Ich möchte meine benutzerdefinierten Felder und Taxonomien automatisch ausfüllen, indem ich Informationen von diesem Plugin abrufe.

Also, ich habe eine benutzerdefinierte function in functions.php erstellt. Ich habe eine ID aus dem database-Plugin des Autos eingegeben und meine function füllt automatisch meine Felder, wenn ich den Post veröffentliche oder aktualisiere (wp_insert_post). Alles scheint gut zu funktionieren, aber …

In meiner function habe ich diesen Code:

if ( isset( $cardet['marks'] ) ) wp_set_object_terms( $post_id, implode(', ', $cardet["marks"]), 'mark' ); 

Was macht diese function? Es bekommt einfach 3-4 verschiedene Automarken von $ cardet [‘marks] und implodiert es. Dies ist nur für Taxonomien erforderlich.

Nachdem ich auf “Veröffentlichen” geklickt oder den Post aktualisiert habe,

Das ist OK, so sieht es auf der Seite “Post Edit” aus. Erstellt 3 verschiedene Begriffe.

funktioniert gut

Und das ist mein Problem. Wenn ich zu meiner Taxonomie-Seite gehe, habe ich Folgendes: Es hat nur einen Begriff erstellt:

nur 1 Begriff, warum?

Ich brauche wirklich deine Hilfe. Ich muss andere Begriffe haben. Kann keine Lösung dafür finden.

Solutions Collecting From Web of "WordPress implode & wp_insert_post Frage"

Der zweite Parameter für wp_set_object_terms() ein Array, eine Ganzzahl oder eine Zeichenfolge.

( array / int / string ) ( erforderlich ) Der Slug oder die ID des Begriffs (z. B. Kategorien- oder Tag-IDs) ersetzt alle vorhandenen verwandten Begriffe in dieser Taxonomie. Um alle Begriffe aus einem Objekt zu löschen oder zu entfernen, übergeben Sie eine leere Zeichenfolge oder NULL. Ganzzahlen werden als Tag-IDs interpretiert. Warnung: Einige functionen können term_ids als Zeichenfolgen zurückgeben, die als Nullen interpretiert werden, die aus numerischen Zeichen bestehen!

Sie erstellen ein Array ( $cardet["marks"] ), dann implode() . Wenn Sie implode() , drehen Sie dieses Array in eine durch Kommas getrennte Zeichenfolge, die wp_set_object_terms() als einen einzelnen Wert interpretiert. wp_set_object_terms() wird die Zeichenfolge für Kommas nicht wp_set_object_terms() und mehrere Begriffe für Sie erstellen, aber die Lösung ist einfach, da Sie einen Schritt hinzugefügt haben, der Dinge bricht. Entfernen Sie diesen Schritt und übergeben Sie das Array an wp_set_object_terms() .

 if ( isset( $cardet['marks'] ) ) wp_set_object_terms( $post_id, $cardet["marks"], 'mark' ); 

Es gibt Beispielcode im Codex, der genau dies tut, aber mit IDs:

 // An array of IDs of categories we want this post to have. $cat_ids = array( 6, 8 ); /* * If this was coming from the database or another source, we would need to make sure * these where integers: $cat_ids = array_map( 'intval', $cat_ids ); $cat_ids = array_unique( $cat_ids ); */ $term_taxonomy_ids = wp_set_object_terms( 42, $cat_ids, 'category' ); 

Wenn $cardet["marks"] Benutzer zur Verfügung gestellte Daten sind, bitte sanieren Sie es vor der Verwendung.

Implode verwandelt Ihr Array wie dieses array( 'Audi', 'BMW', 'Mercedes-Benz' ) in eine Zeichenfolge, die durch den im ersten Parameter der function gesetzten Begrenzer getrennt wird, in diesem Fall ein Komma und ein Leerzeichen. Auf diese Weise können Sie aus einem Array ein CSV machen. Das Ergebnis ist: Audi, BMW, Mercedes-Benz .

So wie WordPress funktioniert, sucht es nach einem existierenden Begriff (innerhalb dieser Taxonomie) und wenn keiner existiert, erstellt er einen neuen …

Im WordPress-Codex heißt es, dass die Begriffe als Array, Integer oder String angegeben werden können. Ich denke jedoch, dass die Integer- und String-Optionen zum Hinzufügen eines einzelnen Terms verwendet werden können. Ich glaube nicht, dass das den Code erneut explodiert String, und was noch wichtiger ist, das ist ein sinnloser process, ein Array zu implodieren und zu explodieren, wenn es sowieso ein Array braucht, und das ist das, was Sie in Ihrer Variable $cardet['marks'] .