فهم أساسيات نظام الاستجابات (Hooks) في WooCommerce
تم بناء منصة WooCommerce على أساس منصة WordPress، وقد ورثت بنية الإضافات (plugins) القوية الخاصة بها. الآلية الأساسية للتوسع في WooCommerce هي ما يُعرف بـ “الخطافات” (hooks). تسمح هذه الخطافات للمطورين بتضمين كود مخصص في نقاط محددة من عملية تنفيذ منصة WooCommerce، مما يتيح تخصيص الميزات بشكل عميق دون الحاجة إلى تعديل الملفات الأساسية للمنصة نفسها. هذا يتوافق مع مبدأ “الانفتاح والإغلاق” (Open-Closed Principle)، مما يحافظ على استقرار منصة WooCommerce، بينما يتم تلبية جميع الاحتياجات الشخصية من خلال استخدام هذه الخطافات.
يوفر WooCommerce نوعين رئيسيين من الخيوط (hooks): خيوط الإجراءات (action hooks) وخيوط المرشحات (filter hooks). do_action() تتم تنشيط الدالة، وتوفر نقطة تنفيذ تسمح للمطورين بإضافة وظائف معينة، مثل إرسال رسالة بريد إلكتروني مخصصة بعد إنشاء الطلب. لا تعيد الدالة أي قيم، وتُستخدم فقط لتنفيذ عمليات إضافية. يتم تشغيل خطافات المرشحات ( apply_filters() يتم تشغيل الدالة، وتوفر نقطة تعديل تسمح للمطورين بتغيير قيمة متغير معين، مثل تطبيق حساب خصم معقد قبل عرض سعر المنتج. يجب أن يعيد المرشح (الفلتر) قيمة معينة.
فهم الفروق بين هذين النوعين من “الخطافات” (hooks) هو المفتاح لاستخدامهما بشكل فعال. ببساطة، الإجراءات (actions) تعني “القيام بشيء ما”, بينما المرشحات (filters) تعني “تغيير شيء ما”. يقوم المطورون باست add_action() و add_filter() تقوم الدالة بتثبيت دالة الاستدعاء الخاصة بها على هذه “الخطافات” (hooks)، وبذلك تتدخل في تدفق العمل القياسي لـ WooCommerce.
القراءة الموصى بها تحليل بيانات WooCommerce المتقدم: كيفية تخصيص خصائص المنتجات وحقول إدارة المخزون.。
استخدم خطافات الأفعال (Action Hooks) لتخصيص سلوك سلة التسوق.
عربة التسوق تعتبر جزءًا أساسيًا من تجربة التسوق عبر الإنترنت، وتوفر منصة WooCommerce مجموعة واسعة من “خطافات الإجراءات” (action hooks) التي تسمح للمطورين بمراقبة كل عملية يقوم بها المستخدم داخل عربة التسوق والاستجاب
إحدى الوظائف الأساسية والمهمة هي… woocommerce_add_to_cartعندما يتم إضافة منتج بنجاح إلى سلة التسوق، يتم تفعيل هذا الحلقة (hook). يمكن للمطورين استخدامه لتتبع سلوك المستخدمين، تحديث تنبيهات نفاد المخزون، أو مزامنة البيانات مع أنظمة خارجية. على سبيل المثال، يمكنك تسجيل المنتجات التي يقوم المستخدمون بإضافتها بشكل متكرر ثم إزالتها، واستخدام هذه المعلومات
add_action('woocommerce_add_to_cart', 'track_product_addition', 10, 6);
function track_product_addition($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
$user_id = get_current_user_id();
if ($user_id) {
$viewed_products = get_user_meta($user_id, '_tracked_cart_additions', true) ?: array();
array_unshift($viewed_products, $product_id);
$viewed_products = array_slice(array_unique($viewed_products), 0, 20); // 保留最近20条
update_user_meta($user_id, '_tracked_cart_additions', $viewed_products);
}
} الخطاف الرئيسي الآخر هو… woocommerce_before_calculate_totalsيتم استدعاؤه في صفحة عربة التسوق، وصفحة الدفع، وفي أي وقت يتم فيه حساب المجموع الفرعي أو المجموع الكلي. هذا هو المكان المثالي لتعديل أسعار المنتجات بشكل ديناميكي أو إضافة خصومات/رسوم عامة. على سبيل المثال، يمكنك تحديد خصومات متدرجة بناءً على العدد الإجمالي للمنتجات الموجود
add_action('woocommerce_before_calculate_totals', 'apply_volume_discount', 20);
function apply_volume_discount($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
if (did_action('woocommerce_before_calculate_totals') >= 2) return;
$total_quantity = 0;
foreach ($cart->get_cart() as $cart_item) {
$total_quantity += $cart_item['quantity'];
}
// 如果总数量超过10件,所有商品打9折
if ($total_quantity > 10) {
foreach ($cart->get_cart() as $cart_item) {
$original_price = $cart_item['data']->get_price();
$cart_item['data']->set_price($original_price * 0.9);
}
}
} استخدام خطافات المرشحات (filter hooks) لمعالجة بيانات المنتجات والطلبات
تمنح خيارات “فلاتر الهوكس” (Filter Hooks) المطورين القدرة على التحكم الدقيق في البيانات، بحيث يمكن تخصيص كل شيء من عناصر سلة التسوق وحتى عرض الطلب النهائي.
woocommerce_add_cart_item_data يتم تشغيل المرشحات عند إضافة المنتجات إلى سلة التسوق، وتسمح للمطورين بإضافة بيانات مخصصة إلى عناصر سلة التسوق. تُحفظ هذه البيانات مع عناصر سلة التسوق داخل الجلسة (session) وتنتقل معها إلى بنود الطلبية. وهذا أمر بالغ الأهمية لتحقيق التخصيص في المنتجات، مثل النقش عليها أو تغيير لونها حسب الرغبة.
القراءة الموصى بها من الصفر إلى الواحد: دليل تقني شامل لبناء موقع تجاري إلكتروني عالي الأداء باستخدام منصة WooCommerce。
add_filter('woocommerce_add_cart_item_data', 'add_engraving_text_to_cart_item', 10, 3);
function add_engraving_text_to_cart_item($cart_item_data, $product_id, $variation_id) {
if (!empty($_POST['engraving_text'])) {
$cart_item_data['engraving'] = sanitize_text_field($_POST['engraving_text']);
// 为具有不同雕刻文本的相同产品生成唯一ID
$cart_item_data['unique_key'] = md5($product_id . serialize($cart_item_data));
}
return $cart_item_data;
} عند الحاجة إلى عرض هذه البيانات المخصصة في سلة التسوق والطلبية، يمكن استخدام… woocommerce_get_item_data مرشح (Filter): يقوم بتنسيق البيانات المخصصة المخزنة في عناصر سلة التسوق بحيث يمكن عرضها في واجهة المستخدم على شكل مصفوفة (array).
في واجهة إدارة الطلبات الخلفية، من أجل عرض المعلومات بشكل واضح، قد نحتاج إلى تنسيق بيانات الطلب (metadata) الخاصة بكل عنصر من عناصر الطلب.woocommerce_order_item_get_formatted_meta_data يتيح لنا المرشحون (الفلاتر) التحكم في المعلومات الوصفية (الميتاداتا) التي يتم عرضها وكيفية عرضها. على سبيل المثال، يمكننا إخفاء المعلومات الوصفية التقنية التي تبدأ بعلامة “_”, وعرض المعلومات المخصصة المتعلقة
add_filter('woocommerce_order_item_get_formatted_meta_data', 'format_order_item_meta_for_display', 10, 2);
function format_order_item_meta_for_display($formatted_meta, $item) {
$display_meta = array();
foreach ($formatted_meta as $meta_id => $meta) {
// 不显示以下划线开头的“隐藏”元数据
if (!empty($meta->key) && substr($meta->key, 0, 1) !== '_') {
$display_meta[$meta_id] = $meta;
}
}
return $display_meta;
} إنشاء عملية إدارة الطلبات المتقدمة
قد لا تلبي عملية تتبع حالات الطلبات الافتراضية في ووكوميرس (WooCommerce) جميع احتياجات الأعمال، مثل حالات مثل “في انتظار المراجعة” أو “قيد التوزيع”. من خلال استخدام الخيوط البرمجية (hooks)، يمكننا توسيع هذه العملية لتلبية احت
أولاً، من الضروري تسجيل حالات الطلبات المخصصة. عادةً ما يتم ذلك في… init تم إكمال العملية، ثم تم المضي قدمًا من خلالها. wc_order_statuses يقوم المرشح (الفلتر) بإضافتها إلى قائمة الحالات (status list).
add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {
register_post_status('wc-quality-check', array(
'label' => 'قيد التحقق من الجودة',
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('قيد التحقق من الجودة')
));
} <span class="count">(%s)</span>'، 'قيد عملية فحص الجودة.' <span class="count">(%s)</span>'مرحبًا، أنا أريد ترجمة هذا النص إلى العربية:
```php
function add_custom_status_to_list($order_statuses) {
$order_statuses['wc-quality-check'] = 'تحت التدقيق';
return $order_statuses;
}
```
```php
add_filter('wc_order_statuses', 'add_custom_status_to_list');
```
الآن أريد ترجمة هذا النص إلى العربية:
```php
function add_custom_status_to_list($order_statuses) {
$order_statuses['wc-quality-check'] = 'قيد التدقيق';
return $order_statuses;
}
```
```php
add_filter('wc_order_statuses', 'add_custom_status_to_list');
``` بعد ذلك، من الضروري تحديد السلوكيات المناسبة لكل تغيير في الحالة (state change).woocommerce_order_status_changed يمكن لخطافات الأعمال (Action Hooks) أن تلتقط أي تغييرات في حالة الطلب. يمكننا استخدامها لإرسال إشعارات تلقائية إلى قسم المراجعة عندما يدخل الطلب حالة “قيد المراجعة”.
add_action('woocommerce_order_status_changed', 'handle_custom_order_status_change', 10, 4);
function handle_custom_order_status_change($order_id, $old_status, $new_status, $order) {
if ($new_status == 'quality-check') {
// 获取订单信息
$order_number = $order->get_order_number();
$admin_email = get_option('admin_email');
// 发送邮件通知(此处为示例,实际应用可能需要更复杂的逻辑)
wp_mail($admin_email, '新订单待质检', "订单 #{$order_number} 已进入质检环节,请及时处理。");
}
} بالإضافة إلى ذلك، يمكننا أيضًا استخدام… woocommerce_admin_order_actions يوفر الفلتر زرًا للعمليات السريعة على الحالات المخصصة في صفحة قائمة الطلبات في الخلفية، مثل “اجتياز الفحص الجودة”، مما يسمح بتغيير الحالة بنقرة واحدة إلى المرحلة التالية، مما يعزز بشك
القراءة الموصى بها دليل شامل لتطوير مواقع ووردبريس: التقنيات الأساسية والممارسات العملية من المبتدئين إلى المحترفين。
الملخصات
نظام الخيوط (Hooks) في WooCommerce يعتبر الأساس الذي يقوم عليه هذا الحل التجاري الرائد، حيث يمنح المطورين القدرة على توسيع وظائف الموقع بشكل كبير. يبدأ الأمر باستخدام خيوط الأفعال (Action Hooks) لمراقبة والاستجابة لأحداث سلة التسوق، مرورًا بخيوط المرشحات (Filter Hooks) للتحكم الدقيق في المنتجات والأسعار والبيانات المعروضة، وصولاً إلى إنشاء تدفقات حالات الطلبات المخصصة التي تتناسب مع المتطلبات التجارية المعقدة. إتقان سيناريوهات استخدام هذه الخيوط الأساسية وطرق تطبيقها يمكّن المطورين من تجاوز القيود المفروضة على الوظائف الافتراضية، وإنشاء متاجر WooCommerce مخصصة بشكل كبير وآلية وفعالة، تناسب جميع سيناريوهات التجارة الإلكترونية سواء كانت في مجال التجزئة أو الجملة، أو المنتجات المادية أو الخدمات الرقمية.
الأسئلة الشائعة الأسئلة المتداولة
أين يجب أن أكتب كود الخطافات المخصصة (custom hooks)؟
بالنسبة للتخصيصات الفردية التي ترتبط ارتباطًا وثيقًا بمظهر الموضوع، يمكن كتابتها في قسم الفروع (الsubtopics). functions.php الملف موجود هناك؛ هذا المكان المعتاد لإجراء الاختبارات السريعة وإجراء التعديلات البسيطة.
ومع ذلك، من أجل تحقيق تجزئة الكود إلى وحدات منفصلة وسهولة الصيانة واستقلالية الوظائف (لتجنب فقدان الميزات عند تغيير القوالب)، فإن أفضل الممارسات هي إنشاء إضافة (plugin) متخصصة لهذه الوظائف. قم بتجميع كل الكود المخصص لـ WooCommerce (مثل الروابط الخاصة بالوظائف، الأكواد المختصرة، إلخ) داخل هذه الإضافة، بحيث تعمل وظائف متجرك الإلكتروني بشكل مستقر بغض النظر عن القالب المستخدم.
كيف يمكنني تصحيح أخطاء الكود الخاص بي للتأكد من أن الأحداث المرتبطة به (الـ “hooks”) تتم تنفيذها بشكل صحيح؟
أولاً، تأكد من تفعيل وضع التصحيح في WordPress (في <). wp-config.php إعدادات في المنتصف. define('WP_DEBUG', true);هذا يساعد على اكتشاف الأخطاء النحوية.
لتصحيح أخطاء منطق تشغيل المخالب (hooks)، يمكنك إضافة كود لتسجيل السجلات المؤقتة في بداية دالة الاستدعاء الخاصة بك. error_log() تقوم الدالة بكتابة معلومات التصحيح (التدقيق) في سجلات الخادم، أو تستخدمها بطريقة معينة. wc_get_logger() يتم كتابة السجلات في ملفات خاصة بنظام WooCommerce. من خلال مراجعة محتويات هذه السجلات ومعرفة ما إذا كانت النتائج المتوقعة موجودة فيها، يمكن تحديد ما إذا تم تفعيل الأحداث المبرمجة (الـ “hooks”) وما إذا ت
ماذا أفعل إذا كان كود الخصم المخصص الخاص بي يتعارض مع بعض الإضافات (مثل القسائم)؟
أولوية تنفيذ الخطافات (Hook Execution Priority)add_action المعلمة الثالثة هي المفتاح لحل الصراعات بين الإجراءات المختلفة. الأولوية الافتراضية هي 10، وكلما كان الرقم أصغر، كان التنفيذ أسرع. إذا كان حساب الخصومات الخاص بك يعتمد على الحالة النهائية لسلة التسوق، فيجب تعيين أولوية أعلى (مثل 20) لضمان تنفيذ منطقك بعد أن يقوم الإضافات الأخرى (مثل إضافة الكوبونات، والتي قد تكون أولويتها 10) بتعديل الأسعار.
إذا كانت التعارضات معقدة، قد يلزم استخدام تحكمات شرطية للتحقق في دالتك مما إذا كانت هناك خصومات أخرى قد تم تطبيقها بالفعل، أو استخدام… did_action()、doing_action() دالة لتحديد البيئة التنفيذية الحالية، لتجنب الحسابات المكررة أو الحلقات المنطقية المغلقة.
بعد إضافة حالات طلبات مخصصة، لماذا لا يتم عرضها في خانة التصفية المنسدلة لقائمة الطلبات في الواجهة الخلفية؟
فقط من خلال… wc_order_statuses حالة تسجيل المرشح (الفلتر) قد لا تكون كافية أحيانًا لظهوره في قوائم الاختيار الهابطة في جميع واجهات الإدارة. وقد يكون ذلك بسبب المخزن المؤقت (الكاش) أو آلية إنشاء القوائم.
تأكد من أن كودك قد تم تحميله بشكل صحيح. بالإضافة إلى ذلك، يمكنك محاولة تحديث ذاكرة التخزين المؤقتة للصفحة الخلفية (Shift+F5)، أو استخدام أي أداة أخرى متاحة لتحسين أداء الموقع. woocommerce_register_shop_order_post_statuses يتم تسجيل المرشحات (filters) على مستوى أعمق في النظام. إذا استمرت المشكلة، فقم بالتحقق مما إذا كانت هناك إضافات (plugins) أو أكواد للمواقع (theme codes) أخرى تغطي عمل هذه المرشحات. يمكنك تحديد ذلك عن طر
ما التالي، ما التالي؟
القراءة الموسعة والمعرفة العملية
فيما يلي بعض الموضوعات ذات الصلة بموضوع هذه المقالة وهي مناسبة لمزيد من القراءة المتعمقة. وغالباً ما يكون من الأفضل إعطاء الأولوية للبدء بالمقال الأقرب إلى مشكلتك الحالية ثم التوسع تدريجياً إلى المواضيع المحيطة.
- دليل أساسي للتطوير المخصص لووردبريس: الممارسة الشاملة من بناء القوالب إلى كتابة الإضافات
- ما هو الثيم الفرعي (Subtheme) لـ WordPress؟
- البدء من الصفر: العملية الكاملة لتطوير مواقع ووردبريس الحديثة وأفضل الممارسات
- دليل شامل لتطوير إضافات ووردبريس: من المبتدئين إلى الخبراء في إنشاء إضافات متخصصة
- دليل متقدم للتطوير الفعال باستخدام ووردبريس: من تخصيص القوالب إلى تحسين الأداء بشكل شامل