我正在使用一些自定义逻辑来显示或隐藏变量产品中的变化,使用这个钩子woocommerce_get_children https://stackoverflow.com/a/67804835/6829420及其按照我的预期工作得很好。
然而,我有错误的‘注册费’在可变产品页面,因为它不断从我的一个隐藏的变化值。下面是我的尝试和我迄今所做的工作。
add_filter( 'woocommerce_subscriptions_product_price_string', 'subscr_product_price_string', 10, 3 );
function subscr_product_price_string( $subscription_string, $product, $include ){
if (is_admin() || (! $product->is_type( 'variable-subscription' ))) return $subscription_string;
if ( $include['sign_up_fee'] && $product->get_sign_up_fee( $product ) > 0 ) {
$available_variations = $product->get_available_variations();
echo count($available_variations);
echo $product->get_sign_up_fee();
exit;
//echo $prices = get_price_sign_up_fee($product);
exit;
}例如,我有三个变体“蓝色,黄色和绿色”,我有隐藏的“蓝色”,并转到变体产品页面。
如果我这么做,
$available_variations = $product->get_available_variations();
echo count($available_variations);然后它显示了2,但我的echo $product->get_sign_up_fee();一直从"Blue“中获得值,后者的值最低,但这是错误的值。

有人能指导我如何获得注册的价值,根据我的现有变体只。
我已经从值中更新了默认的值,使用了下面的代码,并使用了woocommerce_variable_price_html钩子,并根据可用的变体获得了它的值。
function updateFromDefaultValue($price, $product) {
$prefix = sprintf('%s: ', __('From', 'iconic'));
$min_price_regular = $product->get_variation_regular_price('min', true);
$min_price_sale = $product->get_variation_sale_price('min', true);
$max_price = $product->get_variation_price('max', true);
$min_price = $product->get_variation_price('min', true);
$price = ($min_price_sale == $min_price_regular) ?
wc_price($min_price_regular) :
'<del>' . wc_price($min_price_regular) . '</del>' . '<ins>' . wc_price($min_price_sale) . '</ins>';
return ($min_price == $max_price) ?
$price :
sprintf('%s%s', $prefix, $price);
}
add_filter('woocommerce_variable_price_html', 'updateFromDefaultValue', 10, 2);谢谢
更新
我找到了一个钩子woocommerce_subscriptions_product_price_string_inclusions,通过它我可以根据“可用订阅”获得一个更新的sign_up_fee值。下面是我的密码。
add_filter('woocommerce_subscriptions_product_price_string_inclusions', 'updateSubscriptionPeriod', 10, 2);
function updateSubscriptionPeriod( $include, $product ) {
if (is_admin() || (! $product->is_type( 'variable-subscription' ))) return $include;
$min_max_variation_data = $product->get_min_and_max_variation_data( array_keys( $prices ) );
if(empty($min_max_variation_data) || empty($min_max_variation_data['subscription'])) return $include;
$include['sign_up_fee'] = $min_max_variation_data['subscription']['signup-fee'];
$include['trial_length'] = 5;
$include['subscription_period'] = 50;
$include['subscription_length'] = $min_max_variation_data['subscription']['interval'];
$include['subscription_price'] = $min_max_variation_data['max']['price'];
return $include;
}现在我可以得到价值20,请看下面的截图。

但是,正如您可以看到我的截图中的不同之处,我仍然没有得到更新的值,正如应该说的,every 3 years with a 2-week free trial a,very 4 years with a 2-month free trial,因为这是我从可用的变体中得到的值。
您还可以看到,我正在尝试放置一些静态值,以及像这样的动态值。
$include['trial_length'] = 5;
$include['subscription_period'] = 50;
$include['subscription_length'] = $min_max_variation_data['subscription']['interval'];
$include['subscription_price'] = $min_max_variation_data['max']['price']; 但我的产品页面没有更新。
有人能指点我吗?我怎样才能更新这些适当的价值观。
提前谢谢。
更新2
我搜索了一下,找到了woocommerce_subscriptions_product_price_string钩子,这是我的尝试。
add_filter( 'woocommerce_subscriptions_product_price_string', 'subscriptions_custom_price_string', 20, 3 );
function subscriptions_custom_price_string( $price_string, $product, $args ) {
// Get the trial length to check if it's enabled
$trial_length = $args['trial_length'];
$speriod = $args['subscription_period'];
$sfee = $args['sign_up_fee'];
$sfee = wc_price($sfee);
$sign_up_fee = isset($args['sign_up_fee']) ? __(" and a $sfee sign-up fee", "woocommerce") : '';
if( $trial_length > 0 )
$price_string = $args['price'] . ' / ' . $speriod . $sign_up_fee;
return $price_string;
}下面是这样的画面。

所以现在基本上它的更新,但它不正确,因为我失去了一个格式和其他一些重要的价值。
有人能指导我如何正确地覆盖这个过滤器吗?
谢谢
发布于 2021-07-17 09:49:34
woocommerce_variable_subscription_price_html是您应该使用的正确钩子,下面是一个可能对您有用的示例:
add_filter( 'woocommerce_variable_subscription_price_html', 'variable_subscription_custom_price_html', 10, 2 );
function variable_subscription_custom_price_html( $price, $product ) {
// Unhook to avoid infinite loop.
remove_filter( 'woocommerce_variable_subscription_price_html', __FUNCTION__, 10, 2 );
// List of product IDs for variations you're hiding.
$hidden_products = array( 4171 );
// Check if the product has any variations that you manually hid.
$hidden = array_intersect( $hidden_products, get_children( array(
'post_parent' => $product->get_id(),
'post_type' => 'product_variation',
'fields' => 'ids',
) ) );
if ( ! empty( $hidden ) ) {
$prices = $product->get_variation_prices( true )['price'];
asort( $prices ); // sort from lowest to highest price
$variation = wc_get_product( array_keys( $prices )[0] );
// It's a variation, so we manually add the 'From: text'.
$price = 'From: ' . $variation->get_price_html();
}
// Re-hook this function.
add_filter( 'woocommerce_variable_subscription_price_html', __FUNCTION__, 10, 2 );
return $price;
}https://stackoverflow.com/questions/68311716
复制相似问题