Всем привет
Столкнулся с такой проблемой, нужно чтоб функция брала значение из короткого описания товара, и если в коротком описании товара обнаруживается значение, котое соответствует значению глобального аттрибута size, id=3, то при сохранении или обновлении товара нужно добавлять значения аттрибутов в аттрибут size данного товара.
Сгенерил на нейросети код, но он выводит как локальный аттрибут, не как глобальный, изза этого не получится фильтровать товары фильтром, вот код:
Помогите решить проблему, если меняю $attribute->set_id(0) на $attribute->set_id(3), а id аттрибута 3, то выводит не верные значения.
Столкнулся с такой проблемой, нужно чтоб функция брала значение из короткого описания товара, и если в коротком описании товара обнаруживается значение, котое соответствует значению глобального аттрибута size, id=3, то при сохранении или обновлении товара нужно добавлять значения аттрибутов в аттрибут size данного товара.
Сгенерил на нейросети код, но он выводит как локальный аттрибут, не как глобальный, изза этого не получится фильтровать товары фильтром, вот код:
function add_attribute_on_short_description($post_id) {
$product = wc_get_product($post_id);
if ($product->get_type() === 'simple') { // Проверяем, что это простой товар
$short_description = $product->get_short_description();
// Значения для добавления в атрибут "size"
$values_to_add = array(38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60);
// Получаем текущие значения атрибута "size"
$current_values = array();
$attributes = $product->get_attributes();
if (isset($attributes['pa_size'])) {
$current_values = $attributes['pa_size']->get_options();
}
// Удаляем значения из атрибута "size", если они не присутствуют в коротком описании
foreach ($current_values as $key => $value) {
if (strpos($short_description, (string)$value) === false) {
unset($current_values[$key]);
}
}
// Добавляем значения из короткого описания, если они отсутствуют в атрибуте "size"
foreach ($values_to_add as $value) {
if (strpos($short_description, (string)$value) !== false && !in_array($value, $current_values)) {
$current_values[] = $value;
}
}
// Упорядочиваем значения атрибута "size" по возрастанию
sort($current_values);
// Создаем новый атрибут "size" с обновленными значениями
$attribute = new WC_Product_Attribute();
$attribute->set_id(0);
$attribute->set_name('pa_size');
$attribute->set_options(array_values($current_values));
$attribute->set_visible(true);
$attribute->set_variation(false);
$product->set_attributes(array('pa_size' => $attribute));
$product->save(); // Сохраняем изменения товара
wc_delete_product_transients($post_id); // Обновляем кэш для новых атрибутов
}
}
// Добавляем атрибут "size" при сохранении товара
add_action('woocommerce_process_product_meta_simple', 'add_attribute_on_short_description');
add_action('woocommerce_process_product_meta_variation', 'add_attribute_on_short_description');
add_action('save_post', 'add_attribute_on_short_description');
add_action('woocommerce_new_product', 'add_attribute_on_short_description');
// Выводим значения атрибута "size" товаров
function save_wc_custom_attributes($post_id, $custom_attributes) {
foreach ($custom_attributes as $name => $value) {
$product_attributes[] = array(
'name' => htmlspecialchars(stripslashes($name)), // set attribute name
'value' => $value, // set attribute value
'position' => 1,
'is_visible' => 1,
'is_variation' => 0,
'is_taxonomy' => is_array($value) ? 1 : 0,
);
}
update_post_meta($post_id, '_product_attributes', $product_attributes);
}
// Пример записи значений атрибута "size" для товара с ID = $id
$_product_attributes = array();
$_product_attributes['pa_size'] = array(38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60);
save_wc_custom_attributes($id, $_product_attributes);
Помогите решить проблему, если меняю $attribute->set_id(0) на $attribute->set_id(3), а id аттрибута 3, то выводит не верные значения.