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

时间:2017-08-26 12:04:30

标签: php wordpress woocommerce

我制作了一个名为“sub_products”的新帖子类型,其中包含元标记“unit_price”。 为每个包含所有“sub_products”帖子列表的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更新产品价格?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

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