Dispatch received orders woocommerce to dealers se

2019-05-11 08:52发布

I have a list of emails (dealers) and I need when I receive order in wp-admin i open this order and send this order to a dealer (commercial , user...). Every dealer have an email and mark this order in custom field that he have been send to this dealer.

In my woocommerce orders page I need to open a order and do something like this:

  • Order 001 --- > send to Email1@exemple.com = Order 001 - Sent to Email1@exemple.com
  • Order 002 ----> send to Email2@exemple.com = Order 002 - Sent to Email2@exemple.com
  • Order 003 --- > send to Email1@exemple.com = Order 003 - Sent to Email1@exemple.com

I don't know where to start.

Does anyone have an idea or some code to achieve something like this?

Thanks

1条回答
Ridiculous、
2楼-- · 2019-05-11 09:22

Here is a complete answer that will feet your needs. You will have to set in the 2nd function the array of the emails and names from your dealer list.

This code will display in backend Order edit pages a custom metabox with a selector, were you will set a dealer and you will click on "Save Order"…

Custom Edit Order metabox

A New Order notification email will be sent just once to that dealer email address.

Here is the code:

//Adding Meta container admin shop_order pages
add_action( 'add_meta_boxes', 'my_custom_order_meta_box' );
if ( ! function_exists( 'my_custom_order_meta_box' ) )
{
    function my_custom_order_meta_box()
    {
        global $woocommerce, $order, $post;

        add_meta_box( 'dealer_dispatch', __('Dealer Dispatch','woocommerce'), 'add_order_custom_fields_for_packaging', 'shop_order', 'side', 'core' );
    }
}


//adding Meta field in the meta container admin shop_order pages
if ( ! function_exists( 'add_order_custom_fields_for_packaging' ) )
{
    function add_order_custom_fields_for_packaging()
    {
        global $woocommerce, $order, $post;

        // Define HERE your array of values  <==  <==  <==  <==  <==  <==  <==  <==
        $option_values = array(
            'default'               => __('no selection', 'woocommerce'),
            'dealer1@email.com'     => 'Dealer 1 Name',
            'dealer2@email.com'     => 'Dealer 2 Name',
            'dealer3@email.com'     => 'Dealer 3 Name',
        );

        // Get the values from the custom-fields (if they exist)
        $meta_field_data = get_post_meta( $post->ID, '_dealer_dispatch', true );
        $dealer_email_sent = get_post_meta( $post->ID, '_dealer_email_sent', true );

        echo '<input type="hidden" name="my-custom-order_meta-box-nonce" value="'. wp_create_nonce() .'">

            <label for="dealer_dispatch">'.__('Select a dealer', 'woocommerce').'</label><br>
            <select name="dealer_dispatch">';

                    foreach( $option_values as $option_key => $option_value ){

                        if ( $meta_field_data == $option_key || 'default' == $option_key )
                            $selected = ' selected';
                        else
                            $selected = '';

                        echo '<option value="'.$option_key.'"'.$selected.'>'. $option_value.'</option>';
                    }

            echo '</select><br>';

        // if an email has been sent to the dealer we display a message
        if( ! empty($dealer_email_sent) )
            echo '<p style="color:green; font-weight:bold;">'.__('Email sent to: ', 'woocommerce').$dealer_email_sent.'</p>';
    }
}


//Save the data of the Meta field
add_action( 'save_post', 'add_my_custom_field_for_order_meta_box', 20, 1 );
if ( ! function_exists( 'add_my_custom_field_for_order_meta_box' ) )
{

    function add_my_custom_field_for_order_meta_box( $post_id ) {

        ## Verify and securing data. ##

        // Check if our nonce is set.
        if ( ! isset( $_POST[ 'my-custom-order_meta-box-nonce' ] ) ) {
            return $post_id;
        }
        $nonce = $_REQUEST[ 'my-custom-order_meta-box-nonce' ];

        //Verify that the nonce is valid.
        if ( ! wp_verify_nonce( $nonce ) ) {
            return $post_id;
        }

        // Continuing only if form is submited.
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return $post_id;
        }

        // Check and set the user's permissions.
        if ( 'page' == $_POST[ 'post_type' ] ) {

            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                return $post_id;
            }
        } else {

            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                return $post_id;
            }
        }

        //  --  --  IT IS SECURED NOW  --  --

        // Sanitize input and update order meta data custom field.
        $dealer_dispatch = $_POST[ 'dealer_dispatch' ];

        // Saving the selected value
        if( 'default' != $dealer_dispatch )
            update_post_meta( $post_id, '_dealer_dispatch', sanitize_text_field( $dealer_dispatch ) );


        # SEND CUSTOM EMAIL ONLY ONCE #

        $dealer_dispatch_val = get_post_meta( $post_id, '_dealer_dispatch', true );
        $dealer_email_sent = get_post_meta( $post_id, '_dealer_email_sent', true );

        if( empty($dealer_email_sent) && !empty($dealer_dispatch_val) ){

            $email_notifications = WC()->mailer()->get_emails();
            $email_notifications['WC_Email_New_Order']->recipient = $dealer_dispatch;
            $email_notifications['WC_Email_New_Order']->trigger( $post_id );

            // Creating a custom meta data for this order to avoid sending this email 2 times
            update_post_meta( $post_id, '_dealer_email_sent', $dealer_dispatch_val );
        }
    }
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested and works.

查看更多
登录 后发表回答