Monday, May 9, 2022

[FIXED] How to programmatically schedule sale dates in Woocommerce

Issue

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);

}   

Solution

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'


Answered By - LoicTheAztec
Answer Checked By - Candace Johnson (PHPFixing Volunteer)

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.