Was ich versuche, ist, die Woocommerce-Produktkategorie programmgesteuert festzulegen.
Was ich habe, ist der Begriff Name test & sample
und die Post-ID 9
also 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');
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 😉
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');
}