Home > Blockchain >  trigger function in custom class on WooCommerce action
trigger function in custom class on WooCommerce action

Time:01-15

I am using the following class to have a directory created with dynamic value - based on a woo custom checkout field. Works perfect on page refresh and directory is created like expected.

just need this to only trigger/instantiate on the WooCommerce actions

woocommerce_order_status_completed

or

woocommerce_order_status_changed

or

woocommerce_thankyou_page

how can this be done so that it does not always run every time a page is loaded to decrease the load and have better efficiency in general.

here is the complete class

//add_action( 'plugins_loaded', array( 'pos__URL', 'init' ));    //uncomment to trigger on page refresh
class pos__URL {

public static function init() {
    $POS__sys_URL = __CLASS__;
    new $POS__sys_URL;
}

public function __construct()
{
add_action('init', array($this, 'pos__URL_Field'));
}

public function pos__URL_Field()
{
    //--------to access the value----start-----
    $orders = wc_get_orders(array(
        'customer_id' => get_current_user_id(),
        'return' => 'ids',
    ));
    //add the id of the custom meta field that lies in the order
    $meta_data = array();
    foreach ($orders as $order_id) {
      $meta_data[$order_id] = get_post_meta($order_id, '_engx_text_field_id', true);
    }
    //--------to access the value----end-----
    
    if( isset($meta_data[$order_id]) ) { //is the field set
    
        $curdir = getcwd(); //delcare variables
        
        if (!file_exists($meta_data[$order_id])) {

            if( mkdir( $curdir . "/" . $meta_data[$order_id], 0777) ) {
                    
                    //below section for for testing purposes to see if the command ran - and yes shows correctly and creates directory as expected IF the POS url is set - (triggers at the moment on page refresh)
                    echo "directory created";         //comment out when done testing
                }else{                              
                    echo "directory NOT created";     //comment out when done testing
                }
            }
    }else{
        
    if( empty($meta_data[$order_id]) ) {
        //do nothing
    }
  }
}
} //end function

I have tried the following to set the action on the inside of class but I am not doing it right and it didn't work

class pos__URL
{
public function init()
{
    add_action( 'woocommerce_order_status_changed', array('pos__URL') );
}

public function __construct()
{
add_action('init', array($this, 'pos__URL_Field'));
}

public function pos__URL_Field()
{
    //--------to access the value----start-----
    $orders = wc_get_orders(array(
        'customer_id' => get_current_user_id(),
        'return' => 'ids',
    ));
    //add the id of the custom meta field that lies in the order
    $meta_data = array();
    foreach ($orders as $order_id) {
      $meta_data[$order_id] = get_post_meta($order_id, '_engx_text_field_id', true);
    }
    //--------to access the value----end-----
    
    if( isset($meta_data[$order_id]) ) { //is the field set
    
        $curdir = getcwd(); //delcare variables
        
        if (!file_exists($meta_data[$order_id])) {

            if( mkdir( $curdir . "/" . $meta_data[$order_id], 0777) ) {
                    
                    //below section for for testing purposes to see if the command ran - and yes shows correctly and creates directory as expected IF the POS url is set - triggers at momment on page refresh
                    echo "directory created";         //comment out when done testing
                }else{                              
                    echo "directory NOT created";     //comment out when done testing
                }
            }
    }else{
        
    if( empty($meta_data[$order_id]) ) {
        //do nothing
    }
  }
}
}

CodePudding user response:

Try this, the pos__URL_Field function will only run when the woocommerce_order_status_completed action is triggered

class pos__URL {
  public static function init() {
    $POS__sys_URL = __CLASS__;
    add_action( 'woocommerce_order_status_completed', array( $POS__sys_URL, 'pos__URL_Field' ) );
    new $POS__sys_URL;
  }

  public function __construct() {}

  public function pos__URL_Field() {
    // put your code here
  }
}

CodePudding user response:

You should follow the same pattern you use for the plugins_loaded but this time replace it with whatever action you want to trigger the callback for. eg:

add_action( 'woocommerce_order_status_completed', array( 'pos__URL', 'init' ));

add_action( 'woocommerce_order_status_changed', array( 'pos__URL', 'init' ));

add_action( 'woocommerce_thankyou_page', array( 'pos__URL', 'init' ));

The init function of the pos_URL class will trigger when any of the above actions occur.

  • Related