如果条件,WordPress触发动作过滤器

时间:2015-09-13 07:52:43

标签: php wordpress

我正在尝试仅在function so_32165017_conditionally_remove_sidebar中添加一个正文类,如果条件触发器意味着说当删除操作在该时间删除侧栏时add_filter( 'body_class', 'my_class_names' );应该触发此添加过滤器但在我的情况下,如果我添加add_filter语句作为独立它是正常工作如果我添加相同的条件它不是,我在哪里出错我不确定,。

function so_32165017_get_product_cat_depth($catid)
{
    $depth = 0;
    while ($catid) {
        $cat = get_term_by('id', $catid, 'product_cat'); // get the object for the catid
        if ($cat->parent > 0) {
            $depth++;
        }
        $catid = $cat->parent; // assign parent ID (if exists) to $catid
// the while loop will continue whilst there is a $catid
    }
    return $depth;
}


add_action('woocommerce_before_main_content', 'so_32165017_conditionally_remove_sidebar');
/**
 * Hide the sidebar for items 2 levels deep or more
 */
function so_32165017_conditionally_remove_sidebar()
{
    if (is_product_category()) {
        $t_id = get_queried_object()->term_id;
        if (so_32165017_get_product_cat_depth($t_id) < 2) {

            remove_action('storefront_sidebar', 'storefront_get_sidebar', 10);

// ****when added hear it is not working ****??//
            add_filter('body_class', 'my_class_names');
        }
    }
}

添加课程代码:

// **** works fine hear ****//
add_filter( 'body_class', 'my_class_names' );

function my_class_names( $classes ) {
    // add 'class-name' to the $classes array
    $classes[] = 'My-Class';
    // return the $classes array
    return $classes;
}

2 个答案:

答案 0 :(得分:1)

您需要的是分别致电您的行动。你的行动woocommerce_before_main_content在身体类之后运行,因此在行动之后添加过滤器将不起作用。

add_action('woocommerce_before_main_content', 'so_32165017_conditionally_remove_sidebar');
function so_32165017_conditionally_remove_sidebar()
{
    if (is_product_category()) {
        $t_id = get_queried_object()->term_id;
        if (so_32165017_get_product_cat_depth($t_id) < 2) {
            remove_action('storefront_sidebar', 'storefront_get_sidebar', 10);
        }
    }
}

add_filter('body_class', 'my_class_names',10,2);
function my_class_names( $classes ) {
    if (is_product_category()) {
        $t_id = get_queried_object()->term_id;
        if (so_32165017_get_product_cat_depth($t_id) < 2) {
            $classes[] = 'My-Class';
        }
    }
    // return the $classes array
    return $classes;
}

答案 1 :(得分:0)

它不起作用,因为在调用woocommerce_before_main_content后触发了body_class()操作,因此您应该使用之前的操作。

或者您可以直接使用body_class过滤器:

add_filter('body_class', 'so_32165017_conditionally_remove_sidebar');
/**
 * Hide the sidebar for items 2 levels deep or more
 */
function so_32165017_conditionally_remove_sidebar( $classes )
{
    if (is_product_category()) {
        $t_id = get_queried_object()->term_id;
        if (so_32165017_get_product_cat_depth($t_id) < 2) {

            remove_action('storefront_sidebar', 'storefront_get_sidebar', 10);
            $classes[] = 'my_class_names';

        }
    }
    return $classes;
}