【问题标题】:Can´t get custom attribute on WooCommerce product无法获取 WooCommerce 产品的自定义属性
【发布时间】:2025-12-21 20:10:11
【问题描述】:

在 WooCommerce 中创建订单后,我尝试保存自定义元数据。我用woocommerce_new_order_item 钩子试了一下,总的来说它可以工作。但我需要存储订购产品的自定义属性..但我无法获取它。

我尝试了什么:

add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
    $angebotstext = get_post_meta($item_id, 'angebotstext', false);
    wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}

add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
    global $product;
    $angebotstext = $product->get_attribute( 'pa_angebotstext' );
    wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}

属性保存在这里:

...meta_value 的结果始终为空、NULL 或 a:0:{}

你有什么想法吗?

-----编辑----

它以这种方式工作:

    add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $item, $order_id )
{

    if ($order_id) {
        $order = wc_get_order( $order_id );
  }

    # Iterating through each order items (WC_Order_Item_Product objects in WC 3+)
    if ($order) {
        foreach ( $order->get_items() as $item_id => $item_values ) {

            // Product_id
            $product_id = $item_values->get_product_id();

            $product = wc_get_product($product_id);
            $angebotstext = $product->get_attribute('Angebotstext');
            if ( !empty($angebotstext) && $angebotstext != NULL ) {
                wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
      }
        }
  }
}

但是:此代码将我的自定义属性两次添加为元......为什么? ????

【问题讨论】:

  • 为什么不先尝试获取属性,然后使用“update_post_meta()”将订单更新为普通的 wp 帖子?因此该值将保存在订单页面内的自定义字段中,您可以随时轻松访问。
  • 你有一个例子我怎么能做到这一点?
  • 顺便说一句:我编辑了我的答案...还有另一个问题...:/
  • 500(内部服务器错误)通常是由该 ajax 函数上的 PHP 代码 exaclty 的致命错误引起的(日志显示的 ywraq_submit_default_form 第 1 行)。在另一个世界中,这可能是您的代码无法完成整个任务的原因,因为它到达了函数 (ywraq_submit_default_form )。我可能需要更多日志来检查这一点,但我相信你需要检查这个函数“ywraq_submit_default_form”上的代码,因为它有错误。
  • 感谢您的留言。请检查我编辑的代码。现在 500 不见了......但是:这段代码将我的自定义属性添加了两次作为元......为什么? ??????

标签: wordpress woocommerce hook-woocommerce


【解决方案1】:

这里的主要问题是如果订单包含多个产品,那么您将面临同一个订单多次更新的问题。

为了避免这种情况或选择以正确的方式处理它,这里有一些想法:

要使其适用于多种产品:
更改了这部分:

wc_add_order_item_meta($item_id, 'Angebotstext _'.$product_id , $angebotstext);

这将为每个产品添加一个新的自定义元,方法是在每个元键末尾添加产品 ID,元值将是该属性的产品唯一值。 所以你会在订单页面上找到这个自定义字段:

  • Angebotstext_123 = 产品属性。
  • Angebotstext_485 = 产品
  • 属性。 Angebotstext_951 = 产品属性。
    '123'、'485' 是产品 ID,该 meta_key 的元值将是该产品属性。

为了防止它多次更新:

if ($order) {
     $angebotstext ='';
        foreach ( $order->get_items() as $item_id => $item_values ) {

            // Product_id
            $product_id = $item_values->get_product_id();

            $product = wc_get_product($product_id);
            $angebotstext = $product->get_attribute('Angebotstext');
            $prev_angebotstext = $angebotstext;
            if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext ) {
                wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
      }
        }
  }

"$prev_angebotstext" 是前一项的属性。

if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext )

这个条件会检查当前产品属性是否等于之前的产品属性,如果是则不会再次更新订单。

谢谢!

【讨论】:

  • 非常感谢。如果我只是使用 wc_update_order_item_meta 而不是 wc_add_order_item_meta 怎么办?我刚试过,它有效!它只创建一次 :-) 如果没有其他效果,这会起作用吗?
  • wc_update_order_item_meta 将覆盖先前放置的属性的现有值。因此,通过添加条件来检查它是否是相同的属性,您不必这样做。或者您可以删除 foreach 并使用以下代码:
  • if ($order) { $order_items = $order->get_items() // get the id of the first product on the order $product_id = $order_items[0]->get_product_id(); $product = wc_get_product($product_id); $angebotstext = $product->get_attribute('Angebotstext'); if ( !empty($angebotstext) && $angebotstext != NULL ) { wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext); } }
最近更新 更多