Woo-commerce 3.0单品价格变化不大

问题描述 投票:1回答:2

我创建了一个名为“sub_products”的新帖子类型,其中包含元标记“unit_price”。在为包含所有“子产品”帖子列表的每个Woocommerce产品分配新字段后,目标是根据所选的“sub_products”元“unit_price”更新每个产品价格。

function kulcskron_edit_post( $p1, $p2 )
{
  if ( !is_admin() )
    return;

  if ( get_post_type() != 'product' )
    return;

  $sub_product_ids = $p2->get_meta( 'sub_products' );

  if ( empty($sub_product_ids) )
    return;

  $product_regular_price = 0;
  foreach ( $sub_product_ids as $id ) 
    $product_regular_price += get_post_meta( $id, 'unit_price', true );

  if ( $p1 == $product_regular_price )
    return;

  $p2->set_regular_price( $product_regular_price );
  $p2->save();
}
add_action( 'woocommerce_product_get_price', 'kulcskron_edit_post', 10, 2 );

我尝试了所有可能的钩子来完成这项工作:

add_action( 'the_post', 'kulcskron_edit_post', 9, 1 );
add_action( 'edit_post', 'kulcskron_edit_post', 10, 2 );
add_action( 'pre_get_posts', 'kulcskron_edit_post' );
add_action( 'save_post', 'kulcskron_edit_post' );

此代码以一种奇怪的方式更新价格:

管理员单一产品编辑视图:在我重新访问编辑屏幕之后,价格不会立即更新。

管理产品列表视图:每个价格为0。

前端产品页面视图:显示的价格为0。

在管理视图中保存单个产品时,如何根据分配的“sub_products”“unit_price”post meta更新产品价格?

php wordpress woocommerce
2个回答
1
投票

你可以使用钩子“woocommefrce_get_price_html”它应该工作


0
投票

我设法解决了价格更新问题。我使用了save_post操作:

save_post是在创建或更新帖子或页面时触发的操作,可以是导入,发布/页面编辑表单,xmlrpc或通过电子邮件发布。

最终代码:

function kulcskron_update_product( $product_obj )
{
  if ( !is_admin() )
    return;

  if ( get_post_type() != 'product' )
    return;

  $product = wc_get_product( $product_obj );
  if ( !$product->meta_exists( 'sub_products' ) )
    return;

  $sub_product_ids = $product->get_meta( 'sub_products' );
  if ( empty($sub_product_ids) )
    return;

  _update_product_price( $product_obj, $sub_product_ids );

}
add_action( 'save_post', 'kulcskron_update_product' );

为了完整起见,这里是代码的其余部分:

function _update_product_price( $product_obj, $sub_product_ids )
{
  $product = wc_get_product( $product_obj );

  $product_regular_price = 0;
  foreach ( $sub_product_ids as $id ) 
    $product_regular_price += get_post_meta( $id, 'kulcskron_unit_price', true );

  $product->set_regular_price( $product_regular_price );
  $product->set_price( $product_regular_price );
  $product->save();
}

这种方式基本上可以编辑和更新所有内容。例:

function _update_product_stock( $product_obj, $sub_product_ids )
{
  $product = wc_get_product( $product_obj );

  $sub_product_stocks = array();
  foreach ( $sub_product_ids as $id ) 
    $sub_product_stocks[] = get_post_meta( $id, 'kulcskron_free_stock_quantity', true );

  $product->set_manage_stock( true );
  $product->set_stock_quantity( min($sub_product_stocks) );
  $product->save();
}

我想发布一个链接到所有方法来编辑产品,但我没有代表。

但遗憾的是,并非所有......为了全面更新价格,我们需要过滤价格HTML以返回新更新的价格。

function kulcskron_price_html( $priceHtml, $product )
{
  $symbol = get_woocommerce_currency_symbol();
  $price = $product->get_regular_price();
  $html = '<span class="woocommerce-Price-amount amount">'. $price .'&nbsp;<span class="woocommerce-Price-currencySymbol">'. $symbol .'</span></span>';
  return $html;
}; 
add_filter( 'woocommerce_get_price_html', 'kulcskron_price_html', 10, 2 );

一个小背景故事。我们需要通过XML文件同步外部数据库中的所有产品。但是有一个问题,XML文件只包含产品部件,它们不会被显示,搜索,过滤,当然也不能单独订购。 Woocommerce内置功能都不符合这些要求。

为了解决这个问题,我注册了一个新的帖子类型并将所有产品部件导入到这个新创建的帖子类型中。之后,我使用高级自定义字段插件为每个WC产品注册了一个新字段。

它看起来像这样:Newly registered custom post type with the custom fields

上面的代码可以根据所选的Sub产品轻松更新WC产品(例如价格)。

© www.soinside.com 2019 - 2024. All rights reserved.