حذف محصولات ناموجود در محصولات مرتبط در ووکامرس

آموزش بهینه‌سازی محصولات مرتبط در ووکامرس (حذف محصولات ناموجود و جایگزینی با موجود)

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

چالش نمایش محصولات ناموجود در بخش محصولات مرتبط

بخش محصولات مرتبط در صفحه محصول، یکی از ابزارهای مهم برای افزایش فروش و ارتقاء فروش (Upsell) محسوب می‌شود. اما زمانی که این بخش شامل محصولات ناموجود باشد، مشکلات زیر ایجاد می‌شود:

  • کاهش اعتماد کاربر: کاربرانی که روی محصولات ناموجود کلیک می‌کنند، با پیام “ناموجود” مواجه می‌شوند و این موضوع اعتماد آن‌ها را به فروشگاه شما کاهش می‌دهد.
  • افزایش نرخ پرش: نمایش محصولات ناموجود در بخش مرتبط، کاربران را به سمت خروج از سایت سوق می‌دهد و نرخ پرش را افزایش می‌دهد.
  • از دست دادن فرصت‌های فروش: به جای نمایش محصولات موجود و قابل خرید، فرصت فروش به کاربران از دست می‌رود.
  • تأثیر منفی بر سئو: نمایش مکرر محصولات ناموجود در بخش‌های مختلف سایت، می‌تواند به عنوان سیگنالی از محتوای کم‌کیفیت توسط موتورهای جستجو تفسیر شود.

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

راهکار بهینه‌سازی محصولات مرتبط با کد اختصاصی

برای بهینه‌سازی محصولات مرتبط در ووکامرس، از دو فیلتر اصلی استفاده می‌کنیم:

  1. تنظیم تعداد محصولات مرتبط: با استفاده از فیلتر woocommerce_product_related_posts_per_page، تعداد محصولات مرتبط را به عدد دلخواه (مثلاً ۱۲) تنظیم می‌کنیم.
  2. فیلتر کردن و جایگزینی محصولات: با استفاده از فیلتر woocommerce_related_products، محصولات ناموجود را از لیست اولیه حذف کرده و در صورتی که تعداد محصولات موجود کمتر از حد تعیین‌شده (مثلاً ۶ عدد) باشد، با یک کوئری بهینه‌شده محصولات موجود از همان دسته‌بندی و برچسب‌ها را به لیست اضافه می‌کنیم.

این روش کاملاً استاندارد، سبک و بدون نیاز به نصب افزونه است و با تمامی نسخه‌های ووکامرس سازگاری دارد. کوئری اضافی با استفاده از پارامترهای no_found_rows، update_post_meta_cache و update_post_term_cache بهینه‌سازی شده است تا تأثیر منفی بر سرعت بارگذاری صفحه نداشته باشد.

کد کامل بهینه‌سازی محصولات مرتبط در ووکامرس

در زیر کد کامل و استاندارد برای بهینه‌سازی محصولات مرتبط در ووکامرس (حذف محصولات ناموجود و جایگزینی با محصولات موجود) آورده شده است. این کد را در انتهای فایل functions.php قالب فرزند خود قرار دهید.

/*
 * Optimize Related Products in WooCommerce
 * Filters out out-of-stock products and backfills with in-stock products from same categories/tags
 * Mahdi Jafarzadeh
 * https://www.wpwm.ir/
 */

// ============================================================
// 1. SET RELATED PRODUCTS PER PAGE
// ============================================================
add_filter('woocommerce_product_related_posts_per_page', 'set_related_products_per_page', 10, 2);

function set_related_products_per_page($posts_per_page, $product) {
    return 12; // Display 12 related products maximum
}

// ============================================================
// 2. FILTER AND OPTIMIZE RELATED PRODUCTS
// ============================================================
add_filter('woocommerce_related_products', 'filter_and_optimize_related_products', 10, 2);

function filter_and_optimize_related_products($related_ids, $product_id) {
    // Minimum number of related products to display
    $min_count = 6;
    
    // Step 1: Filter out out-of-stock products from the initial list
    $in_stock_ids = array();
    foreach ($related_ids as $id) {
        $stock_status = get_post_meta($id, '_stock_status', true);
        if ('instock' === $stock_status) {
            $in_stock_ids[] = $id;
        }
    }
    
    // If we already have enough in-stock related products, return them
    if (count($in_stock_ids) >= $min_count) {
        return $in_stock_ids;
    }
    
    // Step 2: Get the product object to fetch categories and tags
    $product = wc_get_product($product_id);
    if (!$product) {
        return $in_stock_ids;
    }
    
    // Calculate how many more products we need
    $needed = $min_count - count($in_stock_ids);
    $categories = $product->get_category_ids();
    $tags = $product->get_tag_ids();
    
    // Step 3: Build an optimized query to fetch additional in-stock related products
    $additional_args = array(
        'post_type'              => 'product',
        'post_status'            => 'publish',
        'posts_per_page'         => $needed,
        'post__not_in'           => array_merge(array($product_id), $related_ids),
        'fields'                 => 'ids',
        'no_found_rows'          => true,          // Speed optimization
        'update_post_meta_cache' => false,         // Speed optimization
        'update_post_term_cache' => false,         // Speed optimization
        'meta_query'             => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'instock',
                'compare' => '=',
            ),
        ),
        'tax_query'              => array('relation' => 'OR'),
    );
    
    // Add category conditions if any
    if (!empty($categories)) {
        $additional_args['tax_query'][] = array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => $categories,
            'operator' => 'IN',
        );
    }
    
    // Add tag conditions if any
    if (!empty($tags)) {
        $additional_args['tax_query'][] = array(
            'taxonomy' => 'product_tag',
            'field'    => 'term_id',
            'terms'    => $tags,
            'operator' => 'IN',
        );
    }
    
    // Execute the query
    $additional_query = new WP_Query($additional_args);
    
    // Step 4: Merge results and limit to the minimum count
    $final_ids = array_merge($in_stock_ids, $additional_query->posts);
    return array_slice($final_ids, 0, $min_count);
}

نحوه عملکرد کد به صورت گام به گام

در این بخش، هر بخش از کد را به صورت دقیق بررسی می‌کنیم و نحوه عملکرد آن را توضیح می‌دهیم:

  1. خطوط ۱۰ تا ۱۴ – تنظیم تعداد محصولات مرتبط: با استفاده از add_filter('woocommerce_product_related_posts_per_page', 'set_related_products_per_page', 10, 2)، یک فیلتر به هوک woocommerce_product_related_posts_per_page اضافه می‌کنیم. این هوک تعداد محصولات مرتبط را تعیین می‌کند. تابع set_related_products_per_page مقدار ۱۲ را به عنوان حداکثر تعداد محصولات مرتبط بازمی‌گرداند.
  2. خط ۱۹ – افزودن فیلتر اصلی: با استفاده از add_filter('woocommerce_related_products', 'filter_and_optimize_related_products', 10, 2)، فیلتر اصلی برای دستکاری لیست محصولات مرتبط اضافه می‌شود. این فیلتر دو پارامتر $related_ids (لیست شناسه‌های محصولات مرتبط پیش‌فرض) و $product_id (شناسه محصول فعلی) را دریافت می‌کند.
  3. خط ۲۲ – تعیین حداقل تعداد: متغیر $min_count = 6 تعیین می‌کند که حداقل ۶ محصول موجود باید در بخش مرتبط نمایش داده شوند. شما می‌توانید این عدد را بر اساس نیاز خود تغییر دهید.
  4. خطوط ۲۵ تا ۳۱ – فیلتر کردن محصولات ناموجود: با استفاده از یک حلقه foreach، تمام شناسه‌های محصولات مرتبط را بررسی می‌کنیم. با استفاده از get_post_meta($id, '_stock_status', true)، وضعیت موجودی هر محصول را دریافت می‌کنیم. اگر وضعیت instock باشد، محصول به آرایه $in_stock_ids اضافه می‌شود.
  5. خطوط ۳۴ تا ۳۶ – بررسی کافی بودن محصولات موجود: اگر تعداد محصولات موجود در لیست اولیه ($in_stock_ids) بیشتر یا مساوی $min_count باشد، همان لیست بدون تغییر بازگردانده می‌شود.
  6. خطوط ۳۹ تا ۴۱ – دریافت شیء محصول: با استفاده از wc_get_product($product_id)، شیء محصول فعلی را دریافت می‌کنیم. اگر محصول وجود نداشته باشد، لیست محصولات موجود (که ممکن است خالی باشد) بازگردانده می‌شود.
  7. خطوط ۴۴ تا ۴۶ – محاسبه تعداد مورد نیاز: متغیر $needed تعداد محصولات اضافی مورد نیاز برای رسیدن به حداقل ۶ عدد را محاسبه می‌کند. همچنین دسته‌بندی‌ها و برچسب‌ها محصول فعلی را با استفاده از $product->get_category_ids() و $product->get_tag_ids() دریافت می‌کند.
  8. خطوط ۴۹ تا ۷۵ – ساخت کوئری بهینه‌شده: یک آرایه آرگومان برای کوئری WP_Query ساخته می‌شود که شامل:
    • بهینه‌سازی سرعت: تنظیم no_found_rows روی true، update_post_meta_cache و update_post_term_cache روی false برای افزایش سرعت کوئری.
    • فیلتر موجودی: با استفاده از meta_query، فقط محصولات با وضعیت instock انتخاب می‌شوند.
    • فیلتر دسته‌بندی و برچسب: با استفاده از tax_query، محصولات از همان دسته‌بندی یا برچسب انتخاب می‌شوند (با شرط OR).
    • حذف محصولات تکراری: با استفاده از post__not_in، محصول فعلی و محصولات موجود در لیست اولیه از نتایج حذف می‌شوند تا از تکرار جلوگیری شود.
  9. خط ۷۸ – اجرای کوئری: با استفاده از new WP_Query($additional_args)، کوئری ساخته شده اجرا می‌شود و شناسه‌های محصولات جدید دریافت می‌شوند.
  10. خطوط ۸۱ تا ۸۲ – ادغام و محدود کردن نتایج: لیست محصولات موجود اولیه با نتایج کوئری جدید ادغام شده و با استفاده از array_slice به حداکثر ۶ عدد محدود می‌شود.

نکات مهم

در این بخش به نکات کلیدی برای استفاده صحیح از این کد اشاره می‌کنیم که باید به آن‌ها توجه ویژه‌ای داشته باشید:

  • استفاده از قالب فرزند: کد را در فایل functions.php قالب فرزند قرار دهید تا با بروزرسانی قالب اصلی، تغییرات شما از بین نرود.
  • تنظیم اعداد مناسب: عدد ۱۲ برای حداکثر تعداد محصولات مرتبط و ۶ برای حداقل تعداد محصولات موجود قابل تنظیم هستند. این اعداد را بر اساس طراحی قالب و استراتژی فروش خود تنظیم کنید.
  • بهینه‌سازی عملکرد: استفاده از no_found_rows و update_post_meta_cache به سرعت بارگذاری صفحه کمک می‌کند. اگر نیاز به نمایش تعداد کل نتایج ندارید، این تنظیمات را حفظ کنید.
  • تست پس از اعمال کد: پس از افزودن کد، حتماً یک محصول را در فروشگاه باز کنید و بخش محصولات مرتبط را بررسی کنید تا از عدم نمایش محصولات ناموجود اطمینان حاصل کنید.
  • سازگاری با محصولات متغیر: این کد برای محصولات ساده و محصولات متغیر به خوبی کار می‌کند. برای محصولات متغیر، وضعیت موجودی بر اساس سطح محصول (نه تغییرات) بررسی می‌شود.
  • افزونه‌های کش: اگر از افزونه‌های کش مانند WP Rocket یا W3 Total Cache استفاده می‌کنید، پس از اعمال کد، حتماً کش سایت را پاک کنید تا تغییرات اعمال شوند.
  • سفارشی‌سازی کوئری: در صورت نیاز به فیلترهای اضافی (مانند قیمت، محبوبیت یا تاریخ انتشار)، می‌توانید آرایه $additional_args را با کلیدهای بیشتری مانند meta_key و orderby گسترش دهید.

جمع‌بندی

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

امیدواریم این آموزش برای شما مفید بوده باشد. اگر سوالی درباره بهینه‌سازی محصولات مرتبط در ووکامرس، نحوه استفاده از کد یا هر بخش دیگری از این آموزش دارید، لطفاً در بخش نظرات مطرح کنید. همچنین اگر تجربه‌ای در سفارشی‌سازی ووکامرس یا بهبود تجربه کاربری دارید، خوشحال می‌شویم آن را با ما و سایر کاربران به اشتراک بگذارید.

نظر یا سوال شما درباره این کد

اگر نظر یا سوالی درباره این کد دارید بنویسید، ما در سریعترین زمان بررسی می‌کنیم و جواب شما رو میدیم.

ایمیل شما منتشر نخواهد شد.
اولین نفری باشید که نظر می دهد!

مقالات آموزش و نکات وردپرس