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 日。
任何建议表示赞赏。
同样的问题在这里。我设法准备了未来的开始日期,但对此有一个硬编码限制。
查看 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_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;
}
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。虽然此功能尚未完全开发,但在您继续进行自定义时,它可能会为您提供另一个工作点。
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |