В вашем коде есть ошибки и ошибки:
- Крюк
woocommerce_single_product_summary_price
не существует;
- Вам нужно добавить
global $product;
, чтобы получить WC_Product
объект, так как wc_get_product()
равен null
.
- Нет разницы между простым и переменным товаром, чтобы получить класс отгрузки товара.
- Для значков используйте
<span class="onsale"> … </span>
вместо <div class="woocommerce-info"> … </div>
, который используется в уведомлениях Woocommerce ...
- Вы можете объединить ваши 2 функции в одну, так как они используют один и тот же хук и приоритет
Также ваш вопрос не совсем понятен и понятен.
Следующий пересмотренный код будет отображать условно настраиваемые значки для определенных определенных классов доставки и тега продукта, а также для простых продуктов, отличных от переменных:
add_action( 'woocommerce_before_single_product_summary', 'additional_single_product_badges', 10 );
function additional_single_product_badges() {
global $product;
## ---- SHIPPING CLASSES ---- ##
// Define the related shipping classes data in this multidimensional array
$shipping_class_badges_data = [
'10' => ['2019/03/10-shipping-small.gif' => '$10 Flat Rate'],
'bulk1' => ['2019/03/Bulky1.gif' => 'Bulky class 1'],
'bulk2' => ['2019/03/Bulky2.gif' => 'Bulky class 2'],
];
if( $shipping_class = $product->get_shipping_class() ) {
foreach( $shipping_class_badges_data as $key => $badge ) {
if ( $shipping_class == $key ) {
foreach( $badge as $img_src => $alt_text ) {
$html = '<a href="'.home_url("/shipping-policy/").'" "target="_blank">';
$html .= '<img src="'.home_url("/wp-content/uploads/".$img_src).'" alt="'.$alt_text.'" />';
$html .= '</a>';
}
echo ' <span class="onsale shipping-badge">'.$html.'</span>';
break;
}
}
}
## ---------- TAGS ---------- ##
// Define the related product tags data in this multidimensional array
$product_tags_badges_data = [
'amarock' => ['2019/03/Asset-4.png' => 'Tag (test)'],
];
// Get the product tag(s) set in the current product
$product_tags_slugs = wp_get_post_terms( $product->get_id(), 'product_tag', ['fields' => 'slugs'] );
if( sizeof($product_tags_slugs) > 0 ) {
foreach( $product_tags_badges_data as $key => $badge ) {
if ( in_array($key, $product_tags_slugs) ) {
foreach( $badge as $img_src => $alt_text ) {
$html = '<img src="'.home_url("/wp-content/uploads/".$img_src).'" alt="'.$alt_text.'" />';;
}
echo ' <span class="onsale tag-badge">'.$html.'</span>';
}
}
}
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.
Посмотрите его в действии на этом переменном продукте снимок экрана:
Связано с вашими комментариями , для вариантов продукта:
Чтобы заставить его работать для вариантов продукта :
Вы можете установить класс доставки по умолчанию в родительской переменной product.
Если каждый вариант продукта имеет свой класс доставки, это не будет работать .
Это требует чего-то другого и довольно сложного с javascript, поскольку варианты продукта выбираются / изменяются на стороне клиента (прямое событие) , поэтому PHP не может справиться с этим в одиночку.