WP+Woocommerce – как изменить таблицу атрибутов товара
Стандартный вывод атрибутов товара предполагает построчное их выведение в таблицу в левом столбце которой находится название атрибута, в правом значение. Таблица будет помещена во вкладку "Дополнительно". На картинки ниже, вывод карточки товаров в стандартном wp шаблоне twentysixteen:
Информацию том как работать в WooCommerce с атрибутами товаров, вынес в отдельную статью - О атрибутах товара в WooCommerce. Здесь же сосредоточимся на коде вывода и его модификации.
Файл отвечающий за построение таблицы на вкладке "Дополнительной информации" в карточке товара:
wp-content/plugins/woocommerce/templates/single-product/product-attributes.php
Его необходимо скопировать в вашу тему (подробнее о способах создание woocommerce темы):
wp-content/themes/*ВАША-ТЕМА*/woocommerce/single-product/product-attributes.php
Стандартное содержимое файла в Woocommerce 3.0.9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<?php /** * Product attributes * * Used by list_attributes() in the products class. * * This template can be overridden by copying it to yourtheme/woocommerce/single-product/product-attributes.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://docs.woocommerce.com/document/template-structure/ * @author WooThemes * @package WooCommerce/Templates * @version 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; } ?> <table class="shop_attributes"> <?php if ( $display_dimensions && $product->has_weight() ) : ?> <tr> <th><?php _e( 'Weight', 'woocommerce' ) ?></th> <td class="product_weight"><?php echo esc_html( wc_format_weight( $product->get_weight() ) ); ?></td> </tr> <?php endif; ?> <?php if ( $display_dimensions && $product->has_dimensions() ) : ?> <tr> <th><?php _e( 'Dimensions', 'woocommerce' ) ?></th> <td class="product_dimensions"><?php echo esc_html( wc_format_dimensions( $product->get_dimensions( false ) ) ); ?></td> </tr> <?php endif; ?> <?php foreach ( $attributes as $attribute ) : ?> <tr> <th><?php echo wc_attribute_label( $attribute->get_name() ); ?></th> <td><?php $values = array(); if ( $attribute->is_taxonomy() ) { $attribute_taxonomy = $attribute->get_taxonomy_object(); $attribute_values = wc_get_product_terms( $product->get_id(), $attribute->get_name(), array( 'fields' => 'all' ) ); foreach ( $attribute_values as $attribute_value ) { $value_name = esc_html( $attribute_value->name ); if ( $attribute_taxonomy->attribute_public ) { $values[] = '<a href="' . esc_url( get_term_link( $attribute_value->term_id, $attribute->get_name() ) ) . '" rel="tag">' . $value_name . '</a>'; } else { $values[] = $value_name; } } } else { $values = $attribute->get_options(); foreach ( $values as &$value ) { $value = esc_html( $value ); } } echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values ); ?></td> </tr> <?php endforeach; ?> </table> |
Файл можно разделить на два участка -
- Вывод веса и размеров товара;
- Цикл по всем атрибутам.
Различные способы вывода таблицы атрибутов
Для того чтобы отобразить таблицу в другом месте, необходимо сначала отключить фильтром стандартный вызов шаблона атрибутов, затем добавить код вызова в том месте в котором требуется вывести атрибуты. Всё это можно реализовывать с помощью изменения стандартных событий, которых в WooCommerce добавлено достаточное количество. Подробнее о WordPress событиях (вызовы / хуки / зацепки).
Атрибуты выводятся во вкладке "Дополнительная информация", а сами вкладки вызываются в файле "content-single-product.php" событием -
do_action( 'woocommerce_after_single_product_summary' );
К этому событию привязаны несколько выводов - блок вкладок, блок товаров по скидке и блок рекомендуемых товаров. Чтобы отключить только вывод вкладки "Дополнительная информация", добавьте этот код, например в functions.php вашего шаблона
1 2 3 4 5 6 7 8 9 10 |
add_filter('woocommerce_product_tabs', 'remove_tab_additional', 100); if (!function_exists('remove_tab_additional')) { function remove_tab_additional($tabs = array()) { unset($tabs['additional_information']); // Удалить вкладку "Дополнительная информация" // unset($tabs['description']); // Удалить вкладку "Описание" // unset($tabs['reviews']); // Удалить вкладку "Отзывы" return $tabs; } } |
Как видно по закомментированным строкам, подобным образом можно удалить другие, ненужные вам вкладки. Чтобы полностью отключить вывод вкладок, достаточно удалить событие, следующем кодом:
remove_action('woocommerce_after_single_product_summary', 'woocommerce_output_product_data_tabs',10);
Если необходимо добавить таблицу атрибутов перед вкладками - тогда подключаем их вывод к событию "woocommerce_after_single_product_summary" с приоритетом меньше 10:
add_action('woocommerce_after_single_product_summary', 'woocommerce_product_additional_information_tab', 4);
Когда атрибутов немного, можно вывести их в правый блок под ценой, для это добавьте событие в "woocommerce_single_product_summary"
add_action('woocommerce_single_product_summary', 'woocommerce_product_additional_information_tab',70);
Для того чтобы не привязываться к различным событиям, а вывести шаблон атрибутов в любом необходимом вам месте (в пределах шаблонов карточки товара), можно воспользоваться следующим кодом:
do_action( 'woocommerce_product_additional_information', $product );
Обратите внимание — что при добавление события, обязательным аргументом является объект продука. Обычно эта переменная определена в самом начале файлов шаблона карточки товара, если её нет добавьте:
global $product;