Пустая корзина пользователя без выхода из системы, через 72 часа в WooCommerce

#php #wordpress #datetime #woocommerce #cart

#php #wordpress #дата и время #woocommerce #Корзина

Вопрос:

Я пытаюсь программно очистить корзину пользователя после 72 часов бездействия. Есть ли способ узнать, когда корзина обновлялась в последний раз?

Я попытался получить дамп переменной cart, но нигде не смог найти временную метку, указывающую, когда пользователь в последний раз что-то туда добавлял.

Пожалуйста, не хотите использовать плагин для этого!

Ответ №1:

Следующий ниже код будет устанавливать временную метку в качестве пользовательских данных элемента корзины каждый раз, когда товар добавляется в корзину:

 // Set current date time as custom item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data_timestamp', 10, 3 );
function add_cart_item_data_timestamp( $cart_item_data, $product_id, $variation_id ) {
    // Set the shop time zone (List of Supported Timezones: https://www.php.net/manual/en/timezones.php)
    date_default_timezone_set( 'Europe/Paris' );

    $cart_item_data['timestamp'] = strtotime( date('Y-m-d h:i:s') );

    return $cart_item_data;
}
  

Затем следующая подключенная функция очистит корзину, когда последний добавленный товар будет добавлен через 72 часа:

 // Empty cart after 3 days
add_filter( 'template_redirect', 'empty_cart_after_3_days' );
function empty_cart_after_3_days(){
    if ( WC()->cart->is_empty() ) return; // Exit

    // Set the shop time zone (List of Supported Timezones: https://www.php.net/manual/en/timezones.php)
    date_default_timezone_set( 'Europe/Paris' );

    // Set the threshold time in seconds (3 days in seconds)
    $threshold_time  = 3 * 24 * 60 * 60;
    $threshold_time  = 1 * 60 * 60;

    $cart_items      = WC()->cart->get_cart(); // get cart items
    $cart_items_keys = array_keys($cart_items); // get cart items keys array
    $last_item       = end($cart_items); // Last cart item
    $last_item_key   = end($cart_items_keys); // Last cart item key
    $now_timestamp   = strtotime( date('Y-m-d h:i:s') ); // Now date time

    if( isset($last_item['timestamp']) amp;amp; ( $now_timestamp - $last_item['timestamp'] ) >= $threshold_time ) {
        WC()->cart->empty_cart(); // Empty cart
    }
}
  

Ввод кода functions.php файл вашей активной дочерней темы (или активной темы). Протестировано и работает.

Комментарии:

1. Большое вам спасибо! Я ждал 12 часов, чтобы проверить, работает ли это. Большое вам за это спасибо. Хорошего дня!

2. 10, 3 означает: нет приоритета (1 много, 10 мало) и количество аргументов функции (3) developer.wordpress.org/reference/functions/add_filter