Как изменить срок загрузки для старых заказов WooCommerce

Недавно на одном из своих проектов я столкнулся с такой задачей: нужно было для всех старых заказов WooCommerce установить срок загрузки для скачиваемых товаров. Изначально во всех товарах не было ограничений по сроку загрузки и клиенты получали возможность скачивать купленный файлы навсегда, но со временем появилась необходимость для всех заказов старых и новых установить временной лимит на скачивание товаров.

Если у вас тоже появилась такая необходимость, то предлагаю свой вариант. Вопросы, правки и дополнения приветствуются в комментариях.

Готовый код

Данный код вставляем в файл functions.php вашей темы, а ниже я дам пояснения по функционалу.

add_action( 'woocommerce_update_product', 'wpgid_update_download_access', 10, 1 );
function wpgid_update_download_access( $product_id ) {
    
    $order_ids = wpgid_get_orders_id_from_product_id($product_id);  // получаем ID заказов, которые имеют сохраняемый товар
    $product = new WC_Product($product_id);                         // Получаем объект продукта
    $days = $product->get_download_expiry();                        // Получаем количество дней срока загрузки

    // проходим по всем заказам и меняем для нашего товара срок загрузки
    foreach ($order_ids as $order_id) {
        $order                  = wc_get_order( $order_id );
        $data                   = $order->get_data();
        $order_date             = $data['date_created']->date('Y-m-d');
        $data_store             = WC_Data_Store::load( 'customer-download' );    
        $download_permissions   = $data_store->get_downloads(
            [
                'order_id' => $order->get_id()
            ]
        );
        
        if ( $download_permissions && count( $download_permissions ) > 0 ) {
            foreach ( $download_permissions as $download ) {
                $download_access_date = date("Y-m-d", strtotime($order_date.'+ ' . $days . ' days'));
                $download = new WC_Customer_Download( $download->get_id() );
                $download->set_access_expires( $download_access_date );
                $download->save();
            }
        }
    }
}

function wpgid_get_orders_id_from_product_id( $product_id ) {
    global $wpdb;

    $table_posts = $wpdb->prefix . "posts";
    $table_items = $wpdb->prefix . "woocommerce_order_items";
    $table_itemmeta = $wpdb->prefix . "woocommerce_order_itemmeta";

    // Статусы заказов
    $orders_statuses = "'wc-completed', 'wc-processing', 'wc-on-hold'";

    // Запрос ID заказов с определенными статусами и наличием ID продукта
    $orders_ids = $wpdb->get_col( "
        SELECT $table_items.order_id
        FROM $table_itemmeta, $table_items, $table_posts
        WHERE  $table_items.order_item_id = $table_itemmeta.order_item_id
        AND $table_items.order_id = $table_posts.ID
        AND $table_posts.post_status IN ( $orders_statuses )
        AND $table_itemmeta.meta_key LIKE '_product_id'
        AND $table_itemmeta.meta_value LIKE '$product_id'
        ORDER BY $table_items.order_item_id DESC"
    );

    $orders_ids = array_unique($orders_ids);

    // возвращаем массив ID заказов для данного ID продукта
    return $orders_ids;
}

Как это работает

Код приведённый выше содержит в себе 2 функции и 1 хук, которые в итоге позволяют поменять лимит загрузки для товара во всех заказах с нужными нам статусами, причем делать это при сохранении товара.

  • woocommerce_update_product - хук который срабатывает во время сохранения товара
  • wpgid_update_download_access - функция привязанная к хуку, обновляет количество дней до окончания доступа к загрузке товара во всех заказах, которые связанны с сохраняемым продуктом.
  • wpgid_get_orders_id_from_product_id - вспомогательная функция, собирает нужные ID заказов из базы данных, для последующей обработки в функции wpgid_update_download_access

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

Дима
С движком WordPress познакомился в 2015 году и сразу начал его осваивать. Очень понравилось копаться в коде и создавать что-то новое. Создаю темы и плагины WP в первую очередь для себя, но возможно мои наработки и куски кода кому-то пригодятся, поэтому создал этот блог.