使用PHP向WooCommerce产品添加属性

时间:2019-01-07 15:46:28

标签: php wordpress woocommerce

我试图将一个具有多个值的新属性添加到现有的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 );
}

该属性出现在产品的属性列表中。但是,未添加这些条款。

enter image description here

数据库中也存在这些术语:

enter image description here

我做错了什么?我做了很多研究,读了一些其他问题,但是它们并没有帮助我。

Create new product attribute programmatically in Woocommerce

1 个答案:

答案 0 :(得分:0)

研究了WordPress ERD之后,我想出了一种解决方法。

enter image description here

我使用普通的MySQL查询而不是wp_set_object_terms();

  1. 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 );
    
  2. 对于每个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] ) );
    }