Установить цену продажи товара на основе пользовательских полей в Woocommerce
В Woocommerce я установил два пользовательских поля в своих продуктах:
iadi_price
по индивидуальной цене продажи.iadi_date
на заказную дату.
Я хотел бы обновить цену продажи, если между указанной датой и сегодняшним днем осталось менее 3 дней.
Я написал следующий код:
function fiyatidegistir() {
global $product;
$bugun = time();
$yenifiyat = get_post_meta($product->ID, 'iadi_price', true); //new sale price
$kgn = get_post_meta($product->ID, 'iadi_date', true); // date
if(!empty($kgn)) {
$kalan = $kgn - $bugun;
$dakika = $kalan / 60;
$saat = $dakika / 60;
$gun = $saat / 24;
$yil = floor($gun/365);
$gun_farki = floor($gun - (floor($yil) * 365));
if($gun_farki<4 && !empty($yenifiyat)) {
update_post_meta($product->ID, '_price', $yenifiyat);
}
}
}
add_action( 'woocommerce_before_main_content', 'fiyatidegistir');
Но это не работает, и ничего не происходит.
Что я делаю неправильно? Как я могу изменить цену продажи продукта программно на основе настраиваемых полей цены и даты?
1 ответ
Делать это таким образом не очень хорошая идея, так как:
- Как вы будете управлять продуктами, которые были обновлены, чтобы избежать нескольких последовательных обновлений цен.
- Используя этот способ, он просто убьет ваш веб-сайт (для многих процессов)
- Ваши продукты не будут продаваться, когда вы обновите активную цену
- Вы не сможете вернуться к первоначальной цене, когда период закончится.
Также ваш код полон ошибок, касающихся WC_Products в Woocommerce и расчета даты. Последнее, когда вы пишете код, лучше называть переменные и функции на английском языке, комментировать ваш код на английском языке, так как каждый может его понять.
Вместо этого попробуйте следующее, которое будет работать для простых продуктов, отображая цену продажи для связанных продуктов, когда ваши условия соответствуют (дата и пользовательская цена):
add_filter( 'woocommerce_product_get_price', 'conditional_product_sale_price', 20, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'conditional_product_sale_price', 20, 2 );
function conditional_product_sale_price( $price, $product ) {
if( is_admin() ) return $price;
$new_price = get_post_meta( $product->get_id(), 'iadi_price', true ); //new sale price
$date = get_post_meta( $product->get_id(), 'iadi_date', true ); // date
if( ! empty($date) && ! empty($new_price) ) {
$date_time = (int) strtotime($date); // Convert date in time
$now_time = (int) strtotime("now"); // Now time in seconds
$one_day = 86400; // One day in seconds
// Calculate the remaining days
$remaining_days = floor( ( $date_time - $now_time ) / $one_day );
if( $remaining_days >= 0 && $remaining_days < 4 )
$price = $new_price;
}
return $price;
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.
Если вы пришли сюда, чтобы он работал с вариациями, вам понадобятся все следующие фильтры:
add_filter( 'woocommerce_product_get_price', 'conditional_product_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_price', 'conditional_product_sale_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'conditional_product_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'conditional_product_sale_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_price', 'conditional_product_sale_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_sale_price', 'conditional_product_sale_price', 10, 2 );
И вам нужно убедиться, что вы изменили woocommerce_get_variation_prices_hash из-за сохраненных переходных процессов.
Вы можете найти суть, которую я создал для клиента, полезной