【问题标题】:Woo-commerce 3.0 single product price is not changing properlyWoo-commerce 3.0 单品价格变化不正常
【发布时间】:2018-09-05 15:56:02
【问题描述】:

我创建了一个名为“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”帖子元更新产品价格?

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

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

    【讨论】:

    • 此过滤器无法更改数据库Read more here.中的产品价格
    • $price = $p2->set_regular_price($product_regular_price);返回$价格;这是过滤器类型的钩子,所以你必须返回一些东西。你也可以试试 set_price function();
    【解决方案2】:

    我设法解决了价格更新问题。 我使用了 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 内置功能均不符合这些要求。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2017-12-10
      • 2017-11-05
      • 2020-10-19
      • 2014-10-17
      • 2014-11-16
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多