دریافت اطلاعات سفارش سازگار با دیتابیس HPOS ووکامرس (High-Performance Order Storage)
با متد `Automattic\\WooCommerce\\Utilities\\OrderUtil::custom_orders_table_usage_is_enabled()` سازگاری را بررسی کرده و دادهها را با شیء `$order->get_...()` به جای `get_post_meta` مدیریت نمایید.
مشخصات فنی و شناسنامه کد (Code Information)
بازبینی: 1405/06/29<?php
use Automattic\WooCommerce\Utilities\OrderUtil;
/**
* اعلام رسمی سازگاری قالب/پلاگین با معماری HPOS ووکامرس
*/
add_action( 'before_woocommerce_init', function() {
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
} );
/**
* دریافت و پردازش اطلاعات سفارش با متدهای CRUD کاملاً سازگار با HPOS
*/
function bisco_process_hpos_compatible_order( $order_id ) {
// واکشی امن شیء سفارش بدون در نظر گرفتن محل فیزیکی ذخیره در دیتابیس
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// بررسی اینکه آیا سیستم در حالت HPOS اختصاصی کار میکند
$is_hpos_active = OrderUtil::custom_orders_table_usage_is_enabled();
// روش استاندارد خواندن اطلاعات اصلی سفارش
$customer_id = $order->get_customer_id();
$order_total = $order->get_total();
$billing_email = $order->get_billing_email();
$billing_phone = $order->get_billing_phone();
$payment_method = $order->get_payment_method_title();
// روش استاندارد ذخیره و خواندن متای اختصاصی (بدون get_post_meta)
$tracking_code = $order->get_meta( '_bisco_post_tracking_code', true );
// بهروزرسانی متای سفارش با متد CRUD
$order->update_meta_data( '_bisco_processed_at', current_time( 'mysql' ) );
$order->save(); // ذخیره خودکار در جدول صحیح (چه wp_posts باشد چه wp_wc_orders)
}
/**
* واکشی سفارشهای در حال پردازش با wc_get_orders به جای WP_Query سنتی
*/
function bisco_get_recent_processing_orders() {
$args = array(
'status' => array( 'wc-processing' ),
'limit' => 10,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
);
// این تابع به صورت هوشمند از جداول سریع HPOS کوئری میزند
$order_ids = wc_get_orders( $args );
return $order_ids;
}
کد را کجا قرار دهیم؟ (Placement Guide)
کد را در functions.php یا فایل اصلی افزونه اختصاصی قرار دهید. هوک declare_compatibility باید قبل از لود کامل ووکامرس اجرا شود.
این کد چگونه کار میکند؟ (How it Works)
ووکامرس با استفاده از شیء انتزاعی Order Data Store تصمیم میگیرد که اطلاعات را از جداول اختصاصی wp_wc_orders بخواند یا جداول قدیمی پستها، بدون اینکه کد نویسنده دچار شکستگی شود.
چه زمانی از این کد استفاده کنیم؟ (Use Cases)
در تمام وبسایتهای جدید ووکامرسی نسخه ۸ به بالا و جهت جلوگیری از نمایش اخطار عدم سازگاری در پیشخوان ووکامرس.
چه زمانی نباید از این کد استفاده کنیم؟ (Anti-patterns)
در نسخههای بسیار قدیمی ووکامرس زیر ۷.۰.
پیشنیازهای اجرا
ووکامرس ۸.۰ به بالا، PHP 7.4 یا PHP 8.0+.
نحوه تست و اطمینان از عملکرد
به مسیر «ووکامرس > وضعیت > قابلیتها» بروید؛ گزینه High-Performance order storage بدون هیچ اخطار ناسازگاری قالب به راحتی فعال میشود.
نحوه بازگردانی سریع (Rollback)
کد را از functions.php بردارید.
خطاهای رایج و راهحل رفع
استفاده از توابع منسوخ شده مانند get_post_meta($order_id, ...) یا کوئریهای دستی با WP_Query به جای wc_get_orders().
ملاحظات و نکات امنیتی
استفاده کامل از متدهای امن کلاسهای هسته ووکامرس.
تاثیر بر سرعت و پرفورمنس
افزایش تا ۵ برابری سرعت ثبت سفارش و صدور فاکتور در فروشگاههای با صدها هزار سفارش.