PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, May 9, 2022

[FIXED] How to programmatically schedule sale dates in Woocommerce

 May 09, 2022     hook-woocommerce, php, product, woocommerce, wordpress     No comments   

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)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

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

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing