Сначала код целевого купона должен быть установлен как ограниченный только для целевого продукта:
Следующий код будет применяться определенный купон (скидка) только на определенный товар в корзине, если промежуточный итог корзины (исключая этот конкретный товар) составляет до $40
:
add_action('woocommerce_before_calculate_totals', 'discount_based_on_total_threshold');
function discount_based_on_total_threshold( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Your settings
$coupon_code = 'summer'; // Coupon code
$amount_threshold = 40; // Total amount threshold
$targeted_product = 37; // Targeted product ID
// Initializing variables
$total_amount = 0;
$applied_coupons = $cart->get_applied_coupons();
$coupon_code = sanitize_text_field( $coupon_code );
$found = false;
// Loop through cart items
foreach( $cart->get_cart() as $cart_item ) {
if( ! in_array( $targeted_product, array( $cart_item['product_id'], $cart_item['data']->get_id() ) ) ) {
// Get the cart total amount (excluding the targeted product)
$total_amount += $cart_item['line_total'] + $cart_item['line_tax'];
} else {
// Targeted product is found
$found = true;
}
}
// Applying coupon
if( ! in_array($coupon_code, $applied_coupons) && $found && $total_amount >= $amount_threshold ){
$cart->add_discount( $coupon_code );
}
// Removing coupon
elseif( in_array($coupon_code, $applied_coupons) && ( $total_amount < $amount_threshold || ! $found ) ){
$cart->remove_coupon( $coupon_code );
}
}
код помещается в файл function.php вашего активного ребенка тема (или активная тема). Проверено и работает.
Я использовал memcached для Linux (есть версии для Windows и MacOS, а также почти для любой другой ОС), это довольно просто.
Я имел дело с непосредственно, используя TIDTelnet, читая документацию протокола , я использовал только set , get , delete и quit .
Я использовал команды такого типа (я установил и получил «name», 14 - это число байтов, которое нужно сохранить):
osama@osama:~$ telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set name 0 0 14
Osama Alassiry
STORED
get name
VALUE name 0 14
Osama Alassiry
END
quit
memcached позволяет хранить до 1 МБ на ключ кеша, I использовали составные ключи, такие как «Person | 17 | name», «Person | 17 | picture», «Employee | 7 | Salary | Basic» (это вымышленные имена, не связанные с тем, что я действительно делал) ... Я сохранил некоторые двоичные файлы в кеше как base64, что позволяет использовать до 768k двоичных данных.
memcached также может распространяться на несколько серверов путем хеширования ключей и выбора одного из нескольких серверов на основе их хеш-функции.
The caching mechanism needs hand-rolling.
Splay Trees are a useful and straightforward mechanism for storing cached objects, and also detecting how stale they are.
Если вы хотите создать свой собственный, вы, вероятно, хотите сделать это во Freepascal, как это имеет работающую 64-битную поддержку. Вместо бинарных деревьев сплайнов я бы предложил k-ary.
Эти платформы предоставляют некоторый способ кэширования объектов
В зависимости от ваших точных требований, эти может быть сверх. Если вы попытаетесь реализовать собственное решение, я бы посоветовал вам взглянуть на различные контейнеры в VCL джедая в качестве отправной точки.
Хорошо. Я, вероятно, в конечном итоге буду чувствовать себя глупо по этому поводу, но в чем проблема с TStringList? Я использовал динамический массив довольно структурированных данных с TStringList, чтобы найти элемент на основе идентификатора строки. Недавно я обновил TStringList до THashedStringList. Это может быть немного быстрее, но пока ничего особенного. Компоновка StringList / Array обеспечила отличную производительность моего приложения.
До сих пор я кэшировал от 100 до 150 записей, но я ожидаю, что он будет работать нормально, возможно, до нескольких тысяч. В бизнесе, которым я занимаюсь, это довольно большая операция.
Клиент Delphi для Memcached можно найти в коде Google: