Та же проблема здесь.Мне удалось подготовить дату начала в будущем, но есть жестко запрограммированное ограничение:
Проверьте этот фрагмент кода в wcs_function.php
// validate the start_date field
if ( ! is_string( $args['start_date'] ) || false === wcs_is_datetime_mysql_format( $args['start_date'] ) ) {
return new WP_Error( 'woocommerce_subscription_invalid_start_date_format', _x( 'Invalid date. The date must be a string and of the format: "Y-m-d H:i:s".', 'Error message while creating a subscription', 'woocommerce-subscriptions' ) );
} else if ( wcs_date_to_time( $args['start_date'] ) > current_time( 'timestamp', true ) ) {
return new WP_Error( 'woocommerce_subscription_invalid_start_date', _x( 'Subscription start date must be before current day.', 'Error message while creating a subscription', 'woocommerce-subscriptions' ) );
}
Это не такможно создать подписку в будущем. Это может быть связано с ограничением плагина подписки или очень узким подходом к проблеме подписки.
Это означает, что даже манипулирование свойствами элемента корзины с помощью woocommerce_add_cart_item_data
,wcs_recurring_cart_start_date
, woocommerce_get_item_data
как и я, вы в конечном итоге будете ударять по стене. Вам нужно либо изменить жесткие ограничения на подписку Woocommerce, либо проявить большую изобретательность.
Теперь я покажу вам 3 задействованных действия / фильтра, это довольно просто.Я упростил этот материал, потому что он включал проверку и форматирование даты, которые вам могут не понадобиться.
Вам потребуется поле my_delay_post_attr
POST на странице вашего продукта.
Сначала сохраните вэлемент корзины - пользовательское поле, добавленное вами на странице товара.
add_filter('woocommerce_add_cart_item_data', 'my_woocommerce_add_cart_item_data', 10, 1);
/**
* Read a Y-m-d H:i:s formatted (mysql) date from POST data
* then store it in the cart item.
* @param $cart_item_data array
*/
function my_woocommerce_add_cart_item_data($cart_item_data)
{
if (@$_POST['my_delay_post_attr']) {
$cart_item_data['my_delay_post_attr'] = $_POST['my_delay_post_attr'];
}
return $cart_item_data;
}
Теперь, давайте изменим начальную дату при CART -> шаг ЗАКАЗА:
add_filter('wcs_recurring_cart_start_date', 'my_wcs_recurring_cart_start_date', 10, 2);
/**
* @param string $date
* @param \WC_Cart $recurring_cart
*
* @return mixed
*/
function my_wcs_recurring_cart_start_date($date, $recurring_cart) {
$cartContents = $recurring_cart->cart_contents;
if (!$cartContents) {
return $date;
}
if (!count($cartContents)) {
return $date;
}
$key = array_keys($cartContents)[0];
// I'd suggest you not to trust this, and apply some verification here
return @$cartContents[$key]['my_delay_post_attr];
}
И наконец отобразим эту информацию на странице корзины:
add_filter( 'woocommerce_get_item_data', 'my_woocommerce_get_item_data', 10, 2 );
public static function my_woocommerce_get_item_data( $item_data, $cart_item ) {
if (!@$cart_item['my_delay_post_attr']) {
return $item_data;
}
$item_data[] = array(
'key' => 'Start of the subscription',
'value' => $cart_item['my_delay_post_attr'],
'display' => '',
);
return $item_data;
}
РЕДАКТИРОВАТЬЯ получил поддержку Prosspress, и вот что они ответили мне об этом жестком ограничении на будущие подписки:
Я понимаю, что вы пытаетесь вручную создать подписку и спрашиваете об ограничении вокругдата начала должна быть в будущем.Это ограничение существует для поддержки шлюзов, поскольку некоторые из них очень специфичны и жестки в отношении сроков подписки.Возможно, вы можете безопасно обойти эту проверку, но мы не можем давать никаких обещаний - проверка есть по причине.Если вы настаиваете на его удалении, сначала запустите тщательное тестирование в среде разработки, чтобы убедиться в отсутствии проблем с вашим шлюзом.
EDIT2:
Я могу подтвердить, что PAYPAL выигралне работать с этим трюком.Что касается ответа Prosspress:
Мы не уверены, как Stripe и Mercanet справятся с этим изменением.(Мы точно знаем, что, например, PayPal Standard не справится с этим хорошо.)
Если вы решите двигаться дальше, мы рекомендуем провести тщательное тестирование.Однако мне интересно, есть ли более простой вариант для достижения того, чего вы пытаетесь достичь?Вам нужна фактическая дата создания в будущем, или вам просто нужен первый платеж в будущем?
Если последнее, вместо того, чтобы пытаться изменить date_created, вы можете рассмотреть возможность использования бесплатной пробной версии или создания ложной бесплатной пробной версии.Это функциональность, используемая для синхронизации подписки.Кроме того, мы недавно разделили date_created и start_date в базе данных.Хотя эта функциональность еще не полностью разработана, она может дать вам еще одну возможность для дальнейшей работы по настройке.