Я хочу показать значок «бесплатная доставка» на каждый товар по цене выше 50 $.
Это должно быть видно на странице товара и в цикле.
Проблема в том, что может быть более одной цены. Если вы думаете о вариациях и продажах (или даже вариациях с вариантами в продаже).
Поэтому мне нужно проверить тип продукта и найти самую дешевую цену для расчета.
На данный момент я использую следующий код.
Иногда работает нормально. Но для продуктов без активного управления запасами он выдает тайм-аут на странице продукта и не работает с архивами (сообщение не отображается).
Кроме того, он производит некоторые уведомления о том, что не использует идентификатор напрямую.
Я не чувствую себя в безопасности с этим кодом … Есть ли лучший способ его архивировать?
Я пробовал много способов, но я не уверен, думаю ли я о каждой возможности о цене, продажах, наличии или типах продуктов ?!
<?php add_action( 'wgm_after_tax_display_single', 'wgm_after_tax_display_single_free_delivery', 10, 1 );
function wgm_after_tax_display_single_free_delivery( ) {
if (is_product()):
global $post, $product;
if ( ! $product->is_in_stock() ) return;
$sale_price = get_post_meta( $product->id, '_price', true);
$regular_price = get_post_meta( $product->id, '_regular_price', true);
if (empty($regular_price)){ //then this is a variable product
$available_variations = $product->get_available_variations();
$variation_id=$available_variations[0]['variation_id'];
$variation= new WC_Product_Variation( $variation_id );
$regular_price = $variation ->regular_price;
$sale_price = $variation ->sale_price;
}
if ( $sale_price >= 50 && !empty( $regular_price ) ) :
echo 'free delivery!';
else :
echo 'NO free delivery!';
endif;
endif;
} ?>
Поскольку вы используете пользовательский хук, сложно проверить его на самом деле (так же, как вы)… Теперь этот пересмотренный код должен работать намного лучше, чем ваш (решение проблем):
add_action( 'wgm_after_tax_display_single', 'wgm_after_tax_display_single_free_delivery', 10, 1 );
function wgm_after_tax_display_single_free_delivery() {
// On single product pages and archives pages
if ( is_product() || is_shop() || is_product_category() || is_product_tag() ):
global $post, $product;
if ( ! $product->is_in_stock() ) return;
// variable products (get min prices)
if ( $product->is_type('variable') ) {
$sale_price = $product->get_variation_sale_price('min');
$regular_price = $product->get_variation_regular_price('min');
}
// Other products types
else {
$sale_price = $product->get_sale_price();
$regular_price = $product->get_regular_price();
}
$price = $sale_price > 0 ? $sale_price : $regular_price;
if ( $price >= 50 ) {
echo __('free delivery!');
} else {
echo __('NO free delivery!');
}
endif;
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Это должно работать лучше.
Других решений пока нет …