css 隐藏wordpress产品评级如果为空

p5fdfcr1  于 2023-01-22  发布在  WordPress
关注(0)|答案(1)|浏览(130)

我想隐藏评论为空的产品标题下面的星级。我想只隐藏星级,但不能留下新评论。我找到了一个类似的解决方案来隐藏不同的元素,并尝试采用它。
我使用一个snippets插件添加了这个,当评论为空时,在body_class中添加一个类“hide-empty-stars”。

function check_for_empty_stars( $classes ) {
    global $product;
    $id = $product->get_id();

    $args = array ('post_type' => 'product', 'post_id' => $id);    
    $comments = get_comments( $args );

    if(empty($comments)) {
        $classes[] = 'hide-empty-stars';
    }

    return $classes;
}
add_filter( 'body_class', 'check_for_empty_stars' );

然后使用css隐藏星级类

body.hide-empty-stars .star-rating{
    display: none;
}

它工作,但过了一段时间,我得到了一个严重的错误,日志说

mod_fcgid: stderr: PHP Fatal error: Uncaught Error: Call to a member function get_id() on null in /var/www/vhosts/my-domain.gr/httpdocs/wp-content/plugins/code-snippets/php/snippet-ops.php(505) : eval()'d code:3

是什么导致的?我的代码有什么问题吗?

a64a0gku

a64a0gku1#

当您不在产品页面时会发生这种情况。body_class在每个页面上运行,但有些页面没有帖子ID -例如类别页面。只有在定义了帖子ID的情况下才应运行代码段。假设您正在查看显示某个类别的页面-没有$product变量,但您试图在$product上调用get_id();,因此会出现错误。
也许可以尝试用if语句来 Package 它?

function check_for_empty_stars( $classes ) {
    global $product;
    if (!is_null($product)) {
        $id = $product->get_id();
    
        $args = array ('post_type' => 'product', 'post_id' => $id);    
        $comments = get_comments( $args );
    
        if(empty($comments)) {
            $classes[] = 'hide-empty-stars';
        }
    }
    
    return $classes;
}

add_filter( 'body_class', 'check_for_empty_stars' );

或者只是寻找只在产品页面上运行的过滤器。另外-你不需要任何插件,如代码片段。你可以只把这个代码放在你的child-theme的functions.php文件中。阅读有关child-theme的信息,如果你想修改主题,这些都是很好的,而且更新后你不会丢失你的更改。https://developer.wordpress.org/themes/advanced-topics/child-themes/

相关问题