WooCommerce有条件的自定义字段如果车产品类别
OK,我很为难。我已经搜索并阅读了几篇文章,其中包括相关帖子Checking products in cart based on category name woocommerce?,其中我从中得到了大部分代码,而Woocommerce - Add filter to display (or hide) custom checkout field if product ID == #对于产品ID而非类别ID是特定的。WooCommerce有条件的自定义字段如果车产品类别
我想显示如果sdc_custom_checkout_field,且仅当目标类别ID(237在这种情况下)在购物车中。
我尝试注释掉sdc_custom_checkout_field功能和使用如下一个简单的测试,但一直得到“不!”,所以我想查询不正确。
add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field');
function sdc_custom_checkout_field($checkout) {
//Check if Product in Cart
//$product_in_cart = check_product_in_cart();
//Product is in cart so show additional fields
if ($product_in_cart === true) {
echo '<div id="my_custom_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>');
woocommerce_form_field('dupecard_location', array(
'type' => 'text',
'class' => array('dupecard-location form-row-wide'),
'label' => __('Course Location'),
), $checkout->get_value('dupecard_location'));
woocommerce_form_field('dupecard_instructor', array(
'type' => 'text',
'class' => array('dupecard-instructor form-row-wide'),
'label' => __('Instructor Name'),
), $checkout->get_value('dupecard_instructor'));
woocommerce_form_field('dupecard_requestor_name', array(
'type' => 'text',
'class' => array('dupecard-requestor-name form-row-wide'),
'label' => __('Requestor Name'),
), $checkout->get_value('dupecard_requestor_name'));
woocommerce_form_field('dupecard_requestor_email', array(
'type' => 'text',
'class' => array('dupecard-requestor-email form-row-wide'),
'label' => __('Requestor Email'),
), $checkout->get_value('dupecard_requestor_email'));
woocommerce_form_field('dupecard_requestor_phone', array(
'type' => 'text',
'class' => array('dupecard-requestor-phone form-row-wide'),
'label' => __('Requestor Phone'),
), $checkout->get_value('dupecard_requestor_phone'));
echo '</div>';
}
}
function check_product_in_cart() {
//Check to see if user has product in cart
global $woocommerce;
//assign default negative value
$product_in_cart = false;
// start cart items fetch loop
foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
$terms = get_the_terms($_product->id, 'product_cat');
// second level loop search, in case some items have several categories
$cat_ids = array();
foreach ($terms as $term) {
$cat_ids[] = $term->term_id;
}
if(in_array(237, (array)$cat_ids)) {
//category is in cart!
$product_in_cart = true;
}
}
return $product_in_cart;
}
这里的测试片段:
if ($item_in_cart === true) {echo 'YES';}
else {echo 'Nope!';}
我也取代
$ item_in_cart
与
$ product_in_cart
但它没有区别。
**********编辑响应@PRAFULLA **********
@Prafulla - 感谢您的输入。我很感激。我修改了我的代码片段,并入了您的代码,但无法使其工作。我是一个PHP新手,所以,毫不奇怪。你有额外的建议吗?
add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field');
function sdc_custom_checkout_field($checkout) {
//Check if Product in Cart
$your_product_category = is_category_in_cart();
//Product is in cart so show additional fields
if ($your_product_category === true) {
echo '<div id="my_custom_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>');
woocommerce_form_field('dupecard_location', array(
'type' => 'text',
'class' => array('dupecard-location form-row-wide'),
'label' => __('Course Location'),
), $checkout->get_value('dupecard_location'));
woocommerce_form_field('dupecard_instructor', array(
'type' => 'text',
'class' => array('dupecard-instructor form-row-wide'),
'label' => __('Instructor Name'),
), $checkout->get_value('dupecard_instructor'));
woocommerce_form_field('dupecard_requestor_name', array(
'type' => 'text',
'class' => array('dupecard-requestor-name form-row-wide'),
'label' => __('Requestor Name'),
), $checkout->get_value('dupecard_requestor_name'));
woocommerce_form_field('dupecard_requestor_email', array(
'type' => 'text',
'class' => array('dupecard-requestor-email form-row-wide'),
'label' => __('Requestor Email'),
), $checkout->get_value('dupecard_requestor_email'));
woocommerce_form_field('dupecard_requestor_phone', array(
'type' => 'text',
'class' => array('dupecard-requestor-phone form-row-wide'),
'label' => __('Requestor Phone'),
), $checkout->get_value('dupecard_requestor_phone'));
echo '</div>';
}
}
function is_category_in_cart($your_product_category = 237){
global $woocommerce;
$products_in_cart = $woocommerce->cart->get_cart();
$product_types_in_cart = array_column($products_in_cart, 'data');
//if ( $product_types_in_cart[0]->product_type == 'subscription') { this is what I have tested
if ( $product_types_in_cart[0]->product_cat == $your_product_category) {
return true;
}
return $your_product_category;
}
经过大量的工作,研究,以及对其他网站的一些支付帮助援助,这是工作的结果:
// Add the field to the checkout
add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field');
function sdc_custom_checkout_field($checkout) {
if(check_product_category()){
echo '<div id="sdc_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>');
woocommerce_form_field('dupecard_location', array(
'type' => 'text',
'required' => true,
'class' => array('dupecard-location form-row-wide'),
'label' => __('Course Location'),
), $checkout->get_value('dupecard_location'));
woocommerce_form_field('dupecard_instructor', array(
'type' => 'text',
'required' => true,
'class' => array('dupecard-instructor form-row-wide'),
'label' => __('Instructor Name'),
), $checkout->get_value('dupecard_instructor'));
woocommerce_form_field('dupecard_requestor_name', array(
'type' => 'text',
'required' => true,
'class' => array('dupecard-requestor-name form-row-wide'),
'label' => __('Requestor Name'),
), $checkout->get_value('dupecard_requestor_name'));
woocommerce_form_field('dupecard_requestor_email', array(
'type' => 'text',
'required' => true,
'class' => array('dupecard-requestor-email form-row-wide'),
'label' => __('Requestor Email'),
), $checkout->get_value('dupecard_requestor_email'));
woocommerce_form_field('dupecard_requestor_phone', array(
'type' => 'text',
'required' => true,
'class' => array('dupecard-requestor-phone form-row-wide'),
'label' => __('Requestor Phone'),
), $checkout->get_value('dupecard_requestor_phone'));
echo '</div>';
}
}
function check_product_category(){
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product_id = apply_filters('woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key);
if(is_category_in_cart($product_id)){
return true;
}
}
return false;
}
function is_category_in_cart($product_id){
return has_term(237,'product_cat', get_post($product_id));
}
/*Save to DB as post meta*/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta($order_id) {
if (! empty($_POST['dupecard_location'])) {
update_post_meta($order_id, 'dupecard_location', sanitize_text_field($_POST['dupecard_location']));
}
if (! empty($_POST['dupecard_instructor'])) {
update_post_meta($order_id, 'dupecard_instructor', sanitize_text_field($_POST['dupecard_instructor']));
}
if (! empty($_POST['dupecard_requestor_name'])) {
update_post_meta($order_id, 'dupecard_requestor_name', sanitize_text_field($_POST['dupecard_requestor_name']));
}
if (! empty($_POST['dupecard_requestor_email'])) {
update_post_meta($order_id, 'dupecard_requestor_email', sanitize_text_field($_POST['dupecard_requestor_email']));
}
if (! empty($_POST['dupecard_requestor_phone'])) {
update_post_meta($order_id, 'dupecard_requestor_phone', sanitize_text_field($_POST['dupecard_requestor_phone']));
}
}
这是我如何得到我的情况下完成任务,请尝试一下,记下你需要给这个代码的输入,因为它不是直接使用写的。
function is_category_in_cart($your_product_category = null){
global $woocommerce;
$products_in_cart = $woocommerce->cart->get_cart();
$product_types_in_cart = array_column($products_in_cart, 'data');
//if ( $product_types_in_cart[0]->product_type == 'subscription') { this is what I have tested
if ( $product_types_in_cart[0]->product_cat == $your_product_category) {
return true;
}
}
比Prafulla。不知道你是否收到我的编辑通知,所以我在这里发布。 – KillerDesigner
你能否请'var_dump($ product_types_in_cart [0])'在你的情况下? –
假设我将该行追加到我的functions.php文件的末尾,它输出/返回NULL。 – KillerDesigner
非常感谢你的男人,你是一个拯救生命的人:) – Anil