从 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)
我正在使用 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)