Атрибуты, добавленные с помощью методов Woocommerce, не связаны должным образом - PullRequest
0 голосов
/ 03 августа 2020

Это не дублирующий вопрос тем, например:

Проблема здесь не в добавлении атрибутов, как говорится. Я думаю, проблема в том, чтобы связать добавленные параметры атрибута с правильными терминами. Как видно на рисунках ниже, параметры атрибутов установлены правильно, но они не связаны с их терминами (как показано на рисунке 1 [текст вместо параметра атрибута серого фона, как показано на рисунке 3]), хотя я запускаю вручную set_object_terms для каждого продукта, и связь установлена ​​правильно в базе данных.

foreach($terms as $term_id) {
    $term = get_term( $term_id );
    $term_name = $term->name;
    $term_taxonomy = $term->taxonomy;
    $term_slug = $term->slug;
                            
    if( ! has_term( $term_name, $term_taxonomy, $parent_id ) ) {
        $set_terms = wp_set_object_terms($parent_id, $term_slug, $term_taxonomy, true );
    }
                            
}

Во время работы над переносом некоторых атрибутов из одной базы данных в другую я столкнулся с проблемой, связанной с тем, что атрибуты передаются правильно, но они сохраняются в текстовом виде ...

enter image description here

and I need to manually click "Save attributes" in wordpress admin > product edit...

enter image description here

for it to actually register correctly in the system as can be seen here.

введите описание изображения здесь

Основная проблема заключается в том, что в текстовой форме, как показано на первом снимке экрана, атрибуты фактически не видны в магазине, обращенном к пользователю, и они также недоступны в вариантах продукта.

Я использую методы woocommerce для обновления продуктов. Вот пример кода:

$attribute_object = new WC_Product_Attribute();
$attribute_object->set_name( $attribute_name );
$attribute_object->set_options( $value );
$attribute_object->set_visible(1);
$attribute_object->set_variation(1);
$attribute_object->set_position(0);
$attribute_object->set_id( 0 );
$new_product_attributes[$attribute_name] = $attribute_object;
$new_product->set_attributes($new_product_attributes);
                        
$new_product->save();

Как мне заставить WP синхронизировать c продукт с новыми добавленными атрибутами / значениями атрибутов?

В чем разница между параметры атрибутов, как показано на рисунке 1 и на рисунке 3 (с серым фоном)?

ПРОСТОЙ КОД ДЛЯ ВОСПРОИЗВЕДЕНИЯ ПРОБЛЕМЫ

<?php
require_once(rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/wp-load.php');

global $wpdb;
wp_cache_flush();


$objProduct = new WC_Product_Variable();

$objProduct->set_name("Product Title");
$objProduct->set_status("publish");  // can be publish,draft or any wordpress post status
$objProduct->set_catalog_visibility('visible'); // add the product visibility status
$objProduct->set_description("Product Description");
$objProduct->set_sku("product-sku"); //can be blank in case you don't have sku, but You can't add duplicate sku's
$objProduct->set_price(10.55); // set product price
$objProduct->set_regular_price(10.55); // set product regular price
$objProduct->set_manage_stock(true); // true or false
$objProduct->set_stock_quantity(10);
$objProduct->set_stock_status('instock'); // in stock or out of stock value
$objProduct->set_backorders('no');
$objProduct->set_sold_individually(false);

$product_attributes = [];
$attribute_list = array('pa_marime' => array('l','m')); // -- choose any existing taxonomy and two existing attribute options belonging to that taxonomy (terms)

foreach($attribute_list as $attribute_name => $value) {
    $attribute_object = new WC_Product_Attribute();
    $attribute_object->set_name( $attribute_name );
    $attribute_object->set_options( $value );
    $attribute_object->set_visible( 1 );
    $attribute_object->set_variation( 1 );
    $attribute_object->set_id( 0 );
    $product_attributes[$attribute_name] = $attribute_object;
}

$objProduct->set_attributes($product_attributes);

$product_id = $objProduct->save();

$terms_list = [];

foreach($attribute_list as $attribute_name => $value) {
    foreach($value as $val) {
        $term = term_exists($val, $attribute_name);
        if($term) {
            array_push($terms_list, $term['term_id']);
        }
    }
}

foreach($terms_list as $term_id) {
    $term = get_term( $term_id );
    $term_name = $term->name;
    $term_taxonomy = $term->taxonomy;
    $term_slug = $term->slug;
    
    if( ! has_term( $term_name, $term_taxonomy, $product_id ) ) {
        $set_terms = wp_set_object_terms($product_id, $term_slug, $term_taxonomy, true );   
    }
    
}

Протестировал код в установке Wordpress со следующими характеристиками:

Версия WP: 5.4.2 Версия Woocommerce: 4.2.0

Возможно, работает и с другими версиями.

======= =========== РЕДАКТИРОВАТЬ: ДОПОЛНИТЕЛЬНЫЕ ДЕТАЛИ ==========================

Я понял в основном происходит то, что при установке атрибутов woocommerce не распознает параметры атрибута как таксономии.

Array
(
    [pa_marime] => Array
        (
            [name] => pa_marime
            [value] => 1444 | 1445
            [position] => 0
            [is_visible] => 1
            [is_variation] => 1
            [is_taxonomy] => 0
        )

)

Итак, теперь вопрос:

Каков правильный формат для предоставления в WC_Product_Attribute () -> set_options () для метода set_attributes, чтобы распознавать значения как таксономии?

* 1 053 * Я пробовал:
$values = array(term_1_id, term_2_id); // array of existing term ids
$values = array('term_1_id' => 'term_1_name', 'term_2_id' => 'term_2_name'); // array of existing term_id and term_name pairs
$values = array('term_1_name', 'term_2_name); // array of existing term names
$values = array('term_1_slug', 'term_2_slug); // array of existing term slugs

Все вышеперечисленное приводит к тому, что wc_product-> set_attributes не распознает их как таксономии, даже если они являются действительными терминами / таксономиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...