AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79560069
Accepted
OverdueOrange
OverdueOrange
Asked: 2025-04-07 21:55:56 +0800 CST2025-04-07 21:55:56 +0800 CST 2025-04-07 21:55:56 +0800 CST

如何在 WooCommerce 变量订阅产品上更改 x 个月的文本

  • 772

与此类似但不完全。

我有一个可变订阅产品,可以分 12 个月分期付款。

如果“分期付款次数”为“全额付款”,我希望能够更改 1 个月的 £xxx 文本:全额付款

然后将接下来的 11 期付款按 2 个月/3 个月等方式进行。

我知道此代码只会显示价格,但我似乎无法修改它以仅更改 1 个月(全额付款选项):

add_filter('woocommerce_subscriptions_product_price_string_inclusions', 'remove_subscription_inclusions', 10, 2);

function remove_subscription_inclusions( $include, $product ) {
    $include['subscription_length'] = '';
    $include['subscription_period'] = '';
    return $include;
}

我确实尝试过这个但没有任何效果:

add_filter('woocommerce_subscriptions_product_price_string_inclusions', 'custom_subscription_price_string_inclusions', 10, 2);

function custom_subscription_price_string_inclusions( $include, $product ) {
    // Check if the product is a subscription product
    if ($product->is_type('subscription')) {
        // Get the variations of the subscription product
        $variations = $product->get_available_variations();

        // Loop through each variation to check for the 1-month payment option
        foreach ($variations as $variation) {
            // Get the variation's price and subscription length/period
            $regular_price = $variation['display_price'];
            $subscription_length = isset($variation['attributes']['pa_subscription_length']) ? $variation['attributes']['pa_subscription_length'] : '';
            $subscription_period = isset($variation['attributes']['pa_subscription_period']) ? $variation['attributes']['pa_subscription_period'] : '';

            // Check if this variation is the 1 month (single payment) option
            if ('1' === $subscription_length && 'month' === $subscription_period) {
                // Modify the price string for the 1 month single payment option
                $include['price_string'] = '£' . $regular_price . ' (Full payment for 1 month)';
                // Remove subscription length and period to avoid duplication
                $include['subscription_length'] = '';
                $include['subscription_period'] = '';
            }
        }
    }

    return $include;
}

wordpress
  • 2 2 个回答
  • 69 Views

2 个回答

  • Voted
  1. Kisded Szabi - CodeRevolution
    2025-04-08T19:05:45+08:002025-04-08T19:05:45+08:00

    过滤woocommerce_subscriptions_product_price_string_inclusions器仅允许您控制最终价格字符串中包含哪些部分,但不允许您轻松更改整个字符串或根据变化进行自定义。

    如果您想要真正改变价格字符串本身,您应该使用下面的代码。

    此过滤器允许您覆盖最终输出。以下版本可以满足您的需求,当选择 1 个月(单笔付款)选项时,会显示“全额付款”,而对于其他选项,则保留通常的“£xx / 月”。

    
    add_filter( 'woocommerce_subscriptions_product_price_string', 'custom_variable_subscription_price_string', 10, 2 );
    function custom_variable_subscription_price_string( $price_string, $product ) {
        if ( ! is_a( $product, 'WC_Product' ) ) {
            return $price_string;
        }
    
        if ( $product->is_type( 'variation' ) || $product->is_type( 'subscription_variation' ) ) {
            $subscription_length = method_exists( $product, 'get_subscription_length' ) ? $product->get_subscription_length() : 0;
            $subscription_period = method_exists( $product, 'get_subscription_period' ) ? $product->get_subscription_period() : '';
    
            if ( $subscription_length && $subscription_period ) {
                if ( intval( $subscription_length ) === 1 && strtolower( $subscription_period ) === 'month' ) {
                    $price_string = 'Pay in Full';
                }
            }
        }
    
        return $price_string;
    }
    
    • 0
  2. Best Answer
    OverdueOrange
    2025-04-08T21:06:27+08:002025-04-08T21:06:27+08:00

    这就是我让它工作的方式:我使用 javascript/jQuery,因为它可以工作,而不管 WooCommerce 内部类的差异。

    add_action('wp_footer', 'custom_replace_subscription_price_label');
    
    function custom_replace_subscription_price_label() {
        // Only run this script on single product pages
        if (!is_product()) return;
    
        // Output JavaScript to modify price display dynamically
        ?>
        <script type="text/javascript">
            jQuery(document).ready(function($) {
                // Hook into variation change event on product page
                $('form.variations_form').on('show_variation', function(event, variation) {
                    
                    // Find the price container
                    var $priceEl = $('.woocommerce-variation-price .price');
    
                    // If variation or price data is missing, stop here
                    if (!variation || !variation.price_html) return;
    
                    // Grab the HTML of the price string
                    const rawHTML = variation.price_html;
    
                    // If the price string contains "for 1 month", replace it
                    if (rawHTML.includes('for 1 month')) {
                        const updatedHTML = rawHTML.replace(/for 1 month/, 'Pay in Full');
                        
                        // Update the HTML in the DOM with the new version
                        $priceEl.html(updatedHTML);
                    }
                });
            });
        </script>
        <?php
    }
    
    //FOR CART & CHECKOUT
    
    // Modify the price column in the cart
    add_filter('woocommerce_cart_item_price', 'custom_replace_subscription_price_cart', 10, 3);
    
    // Modify the subtotal column in the cart
    add_filter('woocommerce_cart_item_subtotal', 'custom_replace_subscription_price_cart', 10, 3);
    
    function custom_replace_subscription_price_cart($price_html, $cart_item, $cart_item_key) {
        // Check if the price string contains "for 1 month"
        if (strpos($price_html, 'for 1 month') !== false) {
            // Replace it with "Pay in Full"
            $price_html = str_replace('for 1 month', 'Pay in Full', $price_html);
        }
    
        // Return the modified (or unmodified) price string
        return $price_html;
    }
    
    • 0

相关问题

  • 为 WooCommerce 上特定类别或多个类别的用户隐藏产品价格

  • 设置默认“管理库存?” 创建新变体时选择“是”(Woocommerce)

  • 使 WordPress 帖子标题包含使用 wp_insert_post() 创建的新帖子的 id

  • 著名的五分钟 WordPress 安装过程 网站迁移后

  • 我的 WordPress 网站上的输入/输出使用限制已达到最大值

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve