【问题标题】:Add product custom fields to cart and display them everywhere in WooCommerce将产品自定义字段添加到购物车并在 WooCommerce 中随处显示
【发布时间】:2021-07-24 00:48:38
【问题描述】:

我设置了一个带有 2 个复选框的 ACF,这些复选框显示在产品管理员中:

在产品前端,只有来自后端的选定值是可选的:

下面的代码是我的功能:

// Display on product page
add_action( 'woocommerce_before_add_to_cart_button', 'display_acf_single_product_pages', 1 );
function display_acf_single_product_pages() {
    global $product;

    $colors  = get_field( 'colors',  $product->get_id() );
    $sizes = get_field( 'sizes', $product->get_id() );

    
    
    if( $colors ): ?>
<div class="vorcartbutton">
    <div class="vorcartbuttonlable">
<label for="cars">Farbe wählen:</label>
<select name="farbe" id="farbe">
    <?php foreach( $colors as $color ): ?>
        <option><span class="color"><?php echo $color['label']; ?></span></option>
    <?php endforeach; ?>
</select>
    </div>
<?php endif; ?>
<br>
<?php

if( $sizes ): ?>
    <div class="vorcartbuttonlable">
<label for="cars">Größe wählen:</label>
<select name="groesse" id="groesse">
    <?php foreach( $sizes as $sizes ): ?>
        <option><span class="groesse"><?php echo $sizes['label']; ?></span></option>
    <?php endforeach; ?>
</select>
    </div>
</div>
<?php endif; ?>
<br>
<?php

   
}

// Display on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
    $colors  = get_field( 'colors', $cart_item['product_id'] );
    $sizes = get_field( 'sizes', $cart_item['product_id'] );
    
    
 if ( ! empty($colors) ) {
        $custom_items[] = array( "name" => __("Farbe", "woocommerce"),  "value" => $colors  );
    }

    if ( ! empty($sizes) ) {
        $custom_items[] = array( "name" => __("Größe", "woocommerce"), "value" => $sizes );
    }
   
    return $custom_items;
}

// Display on orders and email notifications (save as custom order item meta data)
add_action( 'woocommerce_checkout_create_order_line_item', 'display_acf_on_orders_and_emails', 10, 4 );
function display_acf_on_orders_and_emails( $item, $cart_item_key, $values, $order ) {
    $colors  = get_field( 'colors', $values['product_id'] );
    $sizes = get_field( 'sizes', $values['product_id'] );

    if ( ! empty($colors) ) {
        $item->add_meta_data( __("size", "woocommerce"), $colors );
    }

    if ( ! empty($sizes) ) {
        $item->add_meta_data( __("color", "woocommerce"), $sizes );
    }
}

在购物车中,值仅显示数组:

有人可以将我推向正确的方向,以在购物车、结帐、邮件和订单中获取正确的值吗?

原文取自这里Display ACF product custom fields everywhere in WooCommerce 3+

【问题讨论】:

  • 仅供参考:for="cars"id="farbe"id="groesse" 没有任何关系。这是一个糟糕的复制面食的例子。 Loic 在他的回答中已经解决了这个错误。

标签: php woocommerce product advanced-custom-fields custom-fields


【解决方案1】:

您的代码中存在错误和一些缺失的内容。而是使用以下重新访问的代码:

// Display on product page
add_action( 'woocommerce_before_add_to_cart_button', 'display_acf_single_product_pages', 1 );
function display_acf_single_product_pages() {
    global $product;

    $colors = get_field( 'colors',  $product->get_id() );
    if ( ! empty($colors) ) {
        echo '<div class="vorcartbutton">
        <div class="vorcartbuttonlable">
        <label for="farbe">'. __("Farbe wählen") .':</label>
        <select name="farbe" id="farbe">';

        foreach ( $colors as $color ) {
            echo '<option value="'. $color['label'] .'"><span class="color">'. $color['label'] .'</span></option>';
        }
        echo '</select>
        </div><br>';
    }

    $sizes = get_field( 'sizes', $product->get_id() );
    if ( ! empty($sizes) ) {
        echo '<div class="vorcartbutton">
        <div class="vorcartbuttonlable">
        <label for="groesse">'. __("Größe wählen") .':</label>
        <select name="groesse" id="groesse">';

        foreach ( $sizes as $size ) {
            echo '<option value="'. $size['label'] .'"><span class="color">'. $size['label'] .'</span></option>';
        }
        echo '</select>
        </div><br>
        </div>';
    }
}

// Add as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'save_acf_as_cart_item_data', 10, 2 );
function save_acf_as_cart_item_data( $cart_item_data, $cart_item ) {
    if ( isset($_POST['farbe']) || isset($_POST['groesse']) ) {
        if ( isset($_POST['farbe']) ) {
            $cart_item_data['farbe'] = esc_attr($_POST['farbe']);
        }
        if ( isset($_POST['groesse']) ) {
            $cart_item_data['groesse'] = esc_attr($_POST['groesse']);
        }
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// Display on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
    if ( isset($cart_item['farbe']) ) {
        $custom_items[] = array( 'name' => __("Farbe", "woocommerce"), 'value' => $cart_item['farbe'] );
    }

    if ( isset($cart_item['groesse']) ) {
        $custom_items[] = array( 'name' => __("Größe", "woocommerce"), 'value' => $cart_item['groesse'] );
    }
    return $custom_items;
}

// Display on orders and email notifications (save as custom order item meta data)
add_action( 'woocommerce_checkout_create_order_line_item', 'display_acf_on_orders_and_emails', 10, 4 );
function display_acf_on_orders_and_emails( $item, $cart_item_key, $values, $order ) {
    $colors  = get_field( 'colors', $values['product_id'] );
    $sizes = get_field( 'sizes', $values['product_id'] );

    if ( isset($values['farbe']) ) {
        $item->add_meta_data( 'farbe', $values['farbe'] );
    }

    if ( isset($values['groesse']) ) {
        $item->add_meta_data( 'groesse', $values['groesse'] );
    }
}

// Change displayed label for specific custom order item meta keys
add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key', 10, 3 );
function filter_wc_order_item_display_meta_key( $display_key, $meta, $item ) {

    // Change displayed label for specific order item meta key
    if( is_admin() && $item->get_type() === 'line_item' ) {
        if( $meta->key === 'farbe' ) {
            $display_key = __("Farbe", "woocommerce");
        }
        if( $meta->key === 'groesse' ) {
            $display_key = __("Größe", "woocommerce");
        }
    }
    return $display_key;
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

【讨论】:

  • 至于这个答案,为什么不将class="color" 添加到&lt;option&gt; 标记并删除其value 属性,因为它只会复制选项的文本? ...再一次,如果每个&lt;option&gt; 都无条件地接收类声明,那么这将争辩说首先提名该类没有任何价值——只需针对所有&lt;option&gt; 标签,它们是这些标识的子标签&lt;select&gt;s 适用于任何 css/js。对吗?
猜你喜欢
  • 2015-05-27
  • 2015-12-04
  • 1970-01-01
  • 2018-08-28
  • 2014-11-21
  • 2018-07-16
  • 2020-09-01
  • 2018-06-08
  • 2018-10-31
相关资源
最近更新 更多