Rufen Sie den Begriff nach Namen ab, indem Sie den nicht bereinigten Namenswert verwenden

Lesezeit: 4 Minuten

Benutzer-Avatar
jameshwart lopez

Was ich versuche, ist, die Woocommerce-Produktkategorie programmgesteuert festzulegen.

Was ich habe, ist der Begriff Name test & sample und die Post-ID 9also um die Produktkategorie festzulegen, die ich verwendet habe get_term_by und wp_set_object_terms

$name="test & sample";
$posid = 9;
//get the term based on name
$term = get_term_by('name', $name, 'product_cat');
//set woocommerce product category
wp_set_object_terms($posid, $term->term_id, 'product_cat');

Wie Sie sehen können, ist mein Problem der unsaubere Wert von $name. Was ich bisher gemacht habe, ist ersetzen & mit & welche Arbeit.

$name = str_replace('&', '&', 'test & sample');
$posid = 9;
//get the term based on name
$term = get_term_by('name', $name, 'product_cat');
//if term does exist,then use set object terms
if(false != $term){
  //set woocommerce product category
  wp_set_object_terms($posid, $term->term_id, 'product_cat');
}
//if the term name doe not exist I will do nothing

Meine Frage ist, wie man einen Begriff nach Namen mit einem nicht bereinigten Namenswert erhält oder wie man den Namenswert bereinigt, um die Begriffs-ID richtig zu erhalten.

Sie könnten versuchen, die zu reinigen $name mit $name = esc_html( $name ); bevor Sie es weitergeben get_term_by(). Ich glaube, WordPress konvertiert spezielle HTML-Zeichen in Begriffen, Beitragstiteln, Beitragsinhalten usw. in ihre entsprechenden HTML-Entitäten, sodass die Zeichen beim Rendern der Seite richtig angezeigt werden.

Beispiel:

$name = esc_html('test & sample'); // cleanses to 'test & sample'
$posid = 9;
$term = get_term_by('name', $name, 'product_cat');
wp_set_object_terms($posid, $term->term_id, 'product_cat');

  • Es sollte alle HTML-Zeichen aus dem Begriffsnamen maskieren, wie z <, >und &, die WordPress mit den Tag-Namen vornimmt, bevor sie in der Datenbank gespeichert werden, sodass sie nur einmal bereinigt werden müssen und nicht jedes Mal, wenn der Begriffsname angezeigt wird. Dies sollte Ihnen helfen, den richtigen Begriff nur mit dem Namen zu finden.

    – Scheinsup

    26. Februar 2016 um 16:00 Uhr

  • Danke für die Hilfe. Plus eins für dich 🙂

    – Jameshwart Lopez

    27. Februar 2016 um 13:45 Uhr

WordPress bereinigt Begriffsnamen durch sanitize_term_field (nach einer Kette von Funktionen erledigt es die eigentliche Arbeit). Suchen Sie die Code wir können das sehen name durchläuft zwei Filter: 'edit_term_name' und 'edit_category_name' (Linien 1880 und 1893). Es scheint, dass WordPress keine Funktionen an diese Filter anschließt, also findet die einzige Transformation in Zeile 1898 statt; $value = esc_attr($value);

Das heißt, Sie können verwenden $name = esc_attr('test & sample'); und das sollte reichen 😉

  • Danke für die Hilfe. Plus eins für dich 🙂

    – Jameshwart Lopez

    27. Februar 2016 um 13:45 Uhr

Benutzer-Avatar
Igor Jawytsch

Versuche Folgendes:

$name="test & sample";
$postid = 9;
$term = get_term_by('name', apply_filters( 'pre_term_name', $name, 'product_cat'), 'product_cat');
if (is_object($term)) 
{
    wp_set_object_terms($postid, $term->term_id, 'product_cat');
}

  • sanitize_title funktioniert nicht, da es & durch – und Leerzeichen ohne Leerzeichen ersetzt.

    – Jameshwart Lopez

    26. Februar 2016 um 3:54 Uhr

  • @jameshwartlopez das ist genau der Punkt. sanitize_titlewird ein produzieren slug du würdest dafür bekommen test & sample wenn Sie in das Tag-Eingabefeld in wp-admin eingeben. get_term_by sucht dann nach dem Begriff by slug. Sie können auch weglassen get_term_by und geben Sie einfach Ihren unsauberen Namen an wp_set_object_terms wie in der letzten Codezeile in meiner Antwort gezeigt. Es wird einen Begriff erstellen, wenn er nicht existiert, oder einen vorhandenen verwenden, wenn dies der Fall ist. Haben Sie es sogar versucht, bevor Sie gesagt haben, dass es nicht funktioniert?

    – Igor Jawytsch

    26. Februar 2016 um 4:09 Uhr

  • Eigentlich get_term_by('slug' muss nicht sein desinfiziert und es ist nicht das, was ich brauche, weil ich die Begriffe nach Namen und nicht nach Slug erhalten möchte. Mein Problem besteht darin, den Namen zu entkommen. Ich hoffe, Sie verstehen mich.

    – Jameshwart Lopez

    26. Februar 2016 um 10:21 Uhr


  • Ich sehe nicht, woher Sie es haben, dass es nicht desinfiziert werden muss. Ich habe keine Ahnung, warum du so versessen darauf bist, es durchzubringen name Anstatt von slug. Das Ergebnis ist immer noch das gleiche – Sie erhalten immer noch falsch, wenn die Taxonomie nicht existiert und wp_term widersprechen, wenn ja.

    – Igor Jawytsch

    26. Februar 2016 um 11:45 Uhr


  • Auf Zeile 857 in dem Link, den ich gepostet habe. Sie können sehen, dass der Wert mit demselben Code sanitize_title() bereinigt wird, wenn ‘slug’== $field. Warum ich Name statt Slug verwenden möchte, liegt daran, dass dies die einzigen Informationen sind, die ich von außerhalb von wp habe. Ich habe nur einen Namen, um zu prüfen, ob ein Produkt eine Kategorie haben soll oder nicht. Deshalb brauche ich einen Namen und keine Schnecke. Ich erhalte den Kategorienamen von der API-Antwort, daher ist es meiner Meinung nach die beste Wahl, den Begriff nach Namen abzurufen, wenn er in woo existiert. Wenn der Kategoriename in woo nicht existiert, gibt es keinen Grund, die Kategorie zu erstellen.

    – Jameshwart Lopez

    26. Februar 2016 um 15:01 Uhr

1353070cookie-checkRufen Sie den Begriff nach Namen ab, indem Sie den nicht bereinigten Namenswert verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy