skip to Main Content

I am making a WordPress plugin, where I need to make an API call every time order status updates to "processing" from "pending".

    function __construct(){
        add_action( 'woocommerce_after_order_object_save', [$this,'action_woocommerce_doba_order_import'], 10, 1 ); 
    }

    public function action_woocommerce_doba_order_import($order){
            
        if ( 'processing' === $order->get_status() ) {
           "API call here" 
        }
            
    }

This code works fine when order status updates to "processing" from "pending" but it makes two additional API calls when status changes to something else from "processing".
So I get two additional API calls for each order it status changes from processing to something else.
I am definitely making some mistakes. Maybe I am using the wrong hook or need to put a different condition.

2

Answers


  1. We have created a WordPress code for changing the order status, Hooks function call every time order status updates to "processing" from "pending".

    You try this:

      function __construct(){
                add_action( 'woocommerce_after_order_object_save', [$this,'action_woocommerce_doba_order_import'], 10, 1 ); 
            }
        
            public function action_woocommerce_doba_order_import($order_id){
                    
            if( ! $order_id ) return;
        
            $order = wc_get_order( $order_id );
        
            if( $order->get_status() == 'pending' ) {
                $order->update_status( 'processing' );                
            }
    
    }
    
    Login or Signup to reply.
  2. I tried to find this action in the newest version of the WooCommerce plugin [6.3.1] and I couldn’t, but I found out that there’s probably a better hook to use, which includes the new status.

    do_action( 'woocommerce_order_edit_status', $this->get_id(), $result['to'] );

    So you could use it like this:

    function __construct(){
                add_action( 'woocommerce_order_edit_status', [$this,'action_woocommerce_doba_order_import'], 10, 2 ); 
            }
        
            public function action_woocommerce_doba_order_import($order_id, $new_status){
                    
            if( ! $order_id ) return;
    
            //ignore other status changes without additional calls
            if( 'pending' !== $new_status ) return;
    
            $order = wc_get_order( $order_id );
    
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search