Программное добавление атрибута с автоматической установкой 'Показывать на странице товара' в WooCommerce

28 февр. 2015 г., 00:04:08
Просмотры: 16.4K
Голосов: 1

Я написал скрипт для импорта товаров в новую установку 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 (хотя большинство моих атрибутов имеют один термин), будет ли он отображаться, или наличие отмеченного чекбокса переопределяет его отображение?

1
Комментарии

Automattic приобрела Woozone, и вскоре Woocommerce станет частью ядра Wordpress. Прекратите закрывать эти вопросы как не по теме, это раздражает.

Dave Hilditch Dave Hilditch
27 янв. 2016 г. 23:21:45
Все ответы на вопрос 1
0

На самом деле это не имеет значения, потому что 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 );
28 февр. 2015 г. 02:10:45