从 WooCommerce 前端的下拉列表中删除特定变体

Remove particular variation from dropdown in WooCommerce frontend

我正在使用 WooCommerce and WooCommerce Subscriptions 并且它的工作符合我的预期。

现在我正在创建一个具有多个属性的可变订阅产品。

现在我想 remove/hide 下拉列表中的特定项目,因此我尝试使用下面的代码/钩子,我相信这可能会帮助我实现。

add_filter('woocommerce_dropdown_variation_attribute_options_args', 'hide_variations_for_mindesk_users');

function hide_variations_for_mindesk_users( $args ){        
    
   print_r($args);

    return $args;    
}

现在我的问题是,如何从下拉列表中删除或隐藏特定的变体产品?我需要从变体 ID 或某个地方删除吗?


例如:

在这里,我想 remove/hide 下拉列表中的第二个变体,其变体 ID #4171 具有“每月专业版”。这也适用于单个属性。

任何人都可以指出我实现这一目标的正确方向吗?

add-to-cart/variable.php模板文件中,我们找到foreach ( $attributes as $attribute_name => $options )。但是,目的是隐藏 1 个属性,所以让我们看看这些传递到模板文件的位置。

includes/wc-template-functions.php中,我们可以看到调用了模板文件,并传递了一个带有一些选项的数组。这些选项之一是 available_variations' => $get_variations ? $product->get_available_variations()

然后在 includes/class-wc-product-variable.php 中找到 get_available_variations() 函数,而 $variation_ids = $this->get_children(); 又包含该函数。

然后可以在includes/class-wc-product-variable.php中找到get_children()函数,其中包含apply_filters( 'woocommerce_get_children', $this->children, $this, false );

并且该过滤器挂钩可用于删除一个或多个 childID(变体)


所以你得到:

function filter_woocommerce_get_children( $children, $product, $false ) {
    // NOT backend
    if ( is_admin() ) return $children;

    // Variation ID
    $variation_id = 4171;
    
    // Delete by value: Searches the array for a given value and returns the first corresponding key if successful
    if ( ( $key = array_search( $variation_id, $children ) ) !== false ) {
        unset( $children[$key] );
    }

    return $children;
}
add_filter( 'woocommerce_get_children', 'filter_woocommerce_get_children', 10, 3 );

如果您想将其应用于多个变体 ID,请使用:

function filter_woocommerce_get_children( $children, $product, $false ) {
    // NOT backend
    if ( is_admin() ) return $children;

    // Variation IDs, multiple IDs can be entered, separated by a comma
    $variation_ids = array( 4171, 36, 38 );
    
    // Loop through variation IDs
    foreach ( $variation_ids as $variation_id ) {
        // Delete by value: Searches the array for a given value and returns the first corresponding key if successful
        if ( ( $key = array_search( $variation_id, $children ) ) !== false ) {
            unset( $children[$key] );
        }
    }

    return $children;
}
add_filter( 'woocommerce_get_children', 'filter_woocommerce_get_children', 10, 3 );

在这个答案中使用:PHP array delete by value (not key)