我有一个运行 Woocommerce 订阅插件的 Woocommerce 网站。
该网站只有一个简单的订阅,每个用户只能订阅一个。我希望允许用户根据在结帐过程中添加的下拉框中所做的选择来设置他们自己的开始时间和订阅频率。
我已正确添加结帐字段,它们是简单的选择框:
<select name="frequency" id="choose_frequency">
<option value="week">Weekly</option>
<option value="2week">Fortnightly</option>
<option value="monthly">Monthly</option>
</select>
<select name="start-date" id="sub_start_date">
<option value="22 Apr 2021">Thursday, 22 April 2021</option>
<option value="29 Apr 2021">Thursday, 29 April 2021</option>
<option value="6 May 2021">Thursday, 6 May 2021</option>
</select>
我需要获取值,将其转换为正确的元数据,然后在订阅创建之前更新订阅。
我尝试使用 woocommerce_checkout_update_order_meta
更新元数据:
//Update the order meta with custom fields values
add_action('woocommerce_checkout_update_order_meta', 'customise_checkout_field_update_order_meta');
function customise_checkout_field_update_order_meta($order_id){
$subscriptions_ids = wcs_get_subscriptions_for_order( $order_id );
foreach( $subscriptions_ids as $subscription_id => $subscription_obj ){
update_post_meta($subscription_id, '_schedule_start',date('Y-m-d h:i:s',$_POST['sub_start_date']));
}
}
还尝试了wcs_create_subscription
:
// set start subscription date on checkout page
add_action('wcs_create_subscription', 'cc_wcs_create_subscription');
function cc_wcs_create_subscription($subscription){
$order_id = $subscription->order->id;
$subscription_id = $subscription->get_id();
if($subscription_id && $_POST['sub_start_date']){
update_post_meta($subscription_id, '_schedule_start',date('Y-m-d h:i:s',$_POST['sub_start_date']));
}
}
...我什至尝试用 AJAX 更新频率:
jQuery(document).on('change','select#choose_frequency',function(){
var cur_val = jQuery(this).val();
jQuery.ajax({
type:'post',
url:woocommerce_params.ajax_url,
data:{'action':'cc_update_product_subscription','productid':1086,'cur_val':cur_val},
success:function(result){
jQuery(document.body).trigger("update_checkout");
}
});
});
// update subscription frequency on checkout page
add_action('wp_ajax_cc_update_product_subscription','cc_update_product_subscription');
add_action('wp_ajax_nopriv_cc_update_product_subscription','cc_update_product_subscription');
function cc_update_product_subscription(){
if($_POST['cur_val'] == 'week'){
update_post_meta($_POST['productid'],'_billing_interval','1');
update_post_meta($_POST['productid'],'_billing_period','week');
}
if($_POST['cur_val'] == '2week'){
update_post_meta($_POST['productid'],'_billing_interval','2');
update_post_meta($_POST['productid'],'_billing_period','week');
}
if($_POST['cur_val'] == 'monthly'){
update_post_meta($_POST['productid'],'_billing_interval','1');
update_post_meta($_POST['productid'],'_billing_period','month');
}
die();
}
似乎没有任何效果。结帐仍在处理直到完成,但订阅详细信息不会更新以反映用户选择的内容。我做错了什么?
编辑:
按照 Loic 的建议,我进一步研究了代码。我意识到我添加到结帐中的字段没有正确完成,所以让我们稍微考虑一下这种情况,并尝试将日期硬编码为测试...
所以,我尝试了这个代码:
add_action( 'woocommerce_checkout_create_subscription', 'checkout_custom_fields_update_subscription_meta', 10, 3 );
function checkout_custom_fields_update_subscription_meta( $subscription, $order, $recurring_cart ) {
$date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end'); // Subscription date types
$dates = array(); // Initializing
// Loop through subscription date types
foreach( $date_types as $date_type ) {
$date = $subscription->get_date($date_type); // Get current date from type
// For "start" date type (or "schedule start")
if ( 'start' === $date_type ) {
$dates[$date_type] = '2021-05-20 00:00:00';
}
// For other date types (keep original data)
else {
$dates[$date_type] = $date;
}
}
$subscription->update_dates($dates); // Update dates
$subscription->save(); // Save to database and refresh caches
}
我收到了错误信息: “next_payment 日期必须在开始日期之后。”
所以我尝试了这个:
add_action( 'woocommerce_checkout_create_subscription', 'checkout_custom_fields_update_subscription_meta', 10, 3 );
function checkout_custom_fields_update_subscription_meta( $subscription, $order, $recurring_cart ) {
$date_types = array('start', 'trial_end', 'next_payment', 'last_payment', 'end'); // Subscription date types
$dates = array(); // Initializing
// Loop through subscription date types
foreach( $date_types as $date_type ) {
$date = $subscription->get_date($date_type); // Get current date from type
// For "start" date type (or "schedule start")
if ( 'start' === $date_type ) {
$dates[$date_type] = '2021-05-20 00:00:00';
}
// For "next_payment" date type
elseif ( 'next_payment' === $date_type ) {
$dates[$date_type] = '2021-05-29 00:00:00';
}
// For other date types (keep original data)
else {
$dates[$date_type] = $date;
}
}
$subscription->update_dates($dates); // Update dates
$subscription->save(); // Save to database and refresh caches
}
这处理了结帐,但是开始日期或下一个付款日期都没有保存,它默认回到开始日期是今天(订购时)和付款日期是 2 周之后(默认设置)。
有什么想法吗?