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

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

آیا تا به حال برای شما پیش آمده که صفحه لیست محصولات یا سفارشات در بخش مدیریت وردپرس به شدت کند بارگذاری شود یا حتی با خطای کرش دیتابیس مواجه شوید؟ یکی از دلایل اصلی این مشکل، تنظیم تعداد آیتم‌های نمایش داده شده در هر صفحه (Items Per Page) توسط کاربران است. در فروشگاه‌های بزرگ با تعداد محصولات و سفارشات زیاد، ممکن است ادمین‌ها به‌اشتباه این عدد را به ۵۰۰ یا ۱۰۰۰ افزایش دهند که این حجم از داده در لحظه لود صفحه، بار بسیار سنگینی بر روی سرور و پایگاه داده ایجاد می‌کند و باعث کندی شدید و حتی از کار افتادن سایت می‌شود. در این مقاله از مجموعه مقالات آموزشی وردپرس، یک کد کاربردی و استاندارد برای قفل کردن تعداد آیتم‌های نمایش داده شده در لیست‌های مدیریت پست‌ها، صفحات، محصولات و سفارشات ووکامرس ارائه می‌دهیم. با استفاده از این کد، تعداد را روی یک عدد منطقی (مثلاً ۳۶ برای محصولات و ۶۰ برای سفارشات) قفل کرده و گزینه Screen Options را نیز در این صفحات غیرفعال می‌کنیم تا کاربران نتوانند این تنظیمات را تغییر دهند. این کار از بار سنگین و کرش دیتابیس جلوگیری کرده و سرعت پنل مدیریت را به طور چشمگیری بهبود می‌بخشد.

چالش تنظیمات تعداد آیتم‌ها توسط ادمین‌ها و تأثیر آن بر عملکرد

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

  • بار سنگین بر روی دیتابیس: کوئری‌های سنگین با LIMIT 500 یا 1000 زمان اجرای طولانی‌تری دارند و می‌توانند دیتابیس را به شدت تحت فشار قرار دهند.
  • کندی شدید صفحه: بارگذاری ۵۰۰ یا ۱۰۰۰ رکورد به همراه تمام متادیتا و روابط، زمان زیادی می‌برد و تجربه کاربری را برای ادمین‌ها تخریب می‌کند.
  • خطر کرش دیتابیس و سایت: در سرورهای با منابع محدود، این کوئری‌های سنگین می‌توانند منجر به Timeout یا حتی کرش کامل دیتابیس و از کار افتادن سایت شوند.
  • شکایت از کندی پنل: ادمین‌هایی که به‌اشتباه این تعداد را افزایش داده‌اند، معمولاً از کندی شدید پنل مدیریت شکایت می‌کنند و دلیل آن را نمی‌دانند.
  • اتلاف منابع سرور: بارگذاری حجم بالای داده در هر درخواست، منابع سرور را به هدر می‌دهد و بر عملکرد کلی سایت تأثیر می‌گذارد.

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

راهکار محدود کردن تعداد آیتم‌ها با کد اختصاصی

برای قفل کردن تعداد آیتم‌های نمایش داده شده در لیست‌های مدیریت وردپرس، از دو روش مکمل استفاده می‌کنیم:

  1. اعمال فیلتر بر روی گزینه‌های کاربری: با استفاده از فیلتر get_user_option_{$option} که به صورت داینامیک به گزینه‌های هر کاربر اعمال می‌شود، مقدار مورد نظر را برای هر صفحه به‌صورت اجباری تنظیم می‌کنیم. این روش تضمین می‌کند که حتی اگر کاربر از طریق Screen Options یا URL سعی کند تعداد را تغییر دهد، مقدار قفل‌شده اعمال خواهد شد.
  2. غیرفعال کردن گزینه Screen Options: با استفاده از فیلتر screen_settings، گزینه Screen Options را در صفحات هدف به طور کامل غیرفعال می‌کنیم تا کاربران حتی امکان مشاهده و تغییر این تنظیمات را نداشته باشند.

این روش کاملاً استاندارد، سبک و بدون نیاز به نصب افزونه است و با تمامی نسخه‌های وردپرس و ووکامرس سازگاری دارد.

کد کامل محدود کردن تعداد آیتم‌های نمایش داده شده در لیست‌های مدیریت

در زیر کد کامل و استاندارد برای قفل کردن تعداد آیتم‌های نمایش داده شده در لیست‌های مدیریت پست‌ها، صفحات، محصولات و سفارشات ووکامرس آورده شده است. این کد را در انتهای فایل functions.php قالب فرزند خود قرار دهید. در این کد، تعداد برای پست‌ها و صفحات روی ۳۶ و برای سفارشات روی ۶۰ تنظیم شده است که می‌توانید این اعداد را بر اساس نیاز خود تغییر دهید.

/*
 * Admin List View Pagination Limiter
 * Forces specific items-per-page limits for posts, pages, products, and orders, and removes screen options.
 * Mahdi Jafarzadeh
 * https://www.wpwm.ir/
 */

// ============================================================
// 1. DEFINE PAGINATION LIMITS FOR EACH ADMIN SCREEN
// ============================================================
$pagination_limits = [
    'edit_post_per_page'       => 36, // Posts
    'edit_page_per_page'       => 36, // Pages
    'edit_product_per_page'    => 36, // WooCommerce Products
    'edit_shop_order_per_page' => 60, // WooCommerce Orders
];

// ============================================================
// 2. APPLY FILTERS TO FORCE THE DEFINED LIMITS
// ============================================================
foreach ($pagination_limits as $option => $limit) {
    add_filter("get_user_option_{$option}", function() use ($limit) {
        return (int) $limit;
    }, 9999);
}

// ============================================================
// 3. DISABLE SCREEN OPTIONS ON TARGET PAGES
// ============================================================
add_filter('screen_settings', function($settings, $screen) {
    // Define screens where options should be hidden
    $target_screens = [
        'edit-post',
        'edit-page',
        'edit-product',
        'edit-shop_order'
    ];
    
    // Check if current screen is in the target list
    if (isset($screen->id) && in_array($screen->id, $target_screens, true)) {
        return ''; // Remove screen settings completely
    }
    
    return $settings;
}, 9999, 2);

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

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

  1. خطوط ۱۰ تا ۱۵ – تعریف محدودیت‌های صفحه‌بندی: در این بخش، یک آرایه به نام $pagination_limits تعریف می‌شود که کلیدهای آن نام گزینه‌های کاربری مربوط به هر صفحه و مقادیر آن تعداد آیتم‌های مورد نظر است. به عنوان مثال، 'edit_post_per_page' مربوط به تعداد پست‌های نمایش داده شده در هر صفحه است. شما می‌توانید اعداد را بر اساس نیاز خود تغییر دهید.
  2. خطوط ۱۸ تا ۲۱ – اعمال فیلترها با حلقه: با استفاده از یک حلقه foreach، برای هر گزینه تعریف شده، یک فیلتر با نام get_user_option_{$option} اضافه می‌کنیم. این فیلترها زمانی اجرا می‌شوند که وردپرس بخواهد مقدار یک گزینه کاربری را دریافت کند. تابع use ($limit) مقدار محدودیت را به تابع ناشناس منتقل می‌کند و سپس آن را به عنوان عدد صحیح بازمی‌گرداند. اولویت ۹۹۹۹ تضمین می‌کند که این فیلتر پس از سایر فیلترها اجرا شود و مقدار نهایی را تعیین کند.
  3. خطوط ۲۴ تا ۳۵ – غیرفعال کردن گزینه Screen Options: با استفاده از add_filter('screen_settings', function($settings, $screen) {}, 9999, 2)، یک فیلتر به هوک screen_settings اضافه می‌کنیم. این هوک محتوای تب Screen Options را کنترل می‌کند. در تابع:
    • خط ۲۷: آرایه $target_screens شامل شناسه‌های صفحات هدف (پست‌ها، صفحات، محصولات و سفارشات) است.
    • خط ۳۲: با استفاده از isset($screen->id) && in_array($screen->id, $target_screens, true)، بررسی می‌شود که آیا صفحه فعلی در لیست اهداف قرار دارد یا خیر.
    • خط ۳۳: اگر صفحه هدف باشد، یک رشته خالی بازگردانده می‌شود که باعث می‌شود تب Screen Options به طور کامل از صفحه حذف شود.
    • خط ۳۵: در غیر این صورت، تنظیمات اصلی بازگردانده می‌شوند.

نکات مهم

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

  • استفاده از قالب فرزند: کد را در فایل functions.php قالب فرزند قرار دهید تا با بروزرسانی قالب اصلی، تغییرات شما از بین نرود.
  • تنظیم اعداد منطقی: اعداد ۳۶ برای محصولات و ۶۰ برای سفارشات به عنوان نمونه انتخاب شده‌اند. بسته به حجم داده‌ها و قدرت سرور شما، می‌توانید این اعداد را تنظیم کنید. به عنوان مثال، برای سایت‌های بسیار بزرگ، عدد ۲۰ برای محصولات منطقی‌تر است.
  • غیرفعال کردن Screen Options: با غیرفعال کردن این گزینه، کاربران نمی‌توانند تعداد را تغییر دهند و همچنین سایر تنظیمات مرتبط با نمایش ستون‌ها را نیز از دست می‌دهند. اگر نیاز به حفظ سایر تنظیمات Screen Options دارید، می‌توانید کد را به گونه‌ای修改 کنید که فقط گزینه تعداد آیتم‌ها را حذف کند، نه کل بخش را.
  • تست پس از اعمال کد: پس از افزودن کد، وارد بخش محصولات یا سفارشات در پنل مدیریت شوید و از اعمال تعداد جدید و حذف گزینه Screen Options اطمینان حاصل کنید.
  • سازگاری با افزونه‌های مدیریت: این کد با اکثر افزونه‌های مدیریت وردپرس سازگاری دارد، اما در صورت بروز تداخل، افزونه‌های دیگر را به‌طور موقت غیرفعال کنید تا مشکل شناسایی شود.
  • تأثیر بر سایر نقش‌های کاربری: این کد برای همه کاربران (صرف‌نظر از نقش) اعمال می‌شود. اگر نیاز به اعمال محدودیت فقط برای برخی نقش‌ها دارید، می‌توانید با استفاده از current_user_can()، شرط اضافه کنید.
  • امکان تغییر از طریق URL: برخی کاربران ممکن است با اضافه کردن پارامتر per_page به URL، سعی در تغییر تعداد داشته باشند. این کد با استفاده از فیلتر get_user_option، این تلاش‌ها را نیز بی‌اثر می‌کند.

جمع‌بندی

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

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

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

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

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

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