wordpress - 在结帐时编辑 Woocommerce 订阅开始日期 + 频率
问题描述
我有一个运行 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
}
我收到错误消息:“下一个付款日期必须在开始日期之后。”
所以我尝试了这个:
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 周后(默认设置)。
有任何想法吗?
解决方案
推荐阅读
- html - 如何自定义单页加载样式 css GIF 样式?
- mysql - 在 docker compose 中更改 MYSQL_DATABASE 等
- python - Python 3.8 字典值按字母顺序排序
- python - Python动态创建不可变对象
- maven - Maven 包含 zip 依赖项
- postgresql - How to return a table and its total count in postgres' function
- reactjs - 我应该刷新浏览器以使用 Routes | 渲染我的组件 反应JS
- javascript - 检查图表是否在 apexcharts 中呈现
- python - 在 Python 中删除方括号
- python - Python Selenium Webdriver:在 for 循环中重复相同的信息