我正在为客户建立一个商店。 现在在产品页面上,有一个下拉列表,您可以选择交付"标准"或者"表达。
如果客户选择此项,您可以从此产品中选择所需的金额。
现在我在stackoverflow(Woocommerce get variation product price)上找到了一段代码,以便在下拉列表中直接显示正确的价格。这很完美。
但是现在,第一笔金额(100(€22))的价格也显示在交货下拉列表中(2 - 3天(22欧元)。而且我想从交货变量中删除价格/下拉。
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );
function display_price_in_variation_option_name( $term ) {
global $wpdb, $product;
$result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" );
$term_slug = ( !empty( $result ) ) ? $result[0] : $term;
$query = "SELECT postmeta.post_id AS product_id
FROM {$wpdb->prefix}postmeta AS postmeta
LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
WHERE postmeta.meta_key LIKE 'attribute_%'
AND postmeta.meta_value = '$term_slug'
AND products.post_parent = $product->id";
$variation_id = $wpdb->get_col( $query );
$parent = wp_get_post_parent_id( $variation_id[0] );
if ( $parent > 0 ) {
$_product = new WC_Product_Variation( $variation_id[0] );
return $term . ' (' . woocommerce_price( $_product->get_price() ) . ')';
}
return $term;
}
我试图更改$ variation_id [0];到1,2,3,4和5,但没有成功,所以我认为必须有另一种方法来解决它。
Thnx提前:)
答案 0 :(得分:0)
您需要做的是在display_price_in_variation_option_name()函数中添加一些逻辑,以检查过滤器是否应该应用于特定属性。在这种情况下,一个大问题是,您在函数中唯一可以访问的是术语的名称,但不保证是唯一的。例如,你可以有一个名为" Blue"在"材料颜色"或"包装颜色"属性。我们需要确切地找出这个术语属于哪个属性,并且据我所知,唯一合理的方法是修改应用此过滤器的模板,并传入额外的"分类法&# 34;您可以在函数中检查的参数。
例如,在模板的第48行
/wp-content/plugins/woocommerce/templates/single-product/add-to-cart/variable.php
你会发现' woocommerce_variation_option_name'的两个实例。过滤器,第48行和第54行(从版本2.3.0开始)。您将看到这些当前传入一个参数。我们需要传入第二个参数,该参数是该术语所属的属性的名称。幸运的是,该变量已经存在于范围内,它被称为$ name。因此,我们需要对模板进行两次修改。首先,我们应该添加第二个$ name变量:
apply_filters( 'woocommerce_variation_option_name', $term->name )
应该成为
apply_filters( 'woocommerce_variation_option_name', $term->name, $name )
您还需要更新过滤器以接受第二个参数。所以,在原始代码中,这个:
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' )
应该成为:
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name', 10, 2 )
您还需要更新过滤器函数以接受第二个参数。所以这个:
function display_price_in_variation_option_name( $term ) {
应该成为:
function display_price_in_variation_option_name( $term, $name = null ) {
现在您已准备好添加逻辑检查以查看该属性是否应显示价格。由于您只是表示要将其隐藏为运费属性,因此我们将使用这些属性。首先,您需要找到您要抑制的属性的全名。最快的方法是进入WP管理员并转到产品 - > “属性”部分,然后选择要抑制的送货属性。然后在URL中你会看到?taxonomy =后跟以" pa _"开头的东西 - 你想要以" pa _"开头的东西(它代表产品属性)。对于这个例子,让我们说它是" pa_shipping"。现在,在您的过滤功能中,您将执行以下操作:
function display_price_in_variation_option_name( $term, $name = null ) {
if($name == 'pa_shipping') {
return $term;
}
global $wpdb, $product;
// the rest of your original code
我已经对此进行了测试,看起来效果非常好。还有一个我可以描述的JavaScript选项,但是它不会那么健壮(尽管它不需要你改变模板文件)。