我试图将一个具有多个值的新属性添加到现有的WooCommerce产品中。
这是我正在使用的代码。我对其进行了简化以使其更加清晰。
$productId = 87356;
$attr = get_post_meta( $productId, '_product_attributes', true );
$gears = [ '3', '7' ];
$attr['pa_aantal-versnellingen'] = [
'name' => 'pa_aantal-versnellingen',
'value' => implode(' | ', $gears),
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
];
update_post_meta( $productId, '_product_attributes', $attr );
foreach ( $gears as $gear ) {
wp_set_object_terms( $productId, $gear, 'pa_aantal-versnellingen', true );
}
该属性出现在产品的属性列表中。但是,未添加这些条款。
数据库中也存在这些术语:
我做错了什么?我做了很多研究,读了一些其他问题,但是它们并没有帮助我。
Create new product attribute programmatically in Woocommerce
答案 0 :(得分:0)
研究了WordPress ERD之后,我想出了一种解决方法。
我使用普通的MySQL查询而不是wp_set_object_terms();
。
从term_taxonomy_id
表中获取wp_term_taxonomy
值
$placeholders = array_fill( 0, count( $gears ), '%s' );
$format = implode( ', ', $placeholders );
$sql =
"SELECT tt.term_taxonomy_id" .
"FROM {$wpdb->prefix}term_taxonomy tt" .
"JOIN {$wpdb->prefix}terms t ON tt.term_id = t.term_id" .
"WHERE tt.taxonomy = 'pa_aantal-versnellingen' AND t.name IN($format)"
;
$termTaxIds = $wpdb->get_results( $wpdb->prepare( $sql, $gears ), ARRAY_N );
对于每个term_taxonomy_id
值,在wp_term_relationships
表中插入一个新条目
foreach ( $termTaxIds as $termTaxId ) {
$insertSql =
"INSERT INTO {$wpdb->prefix}term_relationships" .
"(object_id, term_taxonomy_id, term_order)" .
"VALUES (%d, %d, 0)"
;
$wpdb->query( $wpdb->prepare( $$insertSql, $productId, $termTaxId[0] ) );
}