在woocommerce存档页面和加价销售/相关产品中显示自定义产品价格

时间:2019-03-08 15:22:00

标签: php wordpress woocommerce product custom-fields

是否有一种方法可以使WordPress仪表板中的后端字段在存档页面和加售/相关产品中显示每个产品的自定义价格,但将价格保留在产品摘要中?

示例:产品A的价格为10欧元,但我想显示“起价为6欧元/千克”。

最简单的方法是使用覆盖woocommerce_template_loop_price的自定义字段,但是此代码无效,但我不明白为什么。

add_action('woocommerce_template_loop_price', 'shopprice_change', 10, 2);
function shopprice_change ($price, $product) {
    global $post, $blog_id;
    $post_id = $post->ID;
    $price = get_post_meta($post_id, 'shoppricechange', true);
    return $price;
    wp_reset_query();
}

更新

我找到了一种无需更改单个产品页面即可更改存档页面价格的解决方案:

function cw_change_product_html( $price_html, $product ) {
    $unit_price = get_post_meta( $product->id, 'shoppricechange', true );
    if (is_product()) return $price_html;
    if ( ! empty( $unit_price ) ) {
        $price_html = '<span class="amount">' . wc_price( $unit_price ) . '</span>';  
    }
    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'cw_change_product_html', 10, 2 );

问题:实际上,加售商品和相关产品也应该在单个产品页面上进行更改。但是if (is_product()) return $price_html;也将它们排除在外。谁能解决这个问题将得到赏金。谢谢!

3 个答案:

答案 0 :(得分:2)

  

但是使用if (is_product()) return $price_html;将其排除为   好吧。

用它代替is_product()对我来说很好:

is_single( $product->get_id() )

您不应该直接致电$product->id。而是使用$product->get_id()

这是我使用的完整代码:

function cw_change_product_html( $price_html, $product ) {
    if ( is_single( $product->get_id() ) )
        return $price_html;

    $unit_price = get_post_meta( $product->get_id(), 'shoppricechange', true );
    if ( ! empty( $unit_price ) ) {
        $price_html = '<span class="amount">' . wc_price( $unit_price ) . '</span>';
    }

    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'cw_change_product_html', 10, 2 );

答案 1 :(得分:1)

  1. woocommerce_template_loop_price不是动作,而是函数

  2. 使用下面的代码

    function cw_change_product_html( $price_html, $product ) {
            $unit_price = get_post_meta( $product->id, 'shoppricechange', true );
            $returnedSignleProdctP =false;
    
            $trace = debug_backtrace();
            $callstack = (array) $trace;
    
            foreach ($callstack as $key => $value) {
    
                if(isset($value['function']) && $value['function'] == 'woocommerce_output_related_products' ){
    
                    if ( ! empty( $unit_price ) ) {
    
                    $price_html = '<span class="amount">' . wc_price( $unit_price ) . '</span>';  
    
                    }
    
                }
    
                    if(isset($value['function']) && $value['function'] == 'woocommerce_template_single_price' ){
    
                        $price_html = $price_html;
    
                    }
    
    
    
                    if(isset($value['function']) && $value['function'] == 'woocommerce_template_loop_price' ){
    
                    if ( ! empty( $unit_price ) ) {
    
                    $price_html = '<span class="amount">' . wc_price( $unit_price ) . '</span>';  
    
                    }
    
                }
    
    
    
            }
    
    
    
    
    
    
            return $price_html;
    
    }
    add_filter( 'woocommerce_get_price_html', 'cw_change_product_html', 10, 2 );
    

答案 2 :(得分:0)

也许此插件可以提供帮助, Woocommerce额外价格字段(来源:https://wordpress.org/plugins/woocommerce-extra-price-fields/