Добавить атрибуты в продукт WooCommerce с помощью PHP - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь добавить новый атрибут с несколькими значениями в существующий продукт 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

Что я делаю не так? Я провел много исследований, прочитал некоторые другие вопросы, но они мне не помогли.

Создать новый атрибут продукта программно в Woocommerce

1 Ответ

0 голосов
/ 08 января 2019

После изучения WordPress ERD я нашел обходной путь.

enter image description here

Вместо wp_set_object_terms(); я использую простые запросы MySQL.

  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] ) );
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...