【问题标题】:Woocommerce shows price on both variationsWoocommerce 显示两种变体的价格
【发布时间】:2015-08-21 15:25:59
【问题描述】:

我正在为客户建立商店。 现在在产品页面上有一个下拉菜单,您可以在其中选择“标准”或“快递”。

当客户选择此项时,您可以从该产品中选择您想要的数量。

现在我在 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 ,但没有成功,所以我认为必须有另一种方法来解决它。

提前谢谢 :)

【问题讨论】:

    标签: wordpress variables woocommerce


    【解决方案1】:

    您需要做的是在 display_price_in_variation_option_name() 函数中添加一些逻辑,以检查过滤器是否应应用于特定属性。在这种情况下,一个大问题是您在函数中唯一可以访问的是术语的名称,不能保证它是唯一的。例如,您可以在“材料颜色”或“包装颜色”属性中都有一个名为“蓝色”的变体。我们需要准确找出该术语属于哪个属性,据我所知,唯一合理的方法是修改应用此过滤器的模板,并传入一个额外的“分类”参数可以在函数内检查。

    例如在模板的第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 Admin 并转到 Products -> Attributes 部分,然后选择要禁止的运输属性。然后在 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 选项,但它不会那么健壮(尽管它不需要您更改模板文件)。

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 2013-01-10
      • 2017-11-24
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2016-03-29
      相关资源
      最近更新 更多