我想在创建初始(第一个)订单后更改活动订阅的下一个付款日期。
当前代码不起作用。为什么?我错过了什么?
//fires when new order payment is complete (NOT RENEWAL but original order!)
add_action('woocommerce_payment_complete', 'fm_upate_next_payment_datetime');
function fm_upate_next_payment_datetime ( $order_id ) {
if (WC_Subscriptions_Order::order_contains_subscription( $order_id ) == false) return;
$subscription_key = WC_Subscriptions_Manager::get_subscription_key( $order_id, $product_id
= '');
//hard code next payment date...(must be in future)
$next_payment = date( 'Y-m-d H:i:s', '2016-05-20 00:10:10' );
//set the new payment date
WC_Subscriptions_Manager::set_next_payment_date( $subscription_key, $user_id = '', $next_payment );
}
答案 0 :(得分:2)
你说了什么,我们还需要设定一个开始日期! (现在可以),但如果没有通过它会抛出错误。 得到这样的工作:
function saveNewDate($post_id) {
$subscription = wcs_get_subscription( $post_id );
$dates = array();
$datetime = current_time( 'timestamp', true );
$dates[ 'start' ] = date( 'Y-m-d H:i:s', $datetime );
$datetime = strtotime( "08/23/2016 23:30" );
$dates['next_payment'] = date( 'Y-m-d H:i:s', $datetime );
try {
$subscription->update_dates( $dates, 'gmt' );
wp_cache_delete( $post_id, 'posts' );
} catch ( Exception $e ) {
wcs_add_admin_notice( $e->getMessage(), 'error' );
}
}
答案 1 :(得分:1)
我认为这不起作用,因为您使用空变量$subscription_key
来呼叫$product_id
。
在您的函数中,使用此代码,您没有$product_id
的值。
您应该通过引用传递它或从函数中提取。
答案 2 :(得分:0)
Woocommerce订阅在3天之前更改了下一个付款日期:
add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);
function nextpaymentdatechange($order_id){
if (WC_Subscriptions_Order::order_contains_subscription($order_id)) {
$subid = $order_id+1;
$nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
$threedays_ago = date('Y-m-d H:i:s', strtotime('-3 days', strtotime($nextdate)));
update_post_meta($subid , '_schedule_next_payment', $threedays_ago);
}
}
答案 3 :(得分:0)
add_action('woocommerce_thankyou', 'nextpaymentdatechange', 10, 1);
function nextpaymentdatechange( $order_id ){
if ( wcs_order_contains_subscription( $order_id ) ) {
$subid = $order_id + 1;
$nextdate = get_post_meta( $subid, '_schedule_next_payment', true );
$threedays_ago = date( 'Y-m-d H:i:s', strtotime( '-3 days', strtotime( $nextdate )) );
update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);
}
}
请不要在update_post_meta()
中使用4个值。
仅通过更改以下内容使用3个值:
update_post_meta( $subid , '_schedule_next_payment', $threedays_ago, $nextdate );
至:
update_post_meta( $subid , '_schedule_next_payment', $threedays_ago);
答案 4 :(得分:0)
对我来说可行的解决方案是(另见 https://docs.woocommerce.com/document/subscriptions/develop/functions/#section-4):
function update_next_payment_date($subscription) {
$date = new DateTime('2021-05-28');
$date->setTime(8, 55);
$subscription_next_payment_date = date_format($date, 'Y-m-d H:i:s'); // = '2021-05-28 08:55:00'
$new_dates = array(
'start' => $subscription->get_date('start'),
'trial_end' => $subscription->get_date('trial_end'),
'next_payment' => $subscription_next_payment_date,
'last_payment' => $subscription->get_date('last_payment'),
'end' => $subscription->get_date('end'),
);
$subscription->update_dates($new_dates);
}