首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WooCommerce中添加自定义字段为购物车项元和订单项元

在WooCommerce中添加自定义字段为购物车项元和订单项元
EN

Stack Overflow用户
提问于 2017-12-18 09:16:54
回答 2查看 17.5K关注 0票数 4

这是一个插件,介绍如何为我的WooCommerce订单添加购物车项目元和订单项元。最初,我下面的代码对于输入type=text很有效。它返回值的标签和输入的值。

在转换为type=checkbox时,代码返回被检查的代码的labelvalue="on"

我想返回选中值的唯一值名称(忽略未选中的值)。

帮助包含更多复选框选项的重构将有助于减少编写的代码。

我的代码:

代码语言:javascript
复制
<?php
    global $woocommerce, $product, $post;

        add_action( 'woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart' );

        function add_fields_before_add_to_cart( ) {
            ?>

            <div class="simple-selects">
                <div class="col-md-6">
                    <h3>Main meals</h3>
                    <p><input type="checkbox" name="mm_chicken_cutlet_bento" id="mm_chicken_cutlet_bento"><?php _e( "Chicken Cutlet Bento", "aoim"); ?></p>
                    <p><input type="checkbox" name="mm_roasted_pork_rib_bento" id="mm_roasted_pork_rib_bento"><?php _e( "Roasted Pork Rib Bento", "aoim"); ?></p>
                </div>
            </div>        

            <?php
        }

        /**
         * Add data to cart item
         */
        add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2 );
        function add_cart_item_data( $cart_item_meta, $product_id ) {

            if ( isset( $_POST ['mm_chicken_cutlet_bento'] ) && isset( $_POST ['mm_roasted_pork_rib_bento'] ) ) {
                $custom_data  = array() ;
                $custom_data [ 'mm_chicken_cutlet_bento' ]    = isset( $_POST ['mm_chicken_cutlet_bento'] ) ?  sanitize_text_field ( $_POST ['mm_chicken_cutlet_bento'] ) : "" ;
                $custom_data [ 'mm_roasted_pork_rib_bento' ] = isset( $_POST ['mm_roasted_pork_rib_bento'] ) ? sanitize_text_field ( $_POST ['mm_roasted_pork_rib_bento'] ): "" ;
                $cart_item_meta ['custom_data']     = $custom_data ;
            }

            return $cart_item_meta;
        }

        /**
         * Display custom data on cart and checkout page.
         */
        add_filter( 'woocommerce_get_item_data', 'get_item_data' , 25, 2 );
        function get_item_data ( $other_data, $cart_item ) {
            if ( isset( $cart_item [ 'custom_data' ] ) ) {
                $custom_data  = $cart_item [ 'custom_data' ];

                $other_data[] = array( 'name' => 'Chicken Cutlet Bento', 'display'  => $custom_data['mm_chicken_cutlet_bento'] );
                $other_data[] = array( 'name' => 'Roasted Pork Rib Bento', 'display'  => $custom_data['mm_roasted_pork_rib_bento'] );
            }

            return $other_data;
        }

        /**
         * Add order item meta.
         */
        add_action( 'woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 2);
        function add_order_item_meta ( $item_id, $values ) {
            if ( isset( $values [ 'custom_data' ] ) ) {
                $custom_data  = $values [ 'custom_data' ];
                wc_add_order_item_meta( $item_id, 'Chicken Cutlet Bento', $custom_data['mm_chicken_cutlet_bento'] );
                wc_add_order_item_meta( $item_id, 'Roasted Pork Rib Bento', $custom_data['mm_roasted_pork_rib_bento'] );
            }
        }

?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-18 12:17:01

更新(与评论相关):

  • 仅将功能限制为一个产品ID
  • 将所有复选框值添加为昏迷分隔字符串

为了方便地将复选框的标签名称作为值并“重构以帮助包括更多的复选框选项将有助于减少编写的代码”,我添加了一个简单的函数,您将为每个要显示和处理…的复选框设置键/值对。

所以我重温了你所有的代码:

代码语言:javascript
复制
// HERE set the array of pairs keys/values for your checkboxes
function custom_checkboxes(){
    return array(
        'mm_chicken_cutlet_bento'       => __( "Chicken Cutlet Bento", "aoim"),
        'mm_roasted_pork_rib_bento'     => __( "Roasted Pork Rib Bento", "aoim"),
    );
}

// Displaying the checkboxes
add_action( 'woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart' );
function add_fields_before_add_to_cart( ) {
    global $product;
    if( $product->get_id() != 2 ) return; // Only for product ID "2"

    ?>
    <div class="simple-selects">
        <div class="col-md-6">
            <h3><?php _e("Main meals", "aoim"); ?></h3>
            <?php foreach( custom_checkboxes() as $key => $value ): ?>
                <p><input type="checkbox" name="<?php echo $key; ?>" id="<?php echo $key; ?>"><?php echo ' ' . $value; ?></p>
            <?php endforeach; ?>
        </div>
    </div>
    <?php
}


// Add data to cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2 );
function add_cart_item_data( $cart_item_data, $product_id ) {
    if( $product_id != 2 ) return $cart_item_data; // Only for product ID "2"

    // Set the data for the cart item in cart object
    $data = array() ;

    foreach( custom_checkboxes() as $key => $value ){
        if( isset( $_POST[$key] ) )
            $cart_item_data['custom_data'][$key] = $data[$key] = $value;
    }
    // Add the data to session and generate a unique ID
    if( count($data > 0 ) ){
        $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'custom_data', $data );
    }
    return $cart_item_data;
}


// Display custom data on cart and checkout page.
add_filter( 'woocommerce_get_item_data', 'get_item_data' , 25, 2 );
function get_item_data ( $cart_data, $cart_item ) {
    if( $cart_item['product_id'] != 2 ) return $cart_data; // Only for product ID "2"

    if( ! empty( $cart_item['custom_data'] ) ){
        $values =  array();
        foreach( $cart_item['custom_data'] as $key => $value )
            if( $key != 'unique_key' ){
                $values[] = $value;
            }
        $values = implode( ', ', $values );
        $cart_data[] = array(
            'name'    => __( "Option", "aoim"),
            'display' => $values
        );
    }

    return $cart_data;
}

// Add order item meta.
add_action( 'woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 3 );
function add_order_item_meta ( $item_id, $cart_item, $cart_item_key ) {
    if ( isset( $cart_item[ 'custom_data' ] ) ) {
        $values =  array();
        foreach( $cart_item[ 'custom_data' ] as $key => $value )
            if( $key != 'unique_key' ){
                $values[] = $value;
            }
        $values = implode( ', ', $values );
        wc_add_order_item_meta( $item_id, __( "Option", "aoim"), $values );
    }
}

这段代码在您的活动子主题(或主题)的function.php文件中,或者在任何插件文件中。

测试和工作。

你会得到这样的东西:

我添加了“选项”作为标签,以避免值重复…。

票数 12
EN

Stack Overflow用户

发布于 2021-10-13 12:21:14

LoicTheAztec's solution基本上仍然有效,但是现在不再推荐从cart到order添加元数据的操作。

您可以像这样使用woocommerce_add_order_item_meta而不是woocommerce_checkout_create_order_line_item (不推荐):

代码语言:javascript
复制
add_action(
    'woocommerce_checkout_create_order_line_item',
    function(WC_Order_Item_Product $cartItem, string $cartItemKey, array $values): void {
        if (!empty($values['custom_data']) && is_array($values['custom_data'])) {
            $values = [];
            foreach ($values['custom_data'] as $key => $value) {
                if ($key !== 'unique_key'){
                    $values[] = $value;
                }
            }
            $cartItem->add_meta_data(__('Option', 'aoim'), implode(', ', $values), true);
        }
    },
    10,
    3
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47865226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档