اگر شما هم یک فروشگاه اینترنتی ووکامرسی را مدیریت میکنید، حتماً با این چالش مواجه شدهاید: برای دیدن محصولاتی که در یک سفارش “در حال انجام” (Processing) قرار دارند، باید روی دکمه پیشنمایش (چشم) کلیک کنید یا وارد صفحه جزئیات هر سفارش شوید. این فرآیند، بهخصوص زمانی که تعداد سفارشها زیاد است، بسیار زمانبر و خستهکننده میشود.
مدیران فروشگاهها اغلب نیاز دارند که با یک نگاه سریع به لیست سفارشات، متوجه شوند که کدام محصولات باید بستهبندی و ارسال شوند. متأسفانه، ووکامرس این قابلیت را بهصورت پیشفرض ارائه نمیدهد.
اما خبر خوب این است که با چند خط کد PHP، میتوانیم یک ستون سفارشی “محصولات” به این لیست اضافه کنیم. در این مقاله، کدی را به شما ارائه میدهیم که نهتنها این کار را انجام میدهد، بلکه کاملاً با سیستم جدید HPOS (High-Performance Order Storage) ووکامرس نیز سازگار است.
HPOS چیست و چرا سازگاری با آن مهم است؟
ووکامرس در بهروزرسانیهای اخیر خود، ساختار ذخیرهسازی سفارشها را از حالت پیشفرض وردپرس (ذخیره در جدول wp_posts) به جداول سفارشی و بهینهشده (…wc_orders) منتقل کرده است. این قابلیت که به HPOS معروف است، سرعت و عملکرد سایت را به شدت افزایش میدهد.
بسیاری از کدهای قدیمی که برای سفارشیسازی پیشخوان سفارشات نوشته شدهاند، فقط روی ساختار قدیمی (CPT) کار میکنند و پس از فعالسازی HPOS از کار میافتند. کدی که ما در ادامه ارائه میدهیم، هر دو حالت را هوشمندانه تشخیص داده و در هر شرایطی به درستی کار میکند.
کد PHP افزودن ستون محصولات به لیست سفارشات ووکامرس
کد زیر را میتوانید در فایل functions.php قالب فرزند (Child Theme) خود یا از طریق افزونههایی مانند Code Snippets به سایت خود اضافه کنید.
نکته مهم: همیشه قبل از افزودن کد سفارشی، از سایت خود یک نسخه پشتیبان کامل تهیه کنید.
این کد چگونه کار میکند؟
این اسنیپت از دو بخش اصلی تشکیل شده است:
بخش اول: افزودن هدر ستون
تابع add_order_products_column_header_compat با استفاده از دو فیلتر مختلف اجرا میشود:
- فیلتر manage_edit-shop_order_columns: برای لیست سفارشات در حالت سنتی (CPT).
- فیلتر manage_woocommerce_page_wc-orders_columns: برای لیست سفارشات در حالت مدرن (HPOS).
این تابع، آرایه ستونها را دریافت کرده و یک ستون جدید با عنوان “محصولات” را دقیقاً بعد از ستون “وضعیت” اضافه میکند.
بخش دوم: نمایش محتوای ستون
تابع add_order_products_column_content_compat مسئول نمایش لیست محصولات در ستون جدید ما است. این بخش نیز با استفاده از دو اکشن مشابه (یکی برای CPT و دیگری برای HPOS) اجرا میشود.
نکته کلیدی در این تابع، نحوه دریافت آبجکت سفارش است. در حالت HPOS، خود آبجکت WC_Order مستقیماً به تابع ارسال میشود، در حالی که در حالت CPT، فقط ID سفارش ارسال میگردد. کد ما با یک بررسی ساده (instanceof \WC_Order) این تفاوت را مدیریت کرده و در هر صورت به آبجکت سفارش دسترسی پیدا میکند.
سپس، آیتمهای سفارش ($order->get_items()) را گرفته، در یک حلقه foreach نام و تعداد هر محصول را استخراج کرده و در قالب یک لیست <ul> نمایش میدهد.
<?php
/**
* افزودن ستون "محصولات" به لیست سفارشات ووکامرس
* سازگار با هر دو حالت HPOS (جداول سفارشی) و CPT (پست تایپ قدیمی)
*/
/**
* 1. افزودن هدر ستون (سازگار با HPOS و CPT)
*
* به هر دو هوک لیست سفارشات قدیمی و جدید قلاب میشود.
*/
add_filter( 'manage_edit-shop_order_columns', 'add_order_products_column_header_compat', 99 ); // CPT (قدیمی)
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_order_products_column_header_compat', 99 ); // HPOS (جدید)
function add_order_products_column_header_compat( $columns ) {
// جلوگیری از افزودن مجدد ستون در صورت اجرای همزمان هر دو فیلتر
if ( isset( $columns['order_products'] ) ) {
return $columns;
}
$new_columns = array();
// تعیین ستون مبدأ برای تزریق (HPOS از 'status' و CPT از 'order_status' استفاده میکند)
$insert_after = isset( $columns['status'] ) ? 'status' : 'order_status';
foreach ( $columns as $column_name => $column_info ) {
$new_columns[ $column_name ] = $column_info;
// افزودن ستون "محصولات" بعد از ستون وضعیت سفارش
if ( $insert_after === $column_name ) {
$new_columns['order_products'] = 'محصولات'; // عنوان ستون
}
}
// اگر ستون وضعیت پیدا نشد، ستون محصولات را در انتها اضافه کن
if ( ! isset( $new_columns['order_products'] ) ) {
$new_columns['order_products'] = 'محصولات';
}
return $new_columns;
}
/**
* 2. پر کردن محتوای ستون (سازگار با HPOS و CPT)
*
* به هر دو اکشن قلاب شده و نوع آرگومان ورودی را مدیریت میکند.
*/
add_action( 'manage_shop_order_posts_custom_column', 'add_order_products_column_content_compat', 10, 2 ); // CPT (قدیمی)
add_action( 'manage_woocommerce_page_wc-orders_custom_column', 'add_order_products_column_content_compat', 10, 2 ); // HPOS (جدید)
function add_order_products_column_content_compat( $column, $order_or_post_id ) {
// اگر ستون ما نیست، خارج شو
if ( 'order_products' !== $column ) {
return;
}
/**
* دریافت آبجکت WC_Order
* - در حالت HPOS: متغیر $order_or_post_id خود آبجکت WC_Order است.
* - در حالت CPT: متغیر $order_or_post_id همان ID پست (سفارش) است.
*/
$order = ( $order_or_post_id instanceof \WC_Order ) ? $order_or_post_id : wc_get_order( $order_or_post_id );
if ( ! $order ) {
return;
}
$items = $order->get_items();
if ( ! empty( $items ) ) {
echo '<ul style="margin: 0; list-style-type: disc; padding-inline-start: 20px;">';
foreach ( $items as $item_id => $item ) {
$product_name = $item->get_name();
$quantity = $item->get_quantity();
echo '<li>';
// نمایش نام محصول به همراه تعداد (مثال: محصول الف (×2))
echo esc_html( $product_name ) . ' (×' . $quantity . ')';
echo '</li>';
}
echo '</ul>';
} else {
echo '—'; // نمایش خط تیره در صورت نبود آیتم
}
}
?>
با افزودن این کد به وبسایت خود، فرآیند بررسی و مدیریت سفارشات را به شکل چشمگیری بهینه میکنید. شما و تیمتان میتوانید با یک نگاه به صفحه ووکامرس -> سفارشات، لیست تمام سفارشهای “در حال انجام” را به همراه محصولاتی که باید ارسال شوند، مشاهده کنید. این به معنای صرفهجویی واقعی در زمان و کاهش خطای انسانی در فرآیند ارسال است.
آیا شما راهحل یا پلاگین دیگری برای این کار میشناسید؟ تجربیات خود را در بخش نظرات با ما به اشتراک بگذارید.