Как программно запланировать даты продаж в Woocommerce - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь запланировать период продажи в woocommerce, когда сообщение сохраняется (публикуется).

Я пробовал оба метода ниже, но ни один из них не работает. Код вызывается в нужное время, просто не обновляя мета поста.

Ни один из методов не обновляет расписание продаж.

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 ]

1 голос
/ 28 мая 2020

Вы можете использовать один из следующих способов:

1-й способ - Начиная с 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'))));
    }
} 

2-й способ - старый способ:

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

Код входит в функции. php файл вашей активной дочерней темы (или активной темы). Оба способа работают.

Дополнение:

Чтобы это произошло , только когда статус публикации установлен на «publi sh» , вы можете добавить следующее к существующим условиям оператора IF:

&& isset($_POST['post_status']) && $_POST['post_status'] === 'publish'
0 голосов
/ 01 июня 2020

Причина, по которой это не работало, заключалась в том, что мета обновлялась после завершения действия save_post. Итак, я обновлял мета, затем пустые значения из формы также обновляли и очищали их.

Вот так я и сделал.

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

  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...