根据URL变量启用或禁用WooCommerce产品销售价格

如何解决根据URL变量启用或禁用WooCommerce产品销售价格

我正在尝试通过以下链接www.example.com?sale向进入网站的用户显示销售价格,并向其他用户显示正常价格。下面的代码完成了单个产品的工作,仅向具有此URL www.example.com?sale用户显示销售价格,但是在汽车上,其切换回常规价格。并且仅适用于单个产品。我是woocommerce和PHP的新手,希望有人可以帮我这个忙。非常感谢您的帮助!

function custom_wc_get_sale_price( $sale_price,$product ) {
    if (isset($_GET['sale'])) {
        return $sale_price;
} else {
        return $product->get_regular_price();
}

}
add_filter( 'woocommerce_product_get_sale_price','custom_wc_get_sale_price',50,2 );
add_filter( 'woocommerce_product_get_price',2 );

解决方法

您需要将此url变量设置为WC会话,以避免在更改网址时丢失该变量:

// Early enable guest customer WC_Session
add_action( 'init','wc_session_enabler' );
function wc_session_enabler() {
    if ( is_user_logged_in() || is_admin() )
        return;

    if ( isset(WC()->session) && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
}

// Get "sale" url variable and set custom WC session variable
add_action( 'init','enable_sale_to_wc_session' );
function enable_sale_to_wc_session() {
    if ( isset($_GET['sale']) ) {
        WC()->session->set('has_sale','1');
    }
}

// Enable sale price if it's set on products when 'sale' is as an URL variable
add_filter( 'woocommerce_product_get_price','enabling_sale_price',1000,2 );
add_filter( 'woocommerce_product_get_sale_price',2 );
add_filter( 'woocommerce_product_variation_get_price',2 );
add_filter( 'woocommerce_product_variation_get_sale_price',2 );
function enabling_sale_price( $price,$product ) {
    if ( isset($_GET['sale']) || WC()->session->get('has_sale') ) {
        return $price;
    } else {
        return $product->get_regular_price();
    }
}

// Remove custom WC session variable on thankyou page
add_action( 'woocommerce_thankyou','remove_enable_sale_from_wc_session' );
function remove_enable_sale_from_wc_session() {
    if ( WC()->session->get('has_sale') ) {
        WC()->session->__unset('has_sale');
    }
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?