基于过滤器向WooCommerce结账主体添加类

时间:2021-03-04 作者:Nik

如果签出包含订阅续订,我将尝试向签出页面添加一个类。Woocommerce提供wcs_cart_contains_renewal() 检查。我正在使用这段代码,但显然遗漏了一些东西,因为它不起作用。

$cart_items = wcs_cart_contains_renewal();
    if ( ! empty( $cart_items ) ) {

    add_filter( \'body_class\',\'my_body_classes\' );
    function my_body_classes( $classes ) {
        $classes[] = \'renewal-order\';
        return $classes;
    }
}
有什么帮助吗?

3 个回复
最合适的回答,由SO网友:Antti Koskinen 整理而成

正如@cjbj在评论中指出的,这可能是一个时间问题。这意味着与其直接将代码添加到functions.php 您需要将其包装在回调函数中,并将其附加到以后的触发操作。WordPress、主题和插件,loadsdoes 事情按一定的顺序进行。因此,需要为一些代码添加操作,以使其正确。

就我个人而言,我通常会补充body_class 过滤,如果它依赖于某些数据template_redirect在确定加载哪个模板之前激发)操作,以确保代码具有确定如何过滤类所需的所有数据。

// Hook anonymous callback to template_redirect action
add_action(
    \'template_redirect\',
    function(){
        // Get data
        $cart_items = wcs_cart_contains_renewal();
        // Check for truthy condition
        if ( $cart_items ) {
            // Hook anonymous callback to body_class filter
            add_filter(
                \'body_class\',
                function( $classes ) {
                    // Add additional class
                    $classes[] = \'renewal-order\';
                    return $classes;
                }
            );
        }
    }
);
如果愿意,可以使用命名回调而不是匿名回调

SO网友:cjbj

这个body_class 在内部调用筛选器function with the same name, 你的主题应该是这样的:<body <?php body_class(); ?>>

现在,您不清楚在哪里调用代码,但如果它没有附加到wp_head 或者在<head> 标记页面时,您正在向已调用的函数添加筛选器。结果什么也没发生。

SO网友:Nik

当我使用Antti的代码运行时,我确实设法让它工作。我认为我的初始代码的问题是需要将其包装在函数中。

function inline_css() {
    $cart_items = wcs_cart_contains_renewal();
    if ( ! empty( $cart_items ) ) {
    add_filter( \'body_class\',\'my_body_classes\' );
        function my_body_classes( $classes ) {
            $classes[] = \'renewal-order\';
        return $classes;
        }
    }

}
add_action( \'wp_head\', \'inline_css\', 0 );