返回

如何隐藏缺少自定义字段值的 WordPress 子类别和类别?

php

隐藏缺少自定义字段值的 WordPress 子类别和类别

简介

当 WordPress 类别和子类别的自定义字段为空时,它们会在前端显示为不美观且令人困惑的空空间。本文将深入探讨这个问题,并提供一个分步指南来解决它,从而增强网站的外观和可用性。

问题:空自定义字段值

当你希望仅在帖子的自定义字段不为空时显示类别和子类别时,就会出现此问题。然而,当前的情况是,类别和子类别都会显示,但子类别下方只是一个空空间(因为自定义字段应为空且应该为空)。

解决方案:自定义查询

为了隐藏缺少自定义字段值的类别和子类别,我们需要创建自定义查询。此查询将获取所有非空自定义字段值的类别和子类别。

步骤 1:理解问题

我们希望在子类别中仅显示具有有效自定义字段值的类别和子类别。然而,目前即使自定义字段值为空,也会显示这些类别和子类别。

步骤 2:创建自定义查询

我们需要创建一个自定义查询来检索具有非空自定义字段值的类别和子类别。以下是查询的代码:

function ow_categories_with_subcategories_and_posts( $taxonomy, $post_type ) {

    // 获取属于提供的分类法的顶级类别(没有父级的那些)
    $categories = get_terms( 
        array(
            'taxonomy'   => $taxonomy,
            'parent'     => 0,
            'orderby'    => 'term_id',
            'hide_empty' => true

        )
    );

    ?>
    <div class="accordions-container">
    <?php
        // 遍历所有类别以显示每个单独的类别
        foreach ( $categories as $category ) {

            $cat_name = $category->name;
            $cat_id   = $category->term_id;
            $cat_slug = $category->slug;

            ?>
    <div class="accordion-wrapper">
        <?php
            // 显示每个单独类别的名称
            echo '<h2><i class="fa-regular fa-lightbulb-on"></i> ' . $cat_name . '</h3>'; 


            // 获取属于当前类别的所有子类别
            $subcategories = get_terms(
                array(
                    'taxonomy'   => $taxonomy,
                    'parent'     => $cat_id, // <-- 父级是当前类别
                    'orderby'    => 'term_id',
                    'hide_empty' => true
                )
            );
            ?>
        <div class="subcategory-wrapper">
            <?php
                // 遍历所有子类别以显示每个单独的子类别
                foreach ( $subcategories as $subcategory ) {

                    $subcat_name = $subcategory->name;
                    $subcat_id   = $subcategory->term_id;
                    $subcat_slug = $subcategory->slug;
                    

                    $child_subcategories = get_terms(
                array(
                    'taxonomy'   => $taxonomy,
                    'parent'     => $subcat_id, // <-- 父级是当前类别
                    'orderby'    => 'term_id',
                    'hide_empty' => true
                )
            );
                    // 显示每个单独的子类别名称,带有 ID 和 Slug
                    echo '<button class="accordion">' . $subcat_name . '</button>';
                    echo '<div class="panel">';
?>
            <div>
                <?php
                    foreach ( $child_subcategories as $child_subcategory ) {

                    $child_subcat_name = $child_subcategory->name;
                    $child_subcat_id   = $child_subcategory->term_id;
                    $child_subcat_slug = $child_subcategory->slug;
                        
                        ?>
                <h4 class="accordian-child-subcategory"><?php echo $child_subcat_name ?></h4>

                <?php

                    // 获取属于此特定子类别的所有帖子
                    $posts = new WP_Query(
                        array(
                            'post_type'      => $post_type,
                            'posts_per_page' => -1, // <-- 显示所有帖子
                            'hide_empty'     => true,
                            'order'          => 'ASC',
                            'meta_query' => array(
                                array(
                                    'key' => 'specification_sheet',
                                    'value'   => '', 
                                    'compare' => '!='
                                )
                            ),
                            'tax_query'      => array(
                                array(
                                    'taxonomy' => $taxonomy,
                                    'terms'    => $child_subcat_id,
                                    'field'    => 'id'
                                )
                            )
                        )
                    );
                        
                        
                        // 如果此子类别中有可用帖子
                    if ( $posts->have_posts() ){

                            // 只要有帖子要显示
                            while ( $posts->have_posts() ): $posts->the_post();

                                // 显示每篇文章的标题和文章 ID
                                ?>
                <div class="post-loop-single">
                    <div class="post-loop-text">
                        <div class="post-loop-title">
                            <h3><?php the_title(); ?><?php if( get_field('discontinued')) {
                ?> - Discontinued<?php } else if(get_field('phasing_out')) { 
                ?> - Phasing Out<?php } ?></h3>
                            <div class="post-loop-spec-sheet"><a href="<?php the_field('specification_sheet'); ?>" target="_blank"><i class="fa-light fa-file-magnifying-glass"></i> Specification Sheet</a></div>

                        </div>
                    </div>
                </div>
                <?php

                            endwhile;
                            ?>

                <?php
                    
                    } else {
                        
                    }
                    
                    wp_reset_query();
                }
                
            
                    ?>
            </div>
            <?php echo '</div>'; 
                }
        ?>
        </div>
    </div>
    <?php
            
        }
        ?>
</div>
<?php

}
ow_categories_with_subcategories_and_posts( 'product-document-category', 'product-document' );
?>

步骤 3:应用查询

将自定义查询添加到你的主题或插件中,然后在模板文件中调用此函数。这将动态获取所有非空自定义字段值的类别和子类别,并以所需的格式显示它们。

结论

通过使用上述自定义查询,你可以有效地隐藏缺少自定义字段值的 WordPress 子类别和类别。这将显著提高网站的可用性和美观性,为访问者提供更愉快的体验。

常见问题解答

  1. 此方法是否适用于所有 WordPress 主题?

    是的,此方法适用于所有 WordPress 主题。

  2. 我可以使用此方法隐藏任何自定义字段值的类别和子类别吗?

    是的,你可以使用此方法隐藏任何自定义字段值的类别和子类别。只需将自定义字段的键替换为你的自定义字段的键即可。

  3. 此方法会影响网站的性能吗?

    通常不会。此方法使用了 WordPress 的内置函数,这些函数经过优化以实现高效。

  4. 我可以自定义此方法以满足我的特定需求吗?

    是的,你可以自定义此方法以满足你的特定需求。此方法易于自定义,你可以根据需要添加或删除代码。

  5. 此方法是否也适用于自定义分类法?

    是的,此方法也适用于自定义分类法。只需将“分类法”参数替换为你的自定义分类法的名称即可。