Чтобы это работало, вам нужно сначала получить WC_Subscription
Объекты из заказа, используя:
$subscriptions = wcs_get_subscriptions_for_order( $order_id );
, который дает массив объектов WC_Subscription для Заказа, из идентификатора заказа.
Теперь вы можете использовать метод WC_Subscription
update_dates($dates)
, который требует установки массива всех типов дат из подписки: 'start'
, 'trial_end'
, 'next_payment'
, 'last_payment'
и 'end'
.
Чтобы получить конкретную c дату из подписки, мы используем WC_Subscription
метод get_date($date_type)
.
Кроме того, я использую WC_Subscription
метод can_date_be_updated($date_type)
, чтобы проверить, можно ли обновить тип даты.
Я не уверен, какие даты требуют обновления, поскольку они, вероятно, связаны .
Вы можете попробовать следующее, чтобы обновить даты связанных подписок из заказа на основе вашего кода (код не вызывает ошибок) .
Я думаю, вам нужно изменить даты 'next_payment'
, 'last_payment'
и 'end'
.
Используя методы update_dates () и save () в конец кода, позволяет изменять даты, сохранять все необходимые данные в базу данных обновлять кэшированные данные.
Код функции:
function nextpaymentdatechange( $order_id ){
// YOUR SETTINGS: Set in this array your desired dates (value(s)) by product Id (key)
$dates_for_product = array(
876 => array(
'next_payment' => '2020-11-15 07:00:00',
'last_payment' => '2020-11-16 07:00:00',
),
877 => array(
'next_payment' => '2021-02-15 07:00:00',
'last_payment' => '2021-02-16 07:00:00',
),
878 => array(
'next_payment' => '2021-08-03 07:00:00',
'last_payment' => '2021-08-04 07:00:00',
),
);
// The date types for subscriptions
$suscription_date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end');
// Get the subscriptions from the current order Id
$subscriptions = wcs_get_subscriptions_for_order( $order_id );
// Loop through subscriptions
foreach ( $subscriptions as $subscription_id => $subscription ) {
// Loop through items in this subscription
foreach ( $subscription->get_items() as $item_id => $item ) {
$product = $item->get_product();
// Loop through defined products dates
foreach( $dates_for_product as $product_id => $new_dates ) {
// If current subscription product id matches
if ( $product->get_id() == $product_id ) {
$current_product_id = $product_id; // Set current product id
break; // Stop the current loop
}
}
if ( isset($current_product_id) ) {
break; // Stop the current loop
}
}
// Updating subscription dates
if ( isset($current_product_id) ) {
$updated_dates = array(); // Initializing
// Loop through subscription date types
foreach( $suscription_date_types as $date_type ) {
$date = $subscription->get_date($date_type);
// For 'next_payment' and 'last_payment' dates
if( isset($new_dates[$date_type]) && $subscription->can_date_be_updated($date_type) ) {
$updated_dates[$date_type] = $new_dates[$date_type];
}
// For 'end' date
elseif ( $date_type === 'end' && $subscription->can_date_be_updated($date_type) ) {
$updated_dates[$date_type] = $new_dates['last_payment']; // ??? Or may be instead: $date; … (or simply: 0;)
}
// Other dates
else {
$updated_dates[$date_type] = $date;
}
}
// Update subscription date, save to database and refresh cached data
$subscription->update_dates($updated_dates);
$subscription->save();
}
}
}
Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Должно работать.