حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی
- مقالات آموزشی
- بروزرسانی شده در
اگر سایت خود را با ووکامرس راهاندازی کردهاید و قصد دارید محصولات دانلودی با ووکامرس بهفروش برسانید، یک مشکل اساسی با محصولات دانلودی خواهید داشت. مشکل این است که اگر فایل محصولات دانلودی ووکامرس را آپدیت کنید یا فایل جدیدی به لیست فایلها اضافه کنید، کاربر شما نمیتواند لینک دانلود فایل جدید را مشاهده کند و همچنان لینکهای دانلودی که موقع خرید دریافت کرده را مشاهده خواهد کرد. در این مقاله میخواهم نحوه حل مشکل آپدیت نشدن لینک دانلود محصولات ووکامرس برای خریداران قبلی را به شما توضیح دهم.
انتقال زیرساخت میهن وردپرس به ووکامرس
اگر اطلاع داشته باشید در حال تغییر سیستم فروش سایت میهن وردپرس از 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' ) );
به همین راحتی! حالا با خیال راحت فایلهای دانلودی خود را آپدیت کنید.این کد دسترسی به تمام فایلهای موجود در محصول خریداری شده را برای کاربران قبلی آزاد خواهد کرد.
موفق باشید.
عرض سلام و احترام.
دوستانی که از 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’ ] );
سلام
سوالی که برایم هست اینه که چرا این قطعه کد را در بروزرسانی های اهورا وارد نمیکنید؟
تا هر دفعه کاربران مجبور نشوند محتویات فایل function را ویرایش کنند.
با احترام
سلام همه نیاز به این مورد ندارند.
سلام و درود
من یک سایت آموزشی دارم و یکی از دانشجوها یک آموزشی رو خریداری کرده ولی در پنل کاربریش وارد نشده، و فقط محصول قبلیش در پروفایلش نشان داده میشه.
سلام باید خرید رو به حسابشون متصل کنید.
چه شکلی؟
متوجه این نکته نشدم
لطفا بیشتر راهنماییم کنید
سپاسگزارم
توی ویرایش سفارش باید خرید متصل بشه به حساب کاربری خریدار
سلام و درود
قالبی که فایل functions.php اون کد گذاری شده و امکان اضافه کردن کد بهش رو نداریم
چطوری از این کد استفاده کنیم؟
ممنون میشم راهنماییم کنید
سلام طبیعتا باید کدها رو ابتدا decrypt کنید با ابزارهای موجود که معمولا کار سختیه و توسط کسی که کدگذاری شده باید decrypt بشه.
سلام و احترام ممنون از آموزش مفیدتون ،من استفاده کردم کد مشکلی نداشت و برای محصولاتی که از قبل در پنل کاربران بودند عمل کرد ، من درخواستم درباره این است : محصولی که هنگام ایجاد فایل دانلودیش وارد نشده بود در ووکامرس و منتشر شده و خریدار خرید کرده ، و به طبع در پنلش فایلی قرار نگرفته ، الان راهی هست ( کد یا افزونه ) که برای این مورد هم کارایی داشته باشد و با قرار گیری لینک ها به پنل کاربری افراد اضافه شود ؟
پیشاپیش ممنون از پاسخگوییتون .
سلام سپاس از شما. همین کد رو بعد از ویرایش محصول باید اجرا کنید تا برای این مدل محصولات هم کار کنه.
ممنون از شما ولی امتحان کردم نشد ، محصولی که فایلی نداشت ، فایل ها را بارگزاری کردم ، بعد مجدد کد را به حالت قبل برگرداندم و مجدد این کد را اضافه کردم و بعد همان محصول را ویرایش کردم( فایلش را یکبار حذف و اضافه و به روزرسانی کردم ، ولی در پنل کاربری افراد اضافه نشد .)
یکبار یکی از صفحات پنل مدیریت رو باز کنید کد باید اجرا بشه. بارها تست شده و کار میکنه. مطمئن بشید جای درستی استفادش میکنید.
با سلام و خسته نباشید خددمت شما
من میخوام وقتی کاربر محصولی رو خرید میکنه از طریق ووکامرس به جای اینکه فایلی رو دانلود کنه یک لینک بهش داده بشه …
برای مثال وقتی محصول رو خرید و وارد حساب کاربری خودش شد یک لینک https://mihanwp.com مثل این باشه که کلیک کنه و وارد این سایت بشه…
من وقتی لینک گذاشتم در اون قسمت برای کاربرا میخواد چیزی رو دانلود کنه و نمیتونن وارد اون لینک بشن…
ممنون میشم اگر امکان داره این کار من رو راهنمایی بفرمایید
درود بر شما باید صفحه تکمیل پرداخت ووکامرس رو ویرایش کنید توی قالب سایتتون
سلام-وقت بخیر-من یه مشکلی پبدا کرده سایتم-محصولات دانلودی رو که مشتری خرید میکنه داخل پروفایل کاربریش که میره برا دانلود روی هر گزینه ای که میزنه صفحه عوض نمیشه و نمیتونه سفارشات خودش رو ببینه تا دانلود کنه-فکر میکنم برگه این مورد از ووکامرس غیر فعال هست -ممنون میشم راهنمایی که چیکار کنم؟البته صفحه حساب کاربری در ووکامرس روی my account قرار داره و این مشکل پا برجاست
سلام بستگی به افزونهای داره که برای نمایش سفارشات استفاده میکنید. در همون صفحه حساب من ووکامرس این مشکل رو دارید؟
سلام!
برای لایسنس گذاری میشه آموزش بذارین؟
سلام باید php رو ابتدا یاد بگیرید. در دوره php ثبت نام کنید بعد از این دوره یک دوره پلاگین نویسی وردپرس خواهیم داشت.
من اضافه کردم سایتم از دسترس خارج شد
سلام
چه اروری رو الان مشاهده میکنید؟
سلام دمتون گرم پست خیلی کاربردی و عالی ای بود حرف ندارین
فقط یک نکته اضافه کنم اگر قبلا فایل ها رو آپدیت کرده باشن و این کد رو اضافه کنن باز هم نشون نمیده فایل های جدید رو
باید قبل از اپدیت کردن این کد قرار بگیره و یا اپدیت ها رو که قبلا اضافه کردن لینک هارو از داخل محصول پاک کنن به روزرسانی کنن محصول رو به حالت قبل و بعد دوباره بعد از اضافه کردن کد لینک هارو اضافه کنن تا کار کنه
سپاس بله دقیقا
سلام. وقت بخیر. با توجه به توضیحات دوستمون تو کامنت بالا عمل کردم اما اصلا لینک ها تغییر نمی کنه.
یعنی اول کد رو گذاشتم . بعد لینک محصول دانلودی رو حذف کردم و بعدش بروزرسانیش کردم. بعد از اون دوباره لینک ها رو قرار دادم. ولی لینک ها اصلا تغییر نکرد
میشه بیشتر توضیح دهید که چطور باید این مورد رو حل کنم؟
درود بر شما مراحل موجود در آموزش رو انجام دادین؟
بله
توی بخش ویرایش یکی از سفارشات بروزرسانی مجوز دانلود رو بزنید اگر مشکل حل نشد پس با این کد هم حل نمیشه و باید قالب و افزونههای سایتتون رو چک کنید.
سلام. با چه اصولی باید برگه سیاست حریم خصوصی و قوانین و مقررات رو بنویسیم؟
سلام
اطلاعاتی که هنگام نوشتن نظرات نوشته می شوند (مثل نام، نام کاربری، آدرس ایمیل و…). این اطلاعات اغلب قبل از نوشتن نظرات توسط افراد، دریافت می شود.
به چه روشهایی اطلاعات را جمعآوری می کنید؟ (مثل : کوکیها، فرمهای ثبتنام، فرم نظرات و…)
شما باید تمامی اطلاعاتی که شرکتهای تبلیغاتی دیگر (مثل Google Adsense) جمعآوری میکنند را نیز در این صفحه بنویسید.
قرار دادن توضیحات، همراه با لینک های تمامی ” سیاستهای حفظ حریم خصوصی دیگر سایت ها ” که از آنها استفاده میکنید.
اطلاعات تماس شما یا پشتیبانی سایت، برای مواردی که خوانندگان این صفحه، سوالی در این رابطه داشته
سلام و درود خدمت میهن وردپرس، ببخشید از حضورتون یه سوال داشتم ممنون میشم جواب بدین، از وقتی که مشکل ایندکس سرچ کنسول رفع شده و بازم میتونیم مطلب را به صورت دستی وارد و ایندکس کنیم، مطالب سایت من دیر ایندکس میشه یعنی تا یک هفته طول میکشه، ولی قبل از اون تو یک دقیقه و فوری ایندکس میشد، یعنی این مشل بعد از راه اندازی مجدد ایندکس دستی سرچ کنسول اتفاق افتاده
سلام بر شما. بله ظاهرا کمی تغییرات ایجاد کردند. مشکل از سایت شما نیست.
سپاس از پاسختان، راه حلی پیشنهاد میدین که سریعتر ایندکس بشه
سپاس از شما. برنامهریزی منظم برای انتشار مطالب سایت