我的一个使用WooCommerce订阅插件的WooCommerce网站出现问题。
问题是一种产品仅在特定日期每2周发货一次。
下一个发货日期是11月9日。
我需要弄清楚如何将其添加为产品的默认开始日期。
我尝试使用WooCommerce订阅插件的WC_Subscriptions_Synchroniser类中描述的功能。
我启用了“同步续订”功能。
并且还将“同步续订”日期更改为每周的星期五,因为11月9日是星期五。
但是,这将首次续订日期定为11月2日,即即将到来的星期五。
我试图弄清楚如何将开始日期推迟到11月9日,而不是现在显示的11月2日。
任何建议表示赞赏。
答案 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_data
,wcs_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。 虽然此功能尚未完全开发,但可能会给您 与您一起前进的另一点 自定义。