
طلب شائع جدًا من أصحاب المتاجر: حقل إضافي في صفحة الدفع (وقت التوصيل، رقم واتساب، اسم المستلم، ملاحظة للمندوب). الإضافات الجاهزة تفعل ذلك، لكن مع حقل أو اثنين، 40 سطرًا من الكود أنظف وأسرع ولا تحتاج تحديثًا.
ماذا سيفعل الكود؟
- يضيف حقل «وقت التوصيل المفضل» كقائمة اختيار بعد حقول الفوترة.
- يتحقق أنه مُختار قبل إتمام الطلب.
- يحفظه في بيانات الطلب.
- يعرضه في صفحة الطلب في لوحة التحكم، وفي إيميلات الطلب، وفي صفحة «شكرًا».
functions.php للقالب الابن، أو في إضافة Code Snippets. لا تعدّل ملفات القالب الأصلي أو ووكومرس نفسه.الكود الكامل
/**
* حقل "وقت التوصيل المفضل" في صفحة الدفع — ووكومرس
* يعمل مع صفحة الدفع الكلاسيكية (Shortcode). لصفحة الدفع بالكتل انظر الملاحظة أدناه.
*/
// 1) إضافة الحقل بعد حقول الفوترة
add_action( 'woocommerce_after_order_notes', 'mirror_delivery_time_field' );
function mirror_delivery_time_field( $checkout ) {
echo '<div id="mirror_delivery_time_wrap"><h3>وقت التوصيل</h3>';
woocommerce_form_field( 'mirror_delivery_time', array(
'type' => 'select',
'class' => array( 'form-row-wide' ),
'label' => 'وقت التوصيل المفضل',
'required' => true,
'options' => array(
'' => 'اختر الوقت المناسب',
'morning' => 'صباحًا (9 – 12)',
'afternoon' => 'ظهرًا (12 – 4)',
'evening' => 'مساءً (4 – 9)',
),
), $checkout->get_value( 'mirror_delivery_time' ) );
echo '</div>';
}
// 2) التحقق قبل إتمام الطلب
add_action( 'woocommerce_checkout_process', function () {
if ( empty( $_POST['mirror_delivery_time'] ) ) {
wc_add_notice( 'من فضلك اختر وقت التوصيل المفضل.', 'error' );
}
} );
// 3) الحفظ في الطلب
add_action( 'woocommerce_checkout_create_order', function ( $order ) {
if ( ! empty( $_POST['mirror_delivery_time'] ) ) {
$order->update_meta_data( '_mirror_delivery_time', sanitize_text_field( wp_unslash( $_POST['mirror_delivery_time'] ) ) );
}
} );
// 4) نص مقروء للقيمة
function mirror_delivery_time_label( $key ) {
$labels = array(
'morning' => 'صباحًا (9 – 12)',
'afternoon' => 'ظهرًا (12 – 4)',
'evening' => 'مساءً (4 – 9)',
);
return $labels[ $key ] ?? $key;
}
// 5) العرض في لوحة التحكم (صفحة الطلب)
add_action( 'woocommerce_admin_order_data_after_shipping_address', function ( $order ) {
$value = $order->get_meta( '_mirror_delivery_time' );
if ( $value ) {
echo '<p><strong>وقت التوصيل:</strong> ' . esc_html( mirror_delivery_time_label( $value ) ) . '</p>';
}
} );
// 6) العرض في الإيميلات وصفحة "شكرًا"
add_filter( 'woocommerce_get_order_item_totals', function ( $totals, $order ) {
$value = $order->get_meta( '_mirror_delivery_time' );
if ( $value ) {
$totals['mirror_delivery_time'] = array(
'label' => 'وقت التوصيل:',
'value' => mirror_delivery_time_label( $value ),
);
}
return $totals;
}, 10, 2 );
شرح الأجزاء المهمة
- woocommerce_form_field: الدالة الرسمية لبناء الحقول؛ تعطيك نفس تنسيق حقول ووكومرس وتدعم أنواع text وselect وcheckbox وtextarea.
- الحفظ بـ update_meta_data: الطريقة الحديثة المتوافقة مع تخزين الطلبات عالي الأداء (HPOS). لا تستخدم
update_post_metaمع الطلبات. - البادئة _ في اسم الميتا: تخفيه من صندوق «الحقول المخصصة» في لوحة التحكم.
- sanitize_text_field: لا تحفظ أي مُدخل من المستخدم بدون تنظيف.
تعديلات شائعة
أريد حقل نص حر بدل القائمة
'type' => 'select' إلى 'text' واحذف مصفوفة options. للملاحظات الطويلة استخدم 'textarea'.أريد الحقل قبل حقول الفوترة
woocommerce_after_order_notes بـ woocommerce_before_checkout_billing_form.الحقل لا يظهر عندي
، أو تستخدم واجهة «Additional Checkout Fields API» الخاصة بالكتل.كيف أضيف الحقل لملف PDF للفاتورة؟
wpo_wcpdf_after_order_details واطبع $order->get_meta('_mirror_delivery_time').تخصيصات ووكومرس متقدمة
حقول ديناميكية، قواعد شحن معقدة، تكامل مع شركات التوصيل والدفع — فريق Mirror ORG يطوّر متجرك حسب احتياجك.
اطلب تخصيصًا