2017-08-26 36 views
1

我製作了一個名爲「sub_products」的新類型,其中包含元標記「unit_price」。 爲每個包含所有「子產品」帖子列表的Woocommerce產品分配新字段後,目標是根據所選「子產品」元「unit_price」更新每個產品價格。Woocommerce 3.0單品價格沒有正確更改

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'); 

此代碼更新價格,但在陌生的路上:

聯繫單品編輯觀點:價格在我重新訪問編輯屏幕之後不立即更新。

Admin產品列表查看:每個價格爲0

前端產品頁面視圖:所顯示的價格是0

如何更新基礎上,賦予產品價格當在管理視圖中保存單個產品時,「sub_products」「unit_price」是否發佈meta?

回答

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製品(例如價格)。

1

您可以使用鉤「woocommefrce_get_price_html」它應該工作

+0

此過濾器無法更改數據庫中的產品價格[請參閱此處。](http://woocommerce.wp-a2z.org/oik_hook/woocommerce_get_price_html/) – David

+1

$ price = $ p2-> set_regular_price( $ product_regular_price); return $ price; 這是過濾器類型的鉤子,所以你必須返回一些東西。 你也可以試試set_price function(); – MakeWebBetter

相關問題