Программное добавление атрибута с автоматической установкой 'Показывать на странице товара' в WooCommerce
Я написал скрипт для импорта товаров в новую установку WooCommerce.
Товары имеют атрибуты, настроенные в админке. Этот фрагмент кода добавляет атрибуты при импорте.
update_post_meta($product_id, 'common_name', $product['common_name']);
wp_set_object_terms($product_id, $product['flowering_period'], 'pa_flowering');
wp_set_object_terms($product_id, $product['native_plant'], 'pa_native');
Однако при проверке атрибута товара в админке, чекбокс 'Показывать на странице товара' не отмечен.
Есть ли способ установить этот флаг при использовании вышеуказанной функции? ИЛИ Имеет ли значение, отмечен этот чекбокс или нет? Если я вызову атрибут в шаблоне напрямую, используя что-то вроде get_the_term_list (хотя большинство моих атрибутов имеют один термин), будет ли он отображаться, или наличие отмеченного чекбокса переопределяет его отображение?
На самом деле это не имеет значения, потому что WooCommerce использует это для отображения:
$values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
Однако, если вы не установите отображение в true, вам придется добавить этот код в ваши файлы шаблонов. Возможно, вам также потребуется сделать другие вещи (стилизация и т.д.). Если вы просто установите отображение в true, вам не нужно ничего делать. WooCommerce позаботится об этом.
Вот как примерно это делает WooCommerce (/includes/class-wc-ajax.php):
wp_set_object_terms( $product_id, $values, $attribute_name);
// получаем существующие атрибуты
$attributes = get_post_meta( $product_id, '_product_attributes' );
$attributes[ sanitize_title( $attribute_name ) ] = array(
'name' => wc_clean( $attribute_name ),
'value' => $values,
'position' => $attribute_position, // порядок отображения
'is_visible' => $is_visible, // это тот параметр, который вам нужен, установите в true
'is_variation' => $is_variation, // установите в true, если атрибут будет использоваться для вариаций
'is_taxonomy' => $is_taxonomy // установите в true
);
// эта часть сортирует атрибуты перед сохранением на основе значения position
// это определено WooCommerce, но если ваш импорт запускается до загрузки WooCommerce, эта функция будет недоступна
if ( ! function_exists( 'attributes_cmp' ) ) {
function attributes_cmp( $a, $b ) {
if ( $a['position'] == $b['position'] ) {
return 0;
}
return ( $a['position'] < $b['position'] ) ? -1 : 1;
}
}
uasort( $attributes, 'attributes_cmp' );
// обновляем данные
update_post_meta( $post_id, '_product_attributes', $attributes );
