Это не дублирующий вопрос тем, например:
Проблема здесь не в добавлении атрибутов, как говорится. Я думаю, проблема в том, чтобы связать добавленные параметры атрибута с правильными терминами. Как видно на рисунках ниже, параметры атрибутов установлены правильно, но они не связаны с их терминами (как показано на рисунке 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 );
}
}
Во время работы над переносом некоторых атрибутов из одной базы данных в другую я столкнулся с проблемой, связанной с тем, что атрибуты передаются правильно, но они сохраняются в текстовом виде ...
and I need to manually click "Save attributes" in wordpress admin > product edit...
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 не распознает их как таксономии, даже если они являются действительными терминами / таксономиями.