当前位置: 首页 > 知识库问答 >
问题:

在购物车、结账和查看订单中设置产品自定义字段和显示值

薛兴言
2023-03-14

我在我的产品页面中创建了一个自定义保修字段,通过function.php.

add_action( 'woocommerce_product_options_general_product_data', 'test_custom_fields' );
function test_custom_fields() {
    // Print a custom text field
    woocommerce_wp_text_input( array(
        'id' => '_warranty',
        'label' => 'i.e. 15 years',
        'description' => '',
        'desc_tip' => 'true',
        'placeholder' => 'i.e. 15 years'
    ) );        
}

add_action( 'woocommerce_process_product_meta', 'test_save_custom_fields' );
function test_save_custom_fields( $post_id ) {
    if ( ! empty( $_POST['_warranty'] ) ) {
        update_post_meta( $post_id, '_warranty', esc_attr( $_POST['_warranty'] ) );
    }
}

我想“复制”这个自定义字段的键和值,在一个自我生成的自定义字段的管理订单页面上,根据产品在购物车/订单(无插件)。

因此,通过订单页面上的这个自定义字段,我将最终能够使用WooCommerce pdf发票插件在我的pdf发票中显示“保修”。

另一种解释是:

  1. 作为管理员,我在“产品1”页面填写保修值
  2. 当订单中有“product1”时,在“管理订单”视图中,我希望看到一个自定义字段,其中包含product1页面中的“\u保修值”
  3. 因此,作为管理员,我可以在WooCommerce PDF发票插件中设置{{{{u保修}},以显示“保修期:15年”

非常感谢你的帮助。

我刚刚测试了以下案例:在订单详细信息中的订单项表中显示产品元

但这并没有给我一个自定义字段,所以我无法从中获取{{{{u}}值。

我做错了什么<我怎样才能做到这一点?

谢谢

共有2个答案

龙星渊
2023-03-14

代码末尾出现错误,首先调用变量$prod\u id,然后调用$product\u id。正确且有效的代码是:

// Add the information in the order as meta data
add_action('woocommerce_add_order_item_meta','add_waranty_to_order_item_meta', 1, 3 );
function add_waranty_to_order_item_meta( $item_id, $values, $cart_item_key ) {
    // Retrieving the product id for the order $item_id
    $prod_id = wc_get_order_item_meta( $item_id, '_product_id', true );
    // Getting the warranty value for this product Id
    $warranty = get_post_meta( $prod_id, '_warranty', true );
    // Add the meta data to the order
    wc_add_order_item_meta($item_id, 'Warranty', $warranty, true);
}
冀越
2023-03-14

第一:“在管理订单页面上自行生成的自定义字段中,用键和值复制此自定义字段”不是好方法。

为了实现你的期望,你错过了一些小事情。您需要:

  1. 在购物车中存储自定义字段(将产品添加到购物车时)
  2. 在购物车和结账页面上呈现此内容
  3. 将订单中的信息添加为元数据(使其成为订单的一部分)

有了第3点,您将能够在WooCommerce PDF发票插件上显示“保修期:15年”。

因此,您需要的代码是:

// create the custom field on product admin tab
add_action( 'woocommerce_product_options_general_product_data', 'create_warranty_custom_field' );
function create_warranty_custom_field() {
    // Create a custom text field
    woocommerce_wp_text_input( array(
        'id'            => '_warranty',
        'type'          => 'text',
        'label'         => __('Warranty', 'woocommerce' ),
        'description'   => '',
        'desc_tip'      => 'true',
        'placeholder'   =>  __('i.e. 15 years', 'woocommerce' ),
    ) );
}

// save the data value from this custom field on product admin tab
add_action( 'woocommerce_process_product_meta', 'save_warranty_custom_field' );
function save_warranty_custom_field( $post_id ) {
    $wc_text_field = $_POST['_warranty'];
    if ( !empty($wc_text_field) ) {
        update_post_meta( $post_id, '_warranty', esc_attr( $wc_text_field ) );
    }
}

// Store custom field in Cart
add_filter( 'woocommerce_add_cart_item_data', 'store_warranty_custom_field', 10, 2 );

function store_warranty_custom_field( $cart_item_data, $product_id ) {
    $warranty_item = get_post_meta( $product_id , '_warranty', true );
    if( !empty($warranty_item) ) {
        $cart_item_data[ '_warranty' ] = $warranty_item;

        // below statement make sure every add to cart action as unique line item
        $cart_item_data['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'days_manufacture', $warranty_item );
    }
    return $cart_item_data;
}


// Render meta on cart and checkout
add_filter( 'woocommerce_get_item_data', 'rendering_meta_field_on_cart_and_checkout', 10, 2 );

function rendering_meta_field_on_cart_and_checkout( $cart_data, $cart_item ) {
    $custom_items = array();
    // Woo 2.4.2 updates
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['_warranty'] ) ) {
        $custom_items[] = array( "name" => __( "Warranty", "woocommerce" ), "value" => $cart_item['_warranty'] );
    }
    return $custom_items;
}

// Add the information in the order as meta data
add_action('woocommerce_add_order_item_meta','add_waranty_to_order_item_meta', 1, 3 );
function add_waranty_to_order_item_meta( $item_id, $values, $cart_item_key ) {
    // Retrieving the product id for the order $item_id
    $product_id = wc_get_order_item_meta( $item_id, '_product_id', true );
    // Getting the warranty value for this product Id
    $warranty = get_post_meta( $product_id, '_warranty', true );
    // Add the meta data to the order
    wc_add_order_item_meta($item_id, 'Warranty', $warranty, true);
}

当然,这function.php活动子主题(或主题)的文件中,或者也在任何插件文件中。

此代码经过测试并正常工作。

参考资料:

  • WooCommerce:将自定义元数据库添加到管理订单页面
 类似资料:
  • 我使用的是一个自定义的帖子类型和集成的woocommerce,我可以在页面上添加一个AddtoCart按钮,并可以将其添加到cart,所以效果很好 这是我的密码 但现在我需要在产品页面上添加一些自定义字段,一个包含颜色“黑色”和“白色”的下拉列表,这只是一个普通的下拉列表。当我选择一个将在购物车上显示在产品名称下的值时,我该怎么做

  • 我已经在woocommerce单一产品页面上添加了一些自定义选项,使用了下面关于我的主题函数的代码。php: 现在我想在购物车页面上显示所选的选项值。请帮我做这件事。谢啦

  • 我正在尝试获取WooCommerce产品的自定义字段值,以显示在商店系统的不同页面上。我成功地对单个产品页面执行了此操作,但相同的代码不适用于购物车。 对于单个产品,我在函数中使用了此代码。php,它可以很好地工作: 我为购物车尝试了相同的代码,但这次值没有显示在页面上。我还提到了这个线程(获取自定义属性),将$post更改为$product,但仍然没有输出。。。 有什么建议吗?

  • 我在产品页面的常规设置选项卡上创建了一个自定义字段WooCommerce Admin,以插入一些天的制造。我想在购物车和结账页面上显示每个产品名称上方的自定义字段值。 这是我的密码: 但这不起作用,因为我无法在购物车和结帐页面上显示自定义字段值。 我该如何实现这一点? 谢啦

  • 我正在尝试更改购物车和结帐页面中的产品名称。 我有以下代码添加一些购物车元数据: 但是我也想改变产品的名称。 例如,如果产品名称是,自定义字段值是,我想得到。 我该如何实现这一点?

  • 我想知道是否有人对以下场景有经验。 我正在使用WooCommerce将我的产品上市,准备出售。一些产品(大约20个)有大量的变化,因此我决定将产品数据放在单独的表中,并通过SKU(获取数据的简单查询)将其加载到woocommerce中。到目前为止,一切都很顺利。这些产品很好用。它们的变体正在显示,用户可以选择它们,将它们添加到购物车中。 问题是,我已经将这20种产品设置为单一产品,并给它们一个$1