Недавно на одном из своих проектов я столкнулся с такой задачей: нужно было для всех старых заказов 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
Рекомендация: После того как вы поменяли для нужных товаров лимит времени и сохранили изменения, лучше удалить код или закомментировать его, чтобы он не нагружал сайт лишний раз при последующем сохранении товаров.