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.