skip to Main Content

Im trying to schedule the sale period in woocommerce when a post is saved (published).

I have tried both methods below but neither of them are working. The code is being called at the right time, just not updating the post meta.

Neither methods are updating the sale schedule.

add_action('save_post_product', array($this, 'knpv_new_product_from_draft'), 10, 2);
add_action('edit_post_product', array($this, 'knpv_new_product_from_draft'), 10, 2);
public function knpv_new_product_from_draft($post_id, $post){   


    //Get todays date and the date 15 days from now
    $datefrom = strtotime(date('Y-m-d'));
    $dateto = strtotime(date('Y-m-d', strtotime('+15 days',$datefrom)));

    //Method 1
    $product = wc_get_product($post_id);

    if( !empty(get_post_meta($post_id, '_sale_price', true)) ){         
        $product->set_date_on_sale_from( $datefrom );
        $product->set_date_on_sale_to( $dateto );
    }

    $product->save();       

    //Method 2    
    $var = update_post_meta($post_id, '_sale_price_dates_from', $datefrom);
    $var2 = update_post_meta($post_id, '_sale_price_dates_to',   $dateto);

}   

2

Answers


  1. Chosen as BEST ANSWER

    The reason this wasn't working was because the meta was being updated after the save_post action had finished. So I was updating the meta, then the empty values from the form were also updating them and clearing them.

    So I did it like this.

    add_action('save_post_product', array($this, 'knpv_new_product_from_draft'), 10, 2);
    add_action('edit_post_product', array($this, 'knpv_new_product_from_draft'), 10, 2);
    public function knpv_new_product_from_draft($post_id, $post){  
      //If the post is being published. 
      if (get_post_status($post_id) == 'publish') {
    
        //Set the values from the posted form data.
        $_POST['_sale_price_dates_from'] = date('Y-m-d');
        $_POST['_sale_price_dates_to'] = date('Y-m-d', strtotime($datefrom.' +15 days'));
    
      }
    } 
    

  2. You can use one of the following ways:

    1st Way – Since WooCommerce 3:

    add_action( 'woocommerce_admin_process_product_object', array($this, 'save_wc_product_meta_data') );
    public function save_wc_product_meta_data($product) {   
    
        if( isset( $_POST['_sale_price'] ) && $_POST['_sale_price'] >= 0 ){
            $product->set_date_on_sale_from( strtotime(date('Y-m-d')));
            $product->set_date_on_sale_to( strtotime( date('Y-m-d', strtotime('+15 days'))));
        }
    } 
    

    2nd Way – the old way:

    add_action( 'woocommerce_process_product_meta', array($this, 'save_wc_product_meta_data') );
    public function save_wc_product_meta_data($product_id) {   
    
        if( get_post_meta($product_id, '_sale_price', true) >= 0 ){
            update_post_meta($product_id, '_sale_price_dates_from', strtotime(date('Y-m-d')));
            update_post_meta($product_id, '_sale_price_dates_to', strtotime( date('Y-m-d', strtotime('+15 days'))));
        }
    } 
    

    Code goes in functions.php file of your active child theme (or active theme). Both ways work.


    Addition:

    To make that happen only when the post status is set on "publish", you can add the following to the IF statement existing conditions:

    && isset($_POST['post_status']) && $_POST['post_status'] === 'publish'
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search