У меня есть товары со следующими параметрами размера:
На странице редактирования продукта у меня есть только длина, ширина, высота (стандарт Woocomerce).
Я хочу добавить свой другие параметры размеров
Как я могу правильно добавить эти дополнительные размеры?
Для этого есть какой-нибудь фильтр?






Вы можете использовать для этого Настраиваемые поля или атрибуты продукта.
Есть несколько способов…
1) Использование атрибутов продукта: (без необходимости кодирования):


Преимущество: Эти другие атрибуты размеров будут отображаться на страницах продуктов.
Недостатки:
WC_Product для получения таких настраиваемых атрибутов продукта, как атрибуты измерения по умолчанию. Так что вывести их за пределы страницы продукта будет сложнее.2) Используя поля пользовательских настроек:
// Add custom fields to product shipping tab
add_action( 'woocommerce_product_options_dimensions', 'add_product_options_other_dimensions');
function add_product_options_other_dimensions(){
global $product_object;
$product_id = method_exists( $product_object, 'get_id' ) ? $product_object->get_id() : $product_object->id;
echo '</div><div class = "options_group">'; // New option group
woocommerce_wp_text_input( array(
'id' => '_diameter',
'label' => __( 'Diameter', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Diameter description help.', 'woocommerce' )
) );
woocommerce_wp_text_input( array(
'id' => '_thickness',
'label' => __( 'Thickness', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Thickness description help.', 'woocommerce' )
) );
woocommerce_wp_text_input( array(
'id' => '_circuit',
'label' => __( 'Circuit', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Circuit description help.', 'woocommerce' )
) );
}
// Save the custom fields values as meta data
add_action( 'woocommerce_process_product_meta', 'save_product_options_other_dimensions' );
function save_product_options_other_dimensions( $post_id ){
if ( isset( $_POST['_diameter'] ) )
update_post_meta( $post_id, '_diameter', esc_attr( $_POST['_diameter'] ) );
if ( isset( $_POST['_thickness'] ) )
update_post_meta( $post_id, '_thickness', esc_attr( $_POST['_thickness'] ) );
if ( isset( $_POST['_circuit'] ) )
update_post_meta( $post_id, '_circuit', esc_attr( $_POST['_circuit'] ) );
}
// Add custom fields to product variation settings
add_action( 'woocommerce_product_after_variable_attributes','add_variation_options_other_dimensions', 10, 3 );
function add_variation_options_other_dimensions( $loop, $variation_data, $variation ){
$variation_diameter = get_post_meta($variation->ID,"_diameter", true );
if ( ! $variation_diameter ) $variation_diameter = "";
$variation_thickness = get_post_meta($variation->ID,"_thickness", true );
if ( ! $variation_thickness ) $variation_thickness = "";
$variation_circuit = get_post_meta($variation->ID,"_circuit", true );
if ( ! $variation_circuit ) $variation_circuit = "";
echo '<p class = "form-field dimensions_field">';
woocommerce_wp_text_input( array(
'id' => '_diameter' . '_' . $loop,
'label' => __( 'Diameter', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Diameter description help.', 'woocommerce' ),
'value' => $variation_diameter
) );
woocommerce_wp_text_input( array(
'id' => '_thickness' . '_' . $loop,
'label' => __( 'Thickness', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Thickness description help.', 'woocommerce' ),
'value' => $variation_thickness
) );
woocommerce_wp_text_input( array(
'id' => '_circuit' . '_' . $loop,
'label' => __( 'Circuit', 'woocommerce' ),
'desc_tip' => 'true',
'description' => __( 'Circuit description help.', 'woocommerce' ),
'value' => $variation_circuit
) );
echo '</p>';
}
// Save product variation custom fields values
add_action( 'woocommerce_save_product_variation','save_variation_options_other_dimensions', 10 ,2 );
function save_variation_options_other_dimensions( $variation_id, $loop ){
$built_lenght = $_POST["_diameter_$loop"];
if ( isset($built_lenght) )
update_post_meta( $variation_id, '_built_lenght', esc_attr($built_lenght) );
$built_width = $_POST["_thickness_$loop"];
if ( isset($built_width) )
update_post_meta( $variation_id, '_built_width', esc_attr($built_width) );
$built_height = $_POST["_circuit_$loop"];
if ( isset($built_height) )
update_post_meta( $variation_id, '_built_height', esc_attr($built_height) );
}
Этот код находится в файле function.php вашей активной дочерней темы (или темы).
Вы получите это для продуктов:
И это для вариаций товаров (в настройках вариаций вариативных товаров):
Теперь, чтобы отобразить и получить эти значения, вам потребуется переопределить шаблон woocommerce через вашу тему, как описано в этой документации.
Файл, который нужно скопировать и переопределить с помощью вашей темы: шаблон single-product/product-attributes.php.
Вам нужно будет добавить в него некоторый код для отображения меток и значений настраиваемых дополнительных измерений сразу после отображаемых размеров по умолчанию.
Для вывода правильных значений вы будете использовать функцию get_post_meta().
Например, чтобы отобразить значение diameter, вы будете использовать:
<?php echo get_post_meta( $product->get_id(), '_diameter', true ); ?>
Привет, @LoicTheAztec, есть ли способ, которым они могут действовать как атрибуты Woocommerce? Я имею ввиду использовать их для фильтрации? или даже ссылку включили с собой? потому что, как я видел, они перешли к таблице wp_postmeta, а не wp_woocommerce_attribute_taxonomies