WooCommerce: السماح للمستخدمين بتعديل أوامر المعالجة

A VPN is an essential component of IT security, whether you’re just starting a business or are already up and running. Most business interactions and transactions happen online and VPN

كيف يمكن لعملاء WooCommerce تعديل طلب قاموا بتقديمه ودفعوا مقابله للتو؟ أقسم أنني بحثت في نتائج محرك البحث وأماكن أخرى قبل أن أصل إلى الاستنتاج الذي كنت بحاجة إليه لكتابة هذا بنفسي.

على سبيل المثال ، قد يرغب المستخدم في تغيير تاريخ التسليم (إذا قمت بتوفير ذلك في صفحة الخروج). أو ربما يحتاجون إلى تغيير الحجم ، أو اتخاذ قرار بشأن منتج معين بالترتيب.

في كلتا الحالتين ، من المثير للصدمة بالنسبة لي أن هذه الوظيفة ليست في مكون إضافي – كالمعتاد إذا كنت مهتمًا بتخصيص هذا المقتطف / المكون الإضافي لاحتياجاتك الخاصة ، فلا تتردد في الاتصال.

لذا ، دعنا نرى كيف يتم ذلك!

عرض زر “تحرير الأمر” لمعالجة الطلبات فقط – WooCommerce

Snippet (PHP): السماح للعملاء بتحرير الطلبات @ صفحة حسابي على WooCommerce

أول شيء نحتاجه هو إظهار زر “تعديل الأمر” لمعالجة الطلبات فقط . هنا ، أنا فقط أستفيد وأعيد استخدام وظيفة “Order Again” التي تقدمها WooCommerce – هذا “الطلب مرة أخرى” يكرر الطلب المحدد ويملأ سلة التسوق بنفس المنتجات والميتا.

إذا حصلت على وجهة نظري ، فإن “تعديل الطلب” هو نفس تكرار الأمر الذي تريد تعديله ، وتقديم طلب جديد وحذف الطلب السابق . على الأقل هذا ما أراه وهو بالتأكيد أسهل بهذه الطريقة.

لإظهار زر “تعديل الأمر” لمعالجة الطلبات ، نحتاج إلى إلغاء قفل زر “الطلب مرة أخرى” (مرشح “woocommerce_valid_order_statuses_for_order_again”). بشكل افتراضي ، يتم عرض هذا فقط للطلبات المكتملة – نحتاج إلى المعالجة أيضًا (الجزء 1).

الآن يمكنني طباعة زر “تعديل الطلب” باستخدام مرشح “woocommerce_my_account_my_orders_actions”. كما ترى ، يجب أن يحتوي “add_query_arg” على “order_again” بحيث يؤدي النقر على الزر إلى تشغيل وظيفة الطلب مرة أخرى ، كما أقوم بإضافة “add_query_arg” ثانيًا يساوي “edit_order” حتى أعرف أن زر تحرير الأمر قد تم النقر عليه و ليس الأمر مرة أخرى. يتغير زر “الاسم” إلى “تعديل الأمر” (الجزء 2).

رائع – سيظهر الزر الآن ضمن حسابي> طلبات معالجة الطلبات ، وعند النقر فوق هذا سيتم إعادة التوجيه إلى عنوان URL لعربة التسوق الذي سيحتوي على معلمة (وسيتم ملء سلة التسوق بنفس المنتجات ، وذلك بفضل المعلمة “order_again” ). يمكنني الآن ببساطة “الاستماع” إلى هذا ومعرفة ما إذا كان الزر قد تم النقر عليه أثناء “woocommerce_cart_loaded_from_session”. يمكنني استخدام “$ _GET” لمعرفة ما إذا كان عنوان URL يحتوي على معلمات أم لا – وإذا كانت الإجابة بنعم ، فقم بإضافة معرف الطلب المعدل إلى جلسة سلة التسوق (الجزء 3).

أنتقل الآن إلى الجزأين 4 و 5: أرغب في إظهار إشعار عربة التسوق بأن العربة قد تم ملؤها بنفس المنتجات من الطلب السابق ، وأيضًا أنه تم تطبيق “ائتمان” على عربة التسوق الحالية في شكل خصم (” add_fee ”) – نعم ، إنه خصم يساوي نفس قيمة إجمالي الطلب الذي تم دفعه مسبقًا.

تحديث يناير 2019: يرجى ملاحظة أن add_fee () لا يعمل بشكل جيد عند استخدام المبالغ السالبة وأن الضرائب ممكّنة. في هذه الحالة ستحتاج إلى إيجاد بديل.

ثم ننتقل إلى القسم الأخير ، الجزء 6: إذا قدم العميل الطلب ، فمن الواضح أننا بحاجة إلى إلغاء الأمر “المعدل” وإظهار إشعار في صفحة مسؤول الطلب لكلا الطلبين ، بما في ذلك رابط إلى الطلب ذي الصلة ( ملغاة أو جديدة ، على التوالي). لهذا ، أستخدم وظيفة “add_order_note”.

حسنًا ، شرح طويل ولكن آمل أن يكون هذا مفيدًا 🙂

/**
 * @snippet       Edit Order Functionality @ WooCommerce My Account Page
 * @how-to        Get CustomizeWoo.com FREE
 * @sourcecode    https://businessbloomer.com/?p=91893
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 4.1
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */
  
// ----------------
// 1. Allow Order Again for Processing Status
  
add_filter( 'woocommerce_valid_order_statuses_for_order_again', 'bbloomer_order_again_statuses' );
  
function bbloomer_order_again_statuses( $statuses ) {
    $statuses[] = 'processing';
    return $statuses;
}
  
// ----------------
// 2. Add Order Actions @ My Account
  
add_filter( 'woocommerce_my_account_my_orders_actions', 'bbloomer_add_edit_order_my_account_orders_actions', 50, 2 );
  
function bbloomer_add_edit_order_my_account_orders_actions( $actions, $order ) {
    if ( $order->has_status( 'processing' ) ) {
        $actions['edit-order'] = array(
            'url'  => wp_nonce_url( add_query_arg( array( 'order_again' => $order->get_id(), 'edit_order' => $order->get_id() ) ), 'woocommerce-order_again' ),
            'name' => __( 'Edit Order', 'woocommerce' )
        );
    }
    return $actions;
}
  
// ----------------
// 3. Detect Edit Order Action and Store in Session
  
add_action( 'woocommerce_cart_loaded_from_session', 'bbloomer_detect_edit_order' );
             
function bbloomer_detect_edit_order( $cart ) {
    if ( isset( $_GET['edit_order'], $_GET['_wpnonce'] ) && is_user_logged_in() && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), 'woocommerce-order_again' ) ) WC()->session->set( 'edit_order', absint( $_GET['edit_order'] ) );
}
  
// ----------------
// 4. Display Cart Notice re: Edited Order
  
add_action( 'woocommerce_before_cart', 'bbloomer_show_me_session' );
  
function bbloomer_show_me_session() {
    if ( ! is_cart() ) return;
    $edited = WC()->session->get('edit_order');
    if ( ! empty( $edited ) ) {
        $order = new WC_Order( $edited );
        $credit = $order->get_total();
        wc_print_notice( 'A credit of ' . wc_price($credit) . ' has been applied to this new order. Feel free to add products to it or change other details such as delivery date.', 'notice' );
    }
}
  
// ----------------
// 5. Calculate New Total if Edited Order
   
add_action( 'woocommerce_cart_calculate_fees', 'bbloomer_use_edit_order_total', 20, 1 );
   
function bbloomer_use_edit_order_total( $cart ) {
    
  if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
     
  $edited = WC()->session->get('edit_order');
  if ( ! empty( $edited ) ) {
      $order = new WC_Order( $edited );
      $credit = -1 * $order->get_total();
      $cart->add_fee( 'Credit', $credit );
  }
    
}
  
// ----------------
// 6. Save Order Action if New Order is Placed
  
add_action( 'woocommerce_checkout_update_order_meta', 'bbloomer_save_edit_order' );
   
function bbloomer_save_edit_order( $order_id ) {
    $edited = WC()->session->get( 'edit_order' );
    if ( ! empty( $edited ) ) {
        // update this new order
        update_post_meta( $order_id, '_edit_order', $edited );
        $neworder = new WC_Order( $order_id );
        $oldorder_edit = get_edit_post_link( $edited );
        $neworder->add_order_note( 'Order placed after editing. Old order number: <a href="' . $oldorder_edit . '">' . $edited . '</a>' );
        // cancel previous order
        $oldorder = new WC_Order( $edited );
        $neworder_edit = get_edit_post_link( $order_id );
        $oldorder->update_status( 'cancelled', 'Order cancelled after editing. New order number: <a href="' . $neworder_edit . '">' . $order_id . '</a> -' );
        WC()->session->set( 'edit_order', null );
    }
}

المنشورات ذات الصلة:

WooCommerce: أضف علامة تبويب جديدة @ صفحة حسابي

WooCommerce: أضف ملاحظات الطلب إلى فواتير WooCommerce PDF

WooCommerce: تحديث Meta للمستخدم بعد طلب ناجح

WooCommerce: إخفاء أو إعادة تسمية علامة التبويب حسابي

WooCommerce: كيفية دمج علامات تبويب حسابي

WooCommerce: عيّن حالة الطلب المخصص للأوامر الجديدة

WooCommerce: صفحات منفصلة لتسجيل الدخول والتسجيل

WooCommerce: حفظ وعرض الوزن الإجمالي للطلب

WooCommerce: أعد تسمية “حسابي” إذا تم تسجيل الخروج في قائمة التنقل @

WooCommerce: قم بتحديث قيمة حقل الطلب بعد نجاح الطلب

أين تضيف هذا المقتطف؟

يمكنك وضع مقتطفات PHP في الجزء السفلي من ملف function.php القالب الفرعي الخاص بك (احذف “؟>” إذا كان لديك هناك). من ناحية أخرى ، ينتقل CSS في ملف style.css الخاص بسمة الطفل. تأكد من أنك تعرف ما تفعله عند تحرير مثل هذه الملفات – إذا كنت بحاجة إلى مزيد من الإرشادات ، فيرجى إلقاء نظرة على الفيديو التعليمي المجاني الخاص بي “أين تضع تخصيص WooCommerce؟”

هل هذا المقتطف (لا يزال) يعمل؟

يرجى إعلامي في التعليقات إذا كان كل شيء يعمل كما هو متوقع. يسعدني مراجعة المقتطف إذا أبلغت بخلاف ذلك (يرجى تقديم لقطات شاشة). لقد اختبرت هذا الكود مع موضوع Storefront وإصدار WooCommerce المذكور أعلاه واستضافة صديقة لـ وورد بريس على PHP 7.3.

إذا كنت تعتقد أن هذا الرمز وفر لك الوقت والمال ، فلا تتردد في الانضمام إلى أكثر من 14000 مشترك في WooCommerce Weekly للحصول على تحديثات منشورات المدونة أو أكثر من 250 من مؤيدي Business Bloomer لمدة 365 يومًا من مزايا WooCommerce . شكرا لكم مقدما 🙂

هل تحتاج إلى مساعدة في WooCommerce؟

تحقق من دروس الفيديو المجانية هذه. يمكنك تعلم كيفية تخصيص WooCommerce بدون مكونات إضافية غير ضرورية ، وكيفية تكوين إعدادات البرنامج المساعد WooCommerce بشكل صحيح وحتى كيفية إتقان استكشاف أخطاء WooCommerce في حالة حدوث خطأ!

توضيح

اي عملية نسخ او اقتباس او ترجمة او نقل تم لاغراض علمية وتدريبية وتعليمية بحته وقد تم انشاء هذا المحتوى بمعرفة خبراء في مجال التقنية اما عن طريق إنشاء او تحرير او نقل او نسخ او اقتباس او ترجمة المحتوى من مصادر خاصة او عامة وكل ذلك ضمن حقوق النشر المتعارف عليها.

اي أخطاء تظهر في المحتوى مهما كان نوعه او تصنيفه يمكنك تحرير رسالة فورية لادارة موثوق لاجل تصحيح هذه الاخطاء، وسنكون شاكرين لك في حال قمت بالتعاون معنا لاجل اصلاح هذه الاخطاء.

شاركنا رايك وتقييمك للموضوع

{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}