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

时间:2018-10-28 15:45:09

标签: php wordpress woocommerce woocommerce-subscriptions

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

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

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

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

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

我启用了“同步续订”功能。

enter image description here

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

enter image description here

但是,这将首次续订日期定为11月2日,即即将到来的星期五。

enter image description here

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

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

在wcs_function.php中查看这段代码

$clients_favorite_things=array_fill(0,20,array("movies"=>array("movie 1","movie 2","movie 3"),"books"=>array("book 1","book 2","book 3") ));
$clients = array_fill(0,20,array());

//Goal is to have a final clients array with only movies data assuming the index of this array is the client id

$m1 = memory_get_usage(); 
foreach($clients as $client_id => $client_data){
    $favorite_things=$clients_favorite_things[$client_id]; //this does copy data
    $clients[$client_id]["favorite_things"]=$favorite_things["movies"];
}
print 'APROX size ' . ( memory_get_usage() - $m1 ) . '<br/>';

$m1 = memory_get_usage(); 
foreach($clients as $client_id => $client_data){
    $favorite_things=&$clients_favorite_things[$client_id]; //assign by reference: this wont copy data
    $clients[$client_id]["favorite_things"]=$favorite_things["movies"];
}
print 'APROX size ' . ( memory_get_usage() - $m1 ) . '<br/>';

print_r($clients); 

将来无法创建订阅。这可能与Subscription插件限制或解决订阅问题的方法非常狭窄有关。

这意味着,即使像我一样通过// 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_datawcs_recurring_cart_start_date来处理购物车商品的属性,您最终也会碰壁。 您要么需要更改Woocommerce Subscription的硬限制,要么要很有创造力。

现在,我将向您展示我涉及的3个动作/过滤器,这很简单。我简化了这些内容,因为它涉及到了您可能不需要的日期验证和格式设置。

您在产品页面上需要一个woocommerce_get_item_data POST字段。

首先将您在产品页面上添加的一些自定义字段保存到购物车项目中。

my_delay_post_attr

现在,让我们在CART上更改开始日期->“订购”步骤:

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;
}

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

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];
}

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

  

我了解您正在尝试手动创建订阅,并且   询问有关开始日期的限制需要在   未来。存在一些限制以支持网关,因为有些网关   订阅时间非常具体且刻板。你可以   可以安全地为该支票创建解决方法,但我们无法进行任何处理   承诺-支票在那里是有原因的。   如果你坚持   删除它,请在开发环境上进行彻底的测试   首先确保您的网关没有问题。

EDIT2:

我可以确认PAYPAL不能使用此技巧。至于Prosspress的回应:

  

我们不确定Stripe和Mercanet如何处理此更改。 (我们的确是   可以肯定地知道,例如,贝宝标准将不会处理此问题   好吧。

     

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

     

如果是后者,而不是尝试更改date_created,则可能   考虑使用免费试用版或创建虚假的免费试用版。这是   用于订阅同步的功能。还有,我们   最近在数据库中分离出date_created和start_date。   虽然此功能尚未完全开发,但可能会给您   与您一起前进的另一点   自定义。