在添加到购物车之前更改 WooCommerce 订阅产品的开始日期

Jac*_*son 2 php wordpress woocommerce woocommerce-subscriptions

我的一个使用 WooCommerce 订阅插件的 WooCommerce 网站有问题。

问题是一种产品仅在特定日期每 2 周发货一次。

下一个发货日期是 11 月 9 日。

我需要弄清楚如何将其添加为产品的默认开始日期。

我尝试使用 WooCommerce 订阅插件的 WC_Subscriptions_Synchroniser 类中描述的功能。

我启用了同步续订功能。

在此处输入图片说明

并且还将同步续订日期更改为每周的星期五,因为 11 月 9 日是星期五。

在此处输入图片说明

但是,这使得第一个续订日期是 11 月 2 日,也就是即将到来的星期五。

在此处输入图片说明

我想弄清楚如何将开始日期推迟到 11 月 9 日而不是现在显示的 11 月 2 日。

任何建议表示赞赏。

Gui*_*bod 6

同样的问题在这里。我设法准备了未来的开始日期,但对此有一个硬编码限制。

查看 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' ) );
}
Run Code Online (Sandbox Code Playgroud)

将来无法创建订阅。这可能与订阅插件限制有关,或者订阅问题的方法非常狭隘。

这意味着通过车项目属性,即使是杂耍woocommerce_add_cart_item_datawcs_recurring_cart_start_datewoocommerce_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;
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们在 CART -> ORDER 步骤上更改开始日期:

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];
}
Run Code Online (Sandbox Code Playgroud)

最后在购物车页面中显示此信息:

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我已经获得了 Prosspress 的支持,这就是他们对未来订阅的这个硬性限制的回答:

我了解您正在尝试手动创建订阅,并询问未来开始日期的限制。这个限制是为了支持网关,因为有些是非常具体和严格的订阅时间。您可能可以安全地为该检查创建一个解决方法,但我们不能做出任何承诺 - 检查是有原因的。如果您坚持要删除它,请先在开发环境中进行全面测试,以确保您的网关没有问题。

编辑2:

我可以确认 PAYPAL 不能使用这个技巧。至于 Prospress 的回应:

我们不确定 Stripe 和 Mercanet 将如何处理这一变化。(例如,我们确实知道 PayPal Standard 不能很好地处理这个问题。)

如果您决定继续这样做,我们建议您进行非常彻底的测试。但是,我想知道是否有更简单的选择来完成您想要实现的目标?您需要实际创建日期在未来,还是只需要第一次付款在未来?

如果是后者,与其尝试更改 date_created,不如考虑使用免费试用版或创建虚假免费试用版。这是用于订阅同步的功能。此外,我们最近在数据库中分离了 date_created 和 start_date。虽然此功能尚未完全开发,但在您继续进行自定义时,它可能会为您提供另一个工作点。