Возможно ли добавить произвольные поля к термину атрибута WooCommerce?
В Wordpress / WooCommerce
, возможно ли добавить произвольные поля к термину атрибута WooCommerce
?
Под "атрибутами" я имею в виду общие атрибуты, а не атрибуты в рамках продуктов.
Пожалуйста, посмотрите изображение ниже для более подробной информации:
Возможно ли сделать это с помощью плагина ACF
(Advanced Custom Fields)?
Спасибо!
Да, это возможно. И есть простое руководство здесь.
Ниже приведен рабочий код, который вы можете добавить в основной файл темы functions.php:
// Добавляем пользовательский тип правила.
add_filter( 'acf/location/rule_types', function( $choices ){
$choices[ __("Другое",'acf') ]['wc_prod_attr'] = 'Атрибут товара WC';
return $choices;
} );
// Добавляем пользовательские значения правила.
add_filter( 'acf/location/rule_values/wc_prod_attr', function( $choices ){
foreach ( wc_get_attribute_taxonomies() as $attr ) {
$pa_name = wc_attribute_taxonomy_name( $attr->attribute_name );
$choices[ $pa_name ] = $attr->attribute_label;
}
return $choices;
} );
// Сопоставление пользовательского правила.
add_filter( 'acf/location/rule_match/wc_prod_attr', function( $match, $rule, $options ){
if ( isset( $options['taxonomy'] ) ) {
if ( '==' === $rule['operator'] ) {
$match = $rule['value'] === $options['taxonomy'];
} elseif ( '!=' === $rule['operator'] ) {
$match = $rule['value'] !== $options['taxonomy'];
}
}
return $match;
}, 10, 3 );
Вы получите что-то вроде этого на экране создания/редактирования группы полей ACF:
ОБНОВЛЕНО 25 сентября 2018 (UTC)
В функции для сопоставления правила на странице редактирования термина $options['ef_taxonomy']
был изменен на $options['taxonomy']
— в то время ключ массива taxonomy
не существовал (в моем случае), а сейчас он существует, что, как я думаю, заменяет ключ ef_taxonomy
. Спасибо @JordanCarter за обнаружение проблемы с ключом и @VadimH за первоначальное редактирование ответа. =)
В этой функции я также добавил проверку if ( isset( $options['taxonomy'] ) )
, чтобы избежать уведомления PHP о "неопределенном" значении. Спасибо @JordanCarter за обнаружение этого.
@VadimH, вы можете использовать get_field( '{ИМЯ}', 'term_{ID ТЕРМИНА}' )
для получения (и отображения) значения поля, например:
$term_id = 123;
$value = get_field( 'мое_поле', 'term_' . $term_id );
См. раздел "Получение значения из разных объектов" в официальной документации функции get_field()
.
Примечание: Весь код (не только get_field()
) был протестирован на ACF 5.7.6 и ACF PRO 5.7.3, с WooCommerce 3.4.5.

Опция WC Product Attribute отсутствует в интерфейсе (ACF Pro v.5.7.3; WC v.3.4.3)

Это решение сработало для меня, но мне пришлось заменить $options['ef_taxonomy'] на $options['taxonomy'] в фильтре Matching custom rule

Спасибо @JordanCarter. Насколько я помню, этот ключ тогда не был доступен. Поэтому всем, кто это читает: используйте $options['taxonomy']
, а не $options['ef_taxonomy']

@VadimH Я только что протестировал код на ACF 5.7.6 и ACF PRO 5.7.3, с WooCommerce 3.4.5, и код по-прежнему работает хорошо, за исключением $options['ef_taxonomy']
, который должен быть $options['taxonomy']
.

@SallyCJ Вообще-то, я столкнулся с сообщением об ошибке на странице отдельного товара, где говорилось, что ключ "taxonomy" не существует. Я обернул весь фрагмент в условный оператор IF с array_key_exists

@SallyCJ Ой, извините, забыл вставить код в functions.php. После исправления $options всё заработало, спасибо (я только что отредактировал этот ответ, сейчас он проходит проверку). Следующий вопрос: как получить значение этого произвольного поля на фронтенде сайта?
