اگر سایت خود را با ووکامرس راهاندازی کردهاید و قصد دارید محصولات دانلودی با ووکامرس بهفروش برسانید، یک مشکل اساسی با محصولات دانلودی خواهید داشت. مشکل این هست که اگر فایل محصولات دانلودی ووکامرس را آپدیت کنید یا فایل جدیدی به لیست فایلها اضافه کنید، کاربر شما نمیتواند لینک دانلود فایل جدید را مشاهده کند و همچنان لینکهای دانلودی که موقع خرید دریافت کرده را مشاهده خواهد کرد. در این مقاله میخواهم نحوه حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی را به شما توضیح دهم.
حل مشکل آپدیت نشدن لینک دانلود ووکامرس
برای حل این مشکل باید ووکامرس را مجبور به بررسی و ارائه لینکهای دانلود بهصورت لحظهای کنیم. وقتی در ووکامرس سفارشی ثبت میشود، در متاهای سفارش، لیست محصولات و لیست فایلهای دانلود شده قرار میگیرد. حالا برای آپدیت کردن فایل دانلودی هیچ راهی نیست و کاربر فقط میتواند به فایلهای قبلی دسترسی داشته باشد.
اما هیچوقت محدودیتی در استفاده از وردپرس و ووکامرس نداریم. چرا که با استفاده از PHP و هوکهای وردپرس میتوانیم محدودیتها را به صورت کامل کنار بگذاریم.
برای حل این مشکل کافیست کد زیر را به فایل functions.php قالب سایتتان اضافه کنید:
class WooCommerce_Legacy_Grant_Download_Permissions {
protected static $instance = null;
private function __construct() {
if ( ! class_exists( 'WC_Admin_Post_Types', false ) ) {
return;
}
remove_action( 'woocommerce_process_product_file_download_paths', array( 'WC_Admin_Post_Types', 'process_product_file_download_paths' ), 10, 3 );
add_action( 'woocommerce_process_product_file_download_paths', array( $this, 'grant_download_permissions' ), 10, 3 );
}
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self;
}
return self::$instance;
}
public function grant_download_permissions( $product_id, $variation_id, $downloadable_files ) {
global $wpdb;
if ( $variation_id ) {
$product_id = $variation_id;
}
if ( ! $product = wc_get_product( $product_id ) ) {
return;
}
$existing_download_ids = array_keys( (array) $product->get_downloads() );
$updated_download_ids = array_keys( (array) $downloadable_files );
$new_download_ids = array_filter( array_diff( $updated_download_ids, $existing_download_ids ) );
$removed_download_ids = array_filter( array_diff( $existing_download_ids, $updated_download_ids ) );
if ( ! empty( $new_download_ids ) || ! empty( $removed_download_ids ) ) {
$existing_orders = $wpdb->get_col( $wpdb->prepare( "SELECT order_id from {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE product_id = %d GROUP BY order_id", $product_id ) );
foreach ( $existing_orders as $existing_order_id ) {
$order = wc_get_order( $existing_order_id );
if ( $order ) {
if ( ! empty( $removed_download_ids ) ) {
foreach ( $removed_download_ids as $download_id ) {
if ( apply_filters( 'woocommerce_process_product_file_download_paths_remove_access_to_old_file', true, $download_id, $product_id, $order ) ) {
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d AND product_id = %d AND download_id = %s", $order->get_id(), $product_id, $download_id ) );
}
}
}
if ( ! empty( $new_download_ids ) ) {
foreach ( $new_download_ids as $download_id ) {
if ( apply_filters( 'woocommerce_process_product_file_download_paths_grant_access_to_new_file', true, $download_id, $product_id, $order ) ) {
if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT 1=1 FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d AND product_id = %d AND download_id = %s", $order->get_id(), $product_id, $download_id ) ) ) {
wc_downloadable_file_permission( $download_id, $product_id, $order );
}
}
}
}
}
}
}
}
}
add_action( 'admin_init', array( 'WooCommerce_Legacy_Grant_Download_Permissions', 'get_instance' ) );
به همین راحتی! حالا با خیال راحت فایلهای دانلودی خود را آپدیت کنید.این کد دسترسی به تمام فایلهای موجود در محصول خریداری شده را برای کاربران قبلی آزاد خواهد کرد.
موفق باشید.
- مشکلی دارید؟ جواب خود را در پست فروم بگیرید
- منبع : بیست اسکریپت لطفا رعایت کنید