حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی

5 / 5. تعداد رای: 3

حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی

اگر سایت خود را با ووکامرس راه‌اندازی کرده‌اید و قصد دارید محصولات دانلودی با ووکامرس به‌فروش برسانید، یک مشکل اساسی با محصولات دانلودی خواهید داشت. مشکل این است که اگر فایل محصولات دانلودی ووکامرس را آپدیت کنید یا فایل جدیدی به لیست فایل‌ها اضافه کنید، کاربر شما نمی‌تواند لینک دانلود فایل جدید را مشاهده کند و همچنان لینک‌های دانلودی که موقع خرید دریافت کرده را مشاهده خواهد کرد. در این مقاله می‌خواهم نحوه حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی را به شما توضیح دهم.

انتقال زیرساخت میهن وردپرس به ووکامرس

اگر اطلاع داشته باشید در حال تغییر سیستم فروش سایت میهن وردپرس از Easy Digital Downloads به ووکامرس هستیم. پس از اتمام انتقال طی یک لایو اینستاگرامی دلیل انجام این‌کار را همراه با روند انجام انتقال توضیح خواهیم داد. اما اولین مشکلی که با استفاده از ووکامرس با آن مواجه شدیم این بود که لینک‌های دانلود پس از آپدیت شدن، در اختیار کاربر قرار نمی‌گرفتند. این مشکل اساسی بود که یکی از کاربران عزیز سایت نیز سوالی در مرکز پشتیبانی درباره نحوه برطرف کردن آن پرسیده بودند. پس تصمیم گرفتیم نحوه حل این مشکل را با شما در میان بگذاریم.

حل مشکل آپدیت نشدن لینک دانلود ووکامرس

برای حل این مشکل باید ووکامرس را مجبور به بررسی و ارائه لینک‌های دانلود به‌صورت لحظه‌ای کنیم. وقتی در ووکامرس سفارشی ثبت می‌شود، در متاهای سفارش، لیست محصولات و لیست فایل‌های دانلود شده قرار می‌گیرد. حالا برای آپدیت کردن فایل دانلودی هیچ راهی نیست و کاربر فقط می‌تواند به فایل‌های قبلی دسترسی داشته باشد.

اما هیچ‌وقت محدودیتی در استفاده از وردپرس و ووکامرس نداریم. چرا که با استفاده از 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' ) );

به همین راحتی! حالا با خیال راحت فایل‌های دانلودی خود را آپدیت کنید.این کد دسترسی به تمام فایل‌های موجود در محصول خریداری شده را برای کاربران قبلی آزاد خواهد کرد.

موفق باشید.

نظر شما در این مورد چیه؟

  1. U331578 ۱ آذر ۱۴۰۳

    عرض سلام و احترام.
    دوستانی که از php 8.1 استفاده می‌کنن. من کد php که در افزونه grant-download-permissions-for-past-woocommerce-orders وجود داشت رو با توابع مدرن‌تر به صورت خاص برای php 8.1 بازنویسی کردم که کارشناسان میهن وردپرس هم میتونن بررسی کنن. این کد به طور خاص برای php 8.1 بهینه شده ولی در php 7.4 هم به درستی کار میکنه و بعد از آپدیت محصول، یک رکورد جدید با تاریخ به‌روز در جدول woocommerce_downloadable_product_permissions برای خریداران قبلی ثبت میکنه و همین ثبت رکورد جدید برای خریداران قبلی باعث میشه که خریداران قبلی به آپدیت محصولات دانلودی دسترسی داشته باشن:
    کد php:

    if ( ! defined( ‘ABSPATH’ ) ) {
    exit; // Exit if accessed directly.
    }

    /**
    * WooCommerce_Legacy_Grant_Download_Permissions class.
    */
    class WooCommerce_Legacy_Grant_Download_Permissions {

    /**
    * Instance of this class.
    *
    * @var object|null
    */
    protected static $instance = null;

    /**
    * Initialize the plugin actions.
    */
    private function __construct() {
    // Stop if WooCommerce isn’t activated.
    if ( ! class_exists( ‘WC_Admin_Post_Types’, false ) ) {
    return;
    }

    // Remove WooCommerce 3.0 download permission action.
    remove_action( ‘woocommerce_process_product_file_download_paths’, [ ‘WC_Admin_Post_Types’, ‘process_product_file_download_paths’ ], 10, 3 );

    // Backwards compatibility method.
    add_action( ‘woocommerce_process_product_file_download_paths’, [ $this, ‘grant_download_permissions’ ], 10, 3 );
    }

    /**
    * Return an instance of this class.
    *
    * @return object A single instance of this class.
    */
    public static function get_instance(): self {
    // If the single instance hasn’t been set, set it now.
    return self::$instance ?? ( self::$instance = new self );
    }

    /**
    * Grant download permissions like WooCommerce 2.6.
    *
    * This method performs a heavy query and should be used cautiously.
    *
    * @param int $product_id Product identifier.
    * @param int $variation_id Optional product variation identifier.
    * @param array $downloadable_files Newly set files.
    */
    public function grant_download_permissions( int $product_id, int $variation_id, array $downloadable_files ) {
    global $wpdb;

    // Ensure correct product_id in case of variation.
    $product_id = $variation_id ?: $product_id;

    $product = wc_get_product( $product_id );
    if ( ! $product ) {
    return;
    }

    $existing_download_ids = array_keys( (array) $product->get_downloads() );
    $updated_download_ids = array_keys( (array) $downloadable_files );

    // Determine new and removed download IDs
    $new_download_ids = array_diff( $updated_download_ids, $existing_download_ids );
    $removed_download_ids = array_diff( $existing_download_ids, $updated_download_ids );

    if ( empty( $new_download_ids ) && empty( $removed_download_ids ) ) {
    return;
    }

    // Fetch all orders associated with this product.
    $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 $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
    continue;
    }

    // Remove permissions for old files
    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
    ) );
    }
    }

    // Add permissions for new files
    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 ) ) {
    // Grant permission if it doesn’t already exist
    $exists = $wpdb->get_var( $wpdb->prepare(
    “SELECT 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
    ) );

    if ( ! $exists ) {
    wc_downloadable_file_permission( $download_id, $product_id, $order );
    }
    }
    }
    }
    }
    }

    // Initialize the plugin
    add_action( ‘admin_init’, [ ‘WooCommerce_Legacy_Grant_Download_Permissions’, ‘get_instance’ ] );

  2. U315296 ۲۱ شهریور ۱۴۰۳

    سلام
    سوالی که برایم هست اینه که چرا این قطعه کد را در بروزرسانی های اهورا وارد نمیکنید؟
    تا هر دفعه کاربران مجبور نشوند محتویات فایل function را ویرایش کنند.
    با احترام

  3. U41451 ۱۹ مهر ۱۴۰۲

    سلام و درود
    من یک سایت آموزشی دارم و یکی از دانشجوها یک آموزشی رو خریداری کرده ولی در پنل کاربریش وارد نشده، و فقط محصول قبلیش در پروفایلش نشان داده میشه.

  4. U4852 ۲۸ دی ۱۴۰۱

    سلام و درود
    قالبی که فایل functions.php اون کد گذاری شده و امکان اضافه کردن کد بهش رو نداریم
    چطوری از این کد استفاده کنیم؟
    ممنون میشم راهنماییم کنید

    • Reza Rad رضا راد ۵ بهمن ۱۴۰۱

      سلام طبیعتا باید کدها رو ابتدا decrypt کنید با ابزارهای موجود که معمولا کار سختیه و توسط کسی که کدگذاری شده باید decrypt بشه.

  5. U319896 ۶ دی ۱۴۰۱

    سلام و احترام ممنون از آموزش مفیدتون ،من استفاده کردم کد مشکلی نداشت و برای محصولاتی که از قبل در پنل کاربران بودند عمل کرد ، من درخواستم درباره این است : محصولی که هنگام ایجاد فایل دانلودیش وارد نشده بود در ووکامرس و منتشر شده و خریدار خرید کرده ، و به طبع در پنلش فایلی قرار نگرفته ، الان راهی هست ( کد یا افزونه ) که برای این مورد هم کارایی داشته باشد و با قرار گیری لینک ها به پنل کاربری افراد اضافه شود ؟
    پیشاپیش ممنون از پاسخگوییتون .

    • Reza Rad رضا راد ۱۰ دی ۱۴۰۱

      سلام سپاس از شما. همین کد رو بعد از ویرایش محصول باید اجرا کنید تا برای این مدل محصولات هم کار کنه.

      • U319896 ۱۱ دی ۱۴۰۱

        ممنون از شما ولی امتحان کردم نشد ، محصولی که فایلی نداشت ، فایل ها را بارگزاری کردم ، بعد مجدد کد را به حالت قبل برگرداندم و مجدد این کد را اضافه کردم و بعد همان محصول را ویرایش کردم( فایلش را یکبار حذف و اضافه و به روزرسانی کردم ، ولی در پنل کاربری افراد اضافه نشد .)

        • Reza Rad رضا راد ۱۴ دی ۱۴۰۱

          یکبار یکی از صفحات پنل مدیریت رو باز کنید کد باید اجرا بشه. بارها تست شده و کار می‌کنه. مطمئن بشید جای درستی استفادش میکنید.

  6. U25649 ۶ تیر ۱۴۰۰

    با سلام و خسته نباشید خددمت شما
    من میخوام وقتی کاربر محصولی رو خرید میکنه از طریق ووکامرس به جای اینکه فایلی رو دانلود کنه یک لینک بهش داده بشه …
    برای مثال وقتی محصول رو خرید و وارد حساب کاربری خودش شد یک لینک https://mihanwp.com مثل این باشه که کلیک کنه و وارد این سایت بشه…
    من وقتی لینک گذاشتم در اون قسمت برای کاربرا میخواد چیزی رو دانلود کنه و نمیتونن وارد اون لینک بشن…
    ممنون میشم اگر امکان داره این کار من رو راهنمایی بفرمایید

  7. U37224 ۱۰ اسفند ۱۳۹۹

    سلام-وقت بخیر-من یه مشکلی پبدا کرده سایتم-محصولات دانلودی رو که مشتری خرید میکنه داخل پروفایل کاربریش که میره برا دانلود روی هر گزینه ای که میزنه صفحه عوض نمیشه و نمیتونه سفارشات خودش رو ببینه تا دانلود کنه-فکر میکنم برگه این مورد از ووکامرس غیر فعال هست -ممنون میشم راهنمایی که چیکار کنم؟البته صفحه حساب کاربری در ووکامرس روی my account قرار داره و این مشکل پا برجاست

    • Reza Rad رضا راد ۱۲ اسفند ۱۳۹۹

      سلام بستگی به افزونه‌ای داره که برای نمایش سفارشات استفاده می‌کنید. در همون صفحه حساب من ووکامرس این مشکل رو دارید؟

  8. U8071 ۱۳ بهمن ۱۳۹۹

    سلام!
    برای لایسنس گذاری میشه آموزش بذارین؟

    • Reza Rad رضا راد ۱۴ بهمن ۱۳۹۹

      سلام باید php رو ابتدا یاد بگیرید. در دوره php ثبت نام کنید بعد از این دوره یک دوره پلاگین نویسی وردپرس خواهیم داشت.

  9. U17845 ۹ دی ۱۳۹۹

    من اضافه کردم سایتم از دسترس خارج شد

  10. U25787 ۴ دی ۱۳۹۹

    سلام دمتون گرم پست خیلی کاربردی و عالی ای بود حرف ندارین
    فقط یک نکته اضافه کنم اگر قبلا فایل ها رو آپدیت کرده باشن و این کد رو اضافه کنن باز هم نشون نمیده فایل های جدید رو
    باید قبل از اپدیت کردن این کد قرار بگیره و یا اپدیت ها رو که قبلا اضافه کردن لینک هارو از داخل محصول پاک کنن به روزرسانی کنن محصول رو به حالت قبل و بعد دوباره بعد از اضافه کردن کد لینک هارو اضافه کنن تا کار کنه

    • Reza Rad رضا راد ۵ دی ۱۳۹۹
      • U7572 ۲۰ خرداد ۱۴۰۰

        سلام. وقت بخیر. با توجه به توضیحات دوستمون تو کامنت بالا عمل کردم اما اصلا لینک ها تغییر نمی کنه.
        یعنی اول کد رو گذاشتم . بعد لینک محصول دانلودی رو حذف کردم و بعدش بروزرسانیش کردم. بعد از اون دوباره لینک ها رو قرار دادم. ولی لینک ها اصلا تغییر نکرد
        میشه بیشتر توضیح دهید که چطور باید این مورد رو حل کنم؟

  11. U17441 ۴ دی ۱۳۹۹

    سلام. با چه اصولی باید برگه سیاست حریم خصوصی و قوانین و مقررات رو بنویسیم؟

    • تیم پشتیبانی تیم پشتیبانی ۴ دی ۱۳۹۹

      سلام
      اطلاعاتی که هنگام نوشتن نظرات نوشته می شوند (مثل نام، نام کاربری، آدرس ایمیل و…). این اطلاعات اغلب قبل از نوشتن نظرات توسط افراد، دریافت می شود.
      به چه روش‌هایی اطلاعات را جمع‌آوری می کنید؟ (مثل : کوکی‌ها، فرم‌های ثبت‌نام، فرم نظرات و…)
      شما باید تمامی اطلاعاتی که شرکت‌های تبلیغاتی دیگر (مثل Google Adsense) جمع‌آوری می‌کنند را نیز در این صفحه بنویسید.
      قرار دادن توضیحات، همراه با لینک های تمامی ” سیاست‌های حفظ حریم خصوصی دیگر سایت ها ” که از آنها استفاده می‌کنید.
      اطلاعات تماس شما یا پشتیبانی سایت، برای مواردی که خوانندگان این صفحه، سوالی در این رابطه داشته

  12. U33979 ۴ دی ۱۳۹۹

    سلام و درود خدمت میهن وردپرس، ببخشید از حضورتون یه سوال داشتم ممنون میشم جواب بدین، از وقتی که مشکل ایندکس سرچ کنسول رفع شده و بازم می‌تونیم مطلب را به صورت دستی وارد و ایندکس کنیم، مطالب سایت من دیر ایندکس میشه یعنی تا یک هفته طول میکشه، ولی قبل از اون تو یک دقیقه و فوری ایندکس میشد، یعنی این مشل بعد از راه اندازی مجدد ایندکس دستی سرچ کنسول اتفاق افتاده