Php Woocommerce中基于产品类别的条件自定义签出字段
我正在使用woocommerce作为一个非营利组织的网站,该网站出售课程门票和活动门票。当有人报名参加课程时,需要列出他们的紧急联系信息,并同意免除责任。当他们购买活动门票时,非营利组织不需要紧急联系信息或责任免除。所以他们希望这些字段仅在该人员带着课程的票证结账的情况下显示在结帐单上。有道理吗 几个月前,当他们首次将类添加到网站时,我发现了如何添加自定义字段和自定义责任版本。我在woocommerce中创建了一个“类”产品类别,并创建了一个函数来测试购物车中属于该类别的任何产品,因此我可以有条件地显示这些字段 所有这些函数都在我的functions.php文件中,我现在正在运行条件语句来检查每个函数中的“class”类别。我需要帮助学习如何检查一次“类”类别,然后运行显示字段、验证字段、将数据添加到数据库和生成新订单电子邮件的功能。有道理吗 以下是我目前拥有的:Php Woocommerce中基于产品类别的条件自定义签出字段,php,wordpress,woocommerce,checkout,custom-fields,Php,Wordpress,Woocommerce,Checkout,Custom Fields,我正在使用woocommerce作为一个非营利组织的网站,该网站出售课程门票和活动门票。当有人报名参加课程时,需要列出他们的紧急联系信息,并同意免除责任。当他们购买活动门票时,非营利组织不需要紧急联系信息或责任免除。所以他们希望这些字段仅在该人员带着课程的票证结账的情况下显示在结帐单上。有道理吗 几个月前,当他们首次将类添加到网站时,我发现了如何添加自定义字段和自定义责任版本。我在woocommerce中创建了一个“类”产品类别,并创建了一个函数来测试购物车中属于该类别的任何产品,因此我可以有条
// Add fields for Emergency Contact & Medical Information to the checkout page
add_action('woocommerce_after_order_notes', 'customise_checkout_field');
function customise_checkout_field($checkout)
{
// Check to see if there is a class in the cart
// function is at the end
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
echo '<div id="customise_checkout_field"><h3>' . __('Emergency Contact & Medical Information') . '</h3>';
woocommerce_form_field('emergency_contact', array(
'type' => 'text',
'class' => array(
'emergency-contact form-row-wide'
) ,
'label' => __('Emergency Contact') ,
'placeholder' => __('Please enter first & last name') ,
'required' => true,
) , $checkout->get_value('emergency_contact'));
woocommerce_form_field('emergency_contact_relationship', array(
'type' => 'text',
'class' => array(
'emergency-contact-relationship form-row-wide'
) ,
'label' => __('What is your relationship with this person?') ,
'placeholder' => __('Example: Mother') ,
'required' => true,
) , $checkout->get_value('emergency_contact_relationship'));
woocommerce_form_field('emergency_contact_phone', array(
'type' => 'text',
'class' => array(
'emergency-contact-phone form-row-wide'
) ,
'label' => __('What is their phone number?') ,
'placeholder' => __('(555) 555-5555') ,
'required' => true,
) , $checkout->get_value('emergency_contact_phone'));
woocommerce_form_field('medical_medicine', array(
'type' => 'textarea',
'class' => array(
'medical-medicine form-row-wide'
) ,
'label' => __('Do you have any medical conditions and are you taking any medications we need to be aware of?') ,
'placeholder' => __('If not please write in "none"') ,
'required' => true,
) , $checkout->get_value('medical_medicine'));
echo '</div>';
}
}
// Process emergency contact fields
add_action('woocommerce_checkout_process', 'custom_checkout_fields_process');
function custom_checkout_fields_process() {
// Check to see if there is a class in the cart
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
// if the field is set, if not then show an error message.
if (!$_POST['emergency_contact']) wc_add_notice(__('Please list an emergency contact.') , 'error');
if (!$_POST['emergency_contact_relationship']) wc_add_notice(__('Please indicate your relationship with your emergency contact.') , 'error');
if (!$_POST['emergency_contact_phone']) wc_add_notice(__('Please list a phone number for your emergency contact.') , 'error');
if (!$_POST['medical_medicine']) wc_add_notice(__('Please list any medications or write in "none".') , 'error');
}
}
// Add emergency contact information to the database
add_action('woocommerce_checkout_update_order_meta', 'custom_checkout_fields_update_order_meta');
function custom_checkout_fields_update_order_meta($order_id) {
// Check to see if there is a class in the cart
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
if (!empty($_POST['emergency_contact'])) {
update_post_meta($order_id, 'emergency_contact', sanitize_text_field($_POST['emergency_contact']));
}
if (!empty($_POST['emergency_contact_relationship'])) {
update_post_meta($order_id, 'emergency_contact_relationship', sanitize_text_field($_POST['emergency_contact_relationship']));
}
if (!empty($_POST['emergency_contact_phone'])) {
update_post_meta($order_id, 'emergency_contact_phone', sanitize_text_field($_POST['emergency_contact_phone']));
}
if (!empty($_POST['medical_medicine'])) {
update_post_meta($order_id, 'medical_medicine', sanitize_text_field($_POST['medical_medicine']));
}
}
}
// Add the emergency contact fields to order email
add_filter( 'woocommerce_email_order_meta_keys', 'my_custom_checkout_field_order_meta_keys' );
function my_custom_checkout_field_order_meta_keys( $keys ) {
// Check to see if there is a class in the cart
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
echo '<h2>Emergency Contact & Medical Information:</h2>';
$keys['Emergency Contact'] = 'emergency_contact';
$keys['Emergency Contact Relationship'] = 'emergency_contact_relationship';
$keys['Emergency Contact Phone'] = 'emergency_contact_phone';
$keys['Medical Conditions & Medications'] = 'medical_medicine';
return $keys;
} // end class in cart condition
}
/*-----------------------------------------------------------------------------------------------------------------------------------------------*/
// Add custom checkboxes to woocommerce checkout page for Photo Release, Mailing List & Release of Liability
// add_action( 'woocommerce_after_order_notes', 'custom_checkout_fields' );
add_action( 'woocommerce_review_order_before_submit', 'custom_checkout_fields' );
function custom_checkout_fields() {
echo '<div id="custom_checkout_fields">
<h3>Mailing Lists</h3>
<p>Mailing List boilerplate';
woocommerce_form_field( 'mailing_consent', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('Please add me to Nonprofit\'s electronic and paper mailing lists.'),
'required' => false,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), WC()->checkout->get_value( 'mailing_consent' ) );
// Check to see if there is a class in the cart
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
echo '<h3>Photo Release</h3>
<p>Photo Release Boilerplate</p>';
woocommerce_form_field( 'photo_consent', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('I agree to the Photo Release as outlined above.'),
'required' => false,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), WC()->checkout->get_value( 'photo_consent' ) );
echo '<h3>Release of Liability</h3>
<p>Release of Liability Boilerplate</p>';
woocommerce_form_field( 'liability_release', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('I agree to the Photo Release as outlined above.'),
'required' => true,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), WC()->checkout->get_value( 'liability_release' ) );
} // end class in cart condition
echo '</div>';
}
// Show notice if customer doesn't check the Release of Liability checkbox
add_action( 'woocommerce_checkout_process', 'liability_release_not_given' );
function liability_release_not_given() {
// Check to see if there is a class in the cart
$class_in_cart = is_conditional_product_in_cart( 'class' );
// There is a class in the cart so show additional fields
if ( $class_in_cart === true ) {
if ( ! (int) isset( $_POST['liability_release'] ) ) {
wc_add_notice( __( 'You must agree to the Release of Liability to register for this class. Please contact us with any questions.' ), 'error' );
}
} // end class in cart condition
}
// Save the custom checkout field in the order meta, when checkbox has been checked
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta', 10, 1 );
function custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['mailing_consent'] ) )
update_post_meta( $order_id, 'mailing_consent', $_POST['mailing_consent'] );
if ( ! empty( $_POST['photo_consent'] ) )
update_post_meta( $order_id, 'photo_consent', $_POST['photo_consent'] );
if ( ! empty( $_POST['liability_release'] ) )
update_post_meta( $order_id, 'liability_release', $_POST['liability_release'] );
}
/*-----------------------------------------------------------------------------------------------------------------------------------------------*/
// Display custom field results on the order edit page (backend)
// for various liability fields
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_custom_field_on_order_edit_pages', 10, 1 );
function display_custom_field_on_order_edit_pages( $order ){
$mailing_consent = get_post_meta( $order->get_id(), 'mailing_consent', true );
if( $mailing_consent == 1 )
echo '<p>' . $order->billing_first_name . ' ' . $order->billing_last_name . ' agreed to the be added to Nonprofit\'s mailing lists.</p>';
$photo_consent = get_post_meta( $order->get_id(), 'photo_consent', true );
if( $photo_consent == 1 )
echo '<p>' . $order->billing_first_name . ' ' . $order->billing_last_name . ' agreed to the Photo Release.</p>';
$liability_release = get_post_meta( $order->get_id(), 'liability_release', true );
if( $liability_release == 1 )
echo '<p>' . $order->billing_first_name . ' ' . $order->billing_last_name . ' agreed to the Release of Liability.</p>';
}
/**
* Check if Class is In cart
*
* https://wordimpress.com/create-conditional-checkout-fields-woocommerce/
* https://businessbloomer.com/woocommerce-check-product-category-cart/
*
* @param $product_id
*
* @return bool
*/
function is_conditional_product_in_cart( $category_name ) {
//Check to see if user has a class in their cart
global $woocommerce;
//flag no class in cart
$class_in_cart = false;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
// if ( $_product->cat === $category_id ) {
// //class is in cart!
//$class_in_cart = true;
if (has_term ( $category_name, 'product_cat', $_product->get_id() ) ) {
//class is in cart!
$class_in_cart = true;
}
}
return $class_in_cart;
}
对每个函数重复。我知道这是没有效率的,但我不知道如何修复它。我想做的是:
感谢您提供的任何想法和帮助 首先,您使用的条件函数代码非常旧、过时,并且当购物车项目是产品变体(对于可变产品也是如此)时,将不起作用。以下是紧凑且有效的条件函数…
它可以用于任何产品类别术语ID、slug、name或一组值:
function is_product_cat_in_cart( $categories ) {
foreach ( WC()->cart->get_cart() as $cart_item ) {
if (has_term ( $categories, 'product_cat', $cart_item['product_id'] ) )
return true;
}
return false;
}
现在,代码的其余部分有很多错误或小错误
它还使用过时或不推荐使用的挂钩,如:
被一个非常合适的钩子取代woocommerce\u checkout\u update\u order\u meta
由于时间太长而被弃用woocommerce\u email\u order\u meta\u keys
//将紧急联系人和医疗信息字段添加到签出页面
添加操作(“订单注释后的woocommerce”和“定制结账字段”,20,1);
函数自定义检查字段($checkout){
$domain='woocommerce';
//购物车中有一个类,因此显示其他字段
如果(产品类别是否在购物车(“类”):
回声'
“.。”(“紧急联系人和医疗信息”,$domain)。”;
woocommerce\u表单\u字段('emergency\u contact',数组(
'类型'=>'文本',
'class'=>数组('emergency contact form row-wide'),
'label'=>\('Emergency Contact',$domain),
'占位符'=>\('请输入名字和姓氏',$domain),
“必需”=>true,
),$checkout->get_value('emergency_contact');
woocommerce\u表单\u字段('emergency\u contact\u relationship',数组(
'类型'=>'文本',
'class'=>array('emergency contact relationship form row-wide'),
“标签”=>“(“您与此人的关系如何?”,$domain),
'占位符'=>\('示例:母亲',$domain),
“必需”=>true,
),$checkout->get_value('emergency_contact_relationship');
woocommerce\u表单\u字段('emergency\u contact\u phone',数组(
'类型'=>'文本',
'class'=>数组('emergency contact phone form row wide'),
“标签”=>“(“他们的电话号码是多少?”,$domain),
'占位符'=>\('(555)555-5555',$domain),
“必需”=>true,
),$checkout->get_value('emergency_contact_phone');
woocommerce\u表单\u字段('medical\u medicine',数组(
'type'=>'textarea',
'class'=>数组('medical medicine form row-wide'),
“label”=>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
“占位符”=>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
“必需”=>true,
),$checkout->get_value('medical_medicine');
回声';
endif;
}
//将自定义复选框添加到woocommerce签出页面,用于照片发布、邮件列表和责任发布
添加操作(“提交前审查订单”,“自定义签出字段”);
函数自定义检查字段(){
$checkout=WC()->checkout;
$domain='woocommerce';
回声'
“.\(“邮件列表”,$domain)。”
“.”(“邮件列表样板文件,$domain)。”;
woocommerce\u表单\u字段('mailing\u approvement',数组(
'键入'=>'复选框',
'class'=>array('input-checkbox'),
“label'=>”(请将我添加到非营利组织的电子和纸质邮件列表中,$domain),
“必需”=>false,
“清除”=>正确,
“default”=>1//这将预先选中复选框
),$checkout->get_value('mailing_approvement');
//购物车中有一个类,因此显示其他字段
如果(是产品还是第一类产品
function is_product_cat_in_cart( $categories ) {
foreach ( WC()->cart->get_cart() as $cart_item ) {
if (has_term ( $categories, 'product_cat', $cart_item['product_id'] ) )
return true;
}
return false;
}
// Add fields for Emergency Contact & Medical Information to the checkout page
add_action('woocommerce_after_order_notes', 'customise_checkout_field', 20, 1 );
function customise_checkout_field( $checkout ){
$domain = 'woocommerce';
// There is a class in the cart so show additional fields
if ( is_product_cat_in_cart( 'class' ) ):
echo '<div id="customise_checkout_field">
<h3>' . __( 'Emergency Contact & Medical Information', $domain ) . '</h3>';
woocommerce_form_field( 'emergency_contact', array(
'type' => 'text',
'class' => array( 'emergency-contact form-row-wide' ),
'label' => __( 'Emergency Contact', $domain ) ,
'placeholder' => __( 'Please enter first & last name', $domain ),
'required' => true,
), $checkout->get_value('emergency_contact') );
woocommerce_form_field( 'emergency_contact_relationship', array(
'type' => 'text',
'class' => array( 'emergency-contact-relationship form-row-wide' ),
'label' => __( 'What is your relationship with this person?', $domain ),
'placeholder' => __( 'Example: Mother', $domain ) ,
'required' => true,
), $checkout->get_value('emergency_contact_relationship') );
woocommerce_form_field( 'emergency_contact_phone', array(
'type' => 'text',
'class' => array( 'emergency-contact-phone form-row-wide' ),
'label' => __( 'What is their phone number?', $domain ),
'placeholder' => __( '(555) 555-5555', $domain ),
'required' => true,
), $checkout->get_value('emergency_contact_phone') );
woocommerce_form_field( 'medical_medicine', array(
'type' => 'textarea',
'class' => array( 'medical-medicine form-row-wide' ) ,
'label' => __( 'Do you have any medical conditions and are you taking any medications we need to be aware of?', $domain ),
'placeholder' => __( 'If not please write in "none"', $domain ),
'required' => true,
) , $checkout->get_value('medical_medicine') );
echo '</div>';
endif;
}
// Add custom checkboxes to woocommerce checkout page for Photo Release, Mailing List & Release of Liability
add_action( 'woocommerce_review_order_before_submit', 'custom_checkout_fields' );
function custom_checkout_fields() {
$checkout = WC()->checkout;
$domain = 'woocommerce';
echo '<div id="custom_checkout_fields">
<h3>'.__( 'Mailing Lists', $domain ).'</h3>
<p>'.__( 'Mailing List boilerplate', $domain ).'</p>';
woocommerce_form_field( 'mailing_consent', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __( 'Please add me to Nonprofit\'s electronic and paper mailing lists.', $domain ),
'required' => false,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), $checkout->get_value( 'mailing_consent' ) );
// There is a class in the cart so show additional fields
if ( is_product_cat_in_cart( 'class' ) ):
echo '<h3>'.__( 'Photo Release', $domain ).'</h3>
<p>'.__( 'Photo Release Boilerplate', $domain ).'</p>';
woocommerce_form_field( 'photo_consent', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __( 'I agree to the Photo Release as outlined above.', $domain ),
'required' => false,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), $checkout->get_value( 'photo_consent' ) );
echo '<h3>'.__( 'Release of Liability', $domain ).'</h3>
<p>'.__( 'Release of Liability Boilerplate', $domain ).'</p>';
woocommerce_form_field( 'liability_release', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __( 'I agree to the Photo Release as outlined above.', $domain ),
'required' => true,
'clear' => true,
'default' => 1 //This will pre-select the checkbox
), $checkout->get_value( 'liability_release' ) );
endif;
echo '</div>';
}
// Custom checkout fields validation
add_action('woocommerce_checkout_process', 'custom_checkout_fields_process');
function custom_checkout_fields_process() {
$domain = 'woocommerce';
if ( isset($_POST['emergency_contact']) && empty($_POST['emergency_contact']) )
wc_add_notice( __( 'Please list an emergency contact.', $domain ) , 'error' );
if ( isset($_POST['emergency_contact_relationship']) && empty($_POST['emergency_contact']) )
wc_add_notice( __( 'Please indicate your relationship with your emergency contact.', $domain ), 'error' );
if ( isset($_POST['emergency_contact_phone']) && empty($_POST['emergency_contact']) )
wc_add_notice( __( 'Please list a phone number for your emergency contact.', $domain ), 'error' );
if ( isset($_POST['medical_medicine']) && empty($_POST['emergency_contact']) )
wc_add_notice( __( 'Please list any medications or write in "none".', $domain ), 'error' );
// Other checkout fields
if ( ! isset( $_POST['liability_release'] ) && ! $_POST['liability_release'] && isset($_POST['photo_consent']) )
wc_add_notice( __( 'You must agree to the Release of Liability to register for this class. Please contact us with any questions.', $domain ), 'error' );
}
// Save custom checkout fields in the order meta data
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_fields_in_order_meta_data', 20, 2 );
function custom_checkout_fields_in_order_meta_data( $order, $data ) {
if ( isset($_POST['emergency_contact']) && ! empty($_POST['emergency_contact']) )
$order->update_meta_data( 'emergency_contact', sanitize_text_field($_POST['emergency_contact']) );
if ( isset($_POST['emergency_contact_relationship']) && ! empty($_POST['emergency_contact_relationship']) )
$order->update_meta_data( 'emergency_contact_relationship', sanitize_text_field($_POST['emergency_contact_relationship']) );
if ( isset($_POST['emergency_contact_phone']) && ! empty($_POST['emergency_contact_phone']) )
$order->update_meta_data( 'emergency_contact_phone', sanitize_text_field($_POST['emergency_contact_phone']) );
if ( isset($_POST['medical_medicine']) && ! empty($_POST['medical_medicine']) )
$order->update_meta_data( 'medical_medicine', sanitize_text_field($_POST['medical_medicine']) );
if ( isset($_POST['mailing_consent']) && ! empty($_POST['mailing_consent']) )
$order->update_meta_data( 'mailing_consent', '1' );
if ( isset( $_POST['photo_consent']) && ! empty($_POST['photo_consent']) )
$order->update_meta_data( 'photo_consent', '1' );
if ( isset( $_POST['liability_release']) && ! empty($_POST['liability_release']) )
$order->update_meta_data( 'liability_release', '1' );
}
// Add the emergency contact fields to email notifications
add_filter( 'woocommerce_email_order_meta_fields', 'custom_checkout_field_email_order_meta', 20, 3 );
function custom_checkout_field_email_order_meta( $fields, $sent_to_admin, $order ) {
$domain = 'woocommerce';
if( ! $order->get_meta( 'emergency_contact' ) )
return $fields; // Exit if not set in the order
echo '<h2>'.__( 'Emergency Contact & Medical Information', $domain ).'</h2>';
$fields[] = array( 'label' => __( 'Emergency contact', $domain ),
'value' => $order->get_meta( 'emergency_contact' ) );
$fields[] = array( 'label' => __( 'Emergency Contact Relationship', $domain ),
'value' => $order->get_meta( 'emergency_contact_relationship' ) );
$fields[] = array( 'label' => __( 'Emergency Contact Phone', $domain ),
'value' => $order->get_meta( 'emergency_contact_phone' ) );
$fields[] = array( 'label' => __( 'Medical Conditions & Medications', $domain ),
'value' => $order->get_meta( 'medical_medicine' ) );
return $fields;
}
// Display some custom checkout fields in Order edit pages
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_custom_field_on_order_edit_pages', 20, 1 );
function display_custom_field_on_order_edit_pages( $order ){
$domain = 'woocommerce';
$billing_name = $order->get_billing_first_name().' '.$order->get_billing_last_name();
if( $order->get_meta('mailing_consent') )
echo '<p>' . $billing_name . __( ' agreed to the be added to Nonprofit\'s mailing lists.', $domain ).'</p>';
if( $order->get_meta('photo_consent') )
echo '<p>' . $billing_name . __( ' agreed to the Photo Release.', $domain ).'</p>';
if( $order->get_meta('liability_release') )
echo '<p>' . $billing_name . __( ' agreed to the Release of Liability.', $domain ).'</p>';
}