Измените дату начала продукта подписки WooCommerce перед добавлением в корзину - PullRequest
0 голосов
/ 28 октября 2018

Возникла проблема с одним из моих веб-сайтов WooCommerce, использующим плагин WooCommerce Подписки.

Проблема в том, что один товар поставляется только каждые 2 недели в определенную дату.

Следующая дата доставки9 ноября.

Мне нужно выяснить, как добавить это в качестве даты начала по умолчанию для продукта.

Я попытался использовать функции, описанные в классе WC_Subscription_Synchroniser плагина WooCommerce Subscription.

Я включил функцию синхронизации обновлений.

enter image description here

А также изменил дату синхронизации обновлений на пятницу каждой недели, поскольку 9 ноябряПятница.

enter image description here

Тем не менее, это означает, что первая дата продления должна быть 2 ноября, то есть наступающая пятница.

enter image description here

Я пытаюсь выяснить, как отложить дату начала до 9 ноября вместо 2 ноября, которое она отображает сейчас.

Любой совет приветствуется.

1 Ответ

0 голосов
/ 07 ноября 2018

Та же проблема здесь.Мне удалось подготовить дату начала в будущем, но есть жестко запрограммированное ограничение:

Проверьте этот фрагмент кода в 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 в базе данных.Хотя эта функциональность еще не полностью разработана, она может дать вам еще одну возможность для дальнейшей работы по настройке.

...