php - 根据自定义“woocommerce_variation_option”将复选框添加到 WooCommerce 结帐页面
问题描述
我使用以下代码为我的产品添加了一个额外的变体选项:
add_action('woocommerce_variation_options', 'he_add_to_variation_option', 10, 3);
function he_add_to_variation_option( $loop, $variation_data, $variation){
$is_trial = (get_post_meta($variation->ID, '_trialversion', true)) ? ' checked' : '';
?>
<label class="tips" data-tip="<?php esc_attr_e( 'Enable this option to make as a trial version', 'woocommerce' ); ?>">
<?php esc_html_e( 'Trial Version?', 'woocommerce' ); ?>
<input type="checkbox" class="checkbox variable_is_trial_version" name="_trialversion[<?php echo esc_attr( $variation->ID ); ?>]"<?php echo $is_trial;?>/>
</label>
<?php
}
add_action( 'woocommerce_save_product_variation', 'save_trialversion_option_fields' );
function save_trialversion_option_fields( $post_id ) {
if ( isset( $_POST['_trialversion'] ) ){
foreach ( $_POST['_trialversion'] as $productid=>$checked ){
update_post_meta( $productid, '_trialversion', 'yes' );
}
}
}
这很好用,它显示在变体中,并正确保存在数据库中。
到目前为止,一切都很好。
现在,如果产品被标记为“试用版”,我想在结帐时添加一个额外的复选框。我也在使用“Germanized”插件,它具有自定义复选框的选项,但我无法让它识别我使用上述代码所做的更改。
我将如何为我的试用版变体完成自定义复选框?不管有没有德国化,在这一点上我只想让它工作。也许有一个免费的插件,但如果我可以通过添加一些代码来做到这一点,那可能会更容易。
该复选框必须是完成购买试用版的必填项。
希望有人知道如何做到这一点。期待您的回复!
解决方案
当产品变体启用“试用版”时,结帐页面将添加一个新复选框
woocommerce_save_product_variation
不应包含 foreach 循环,函数的第二个参数已经包含一个计数器$i
通常也应该解决复选框的问题
function add_to_variation_option( $loop, $variation_data, $variation){
$is_trial = get_post_meta( $variation->ID, '_trialversion', true);
if ( $is_trial == 'yes' ) {
$is_trial = 'checked';
} else {
$is_trial = '';
}
?>
<label class="tips" data-tip="<?php esc_attr_e( 'Enable this option to make as a trial version', 'woocommerce' ); ?>">
<?php esc_html_e( 'Trial Version?', 'woocommerce' ); ?>
<input type="checkbox" class="checkbox variable_is_trial_version" name="_trialversion[<?php echo esc_attr( $loop ); ?>]"<?php echo $is_trial;?>/>
</label>
<?php
}
add_action('woocommerce_variation_options', 'add_to_variation_option', 10, 3);
function save_trialversion_option_fields( $variation_id, $i ) {
if ( !empty($_POST['_trialversion']) && !empty( $_POST['_trialversion'][$i] ) ) {
update_post_meta( $variation_id, '_trialversion', 'yes' );
} else {
update_post_meta( $variation_id, '_trialversion', 'no' );
}
}
add_action( 'woocommerce_save_product_variation', 'save_trialversion_option_fields', 10, 2 );
/**
* Add checkbox field to the checkout
**/
function my_custom_checkout_field( $checkout ) {
// Get $product object from Cart object
$cart = WC()->cart->get_cart();
foreach( $cart as $cart_item ) {
// The WC_Product object
$product = wc_get_product( $cart_item['product_id'] );
// Checks the product type, 'variable', returns boolean
if ( $product->is_type( 'variable' ) ) {
// Get variation id
$variation_id = $cart_item['data']->get_id();
// Get post meta
$trialversion = get_post_meta( $variation_id, '_trialversion', true);
// Found
if ( $trialversion == 'yes' ) {
$trialversion = 'found';
// Break loop
break;
}
}
}
// Found
if ( isset($trialversion) && $trialversion == 'found' ) {
echo '<div id="my-new-field">';
woocommerce_form_field( 'my_checkbox', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('I agree'),
'required' => true,
), $checkout->get_value( 'my_checkbox' ));
echo '</div>';
}
}
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field', 10, 1 );
推荐阅读
- html - 在 Bootsrap 4 的文件上传选项中显示文件名
- c# - 将字符串反序列化为双精度
- shared-libraries - 未使用 LD_LIBRARY_PATH
- javascript - Javascript 异步承诺作为宏任务
- ios - App Store 拒绝 - 支持 URL 元数据
- r - R中的茎叶图错误'|' 位置
- windows-installer - msi 安装程序客户信息表单验证许可证
- vim - 我可以使用 ale 或 syntastic 作为 pre-write 钩子而不是 post-write 吗?
- iis - 如何使用 https 加密或隐藏 Chrome 开发者工具或 IE 中的响应数据?
- service-worker - 在 PWA 中,有没有办法检查等待的服务人员升级?