提问者:小点点

WordPress|PostQuery|查询帖子类别以创建子类别过滤器,并将其应用于我的函数文件中的Ajax过滤器


我正在努力让我的公文包页面的过滤器工作。我对WordPress有很好的了解,似乎不能。。。

目标:

>

  • 仅使用属于指定类别的子类别的类别创建筛选器。

    使用子类别过滤器中的选定选项将所选过滤器的相关帖子 Ajax 放入视图中。

    所以到相关的代码:

    我的投资组合页面成功从我的投资组合类别中提取帖子:

    <div class="portfolio-filters">
    
        <?php
        $filtercategory = get_template_directory() . "/template-parts/category-filter.php";
        include_once($filtercategory);
        ?>
    
    </div>
    
    <div class="portfolio-pieces">
    
        <div class="portfolio-pieces-inner">
    
            <div id="response">
    
                <!-- DEFAULT PORTFOLIO PAGE DISPLAY -->
                <?php
                $args = array(
                    'post_type' => 'post',
                    'post_status' => 'publish',
                    'category_name' => 'portfolio',
                    'posts_per_page' => '-1',
                    'orderby' => 'post_date',
                    'order' => 'DESC'
                ); ?>
    
                <?php $the_query = new WP_Query( $args ); ?>
    
                <?php while ($the_query -> have_posts()) : $the_query -> the_post(); ?>
    
                    <div class="portfolio-piece" <?php if(has_post_thumbnail()) : ?>style="background-image: url(<?php echo get_the_post_thumbnail_url(); ?>);"<?php endif; ?>>
                        <a href="<?php the_permalink(); ?>" class="box-link" target="_blank"></a>
    
                        <div class="portfolio-piece-hover">
    
                        </div>
    
                        <div class="portfolio-piece-inner">
                            <h4><?php the_title(); ?></h4>
                        </div>
                    </div>
    
                <?php
                    endwhile;
                    wp_reset_postdata();
                ?>
    
            </div>
    
        </div>
    
    </div>
    

    在上面的片段中,我调用了我的筛选器文件。创建响应区域并加载到公文包的完整列表中。

    我的类别筛选器文件如下所示:

    <form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
        <?php
            $args = array(
                'taxonomy' => 'category',
                'category_name' => 'portfolio-category',
                'orderby' => 'name',
                'order' => 'DESC',
                'parent' => 0
            ); 
            if( $terms = get_terms( $args ) ) :
                echo '<select name="categoryfilter"><option>Select category...</option>';
            foreach ( $terms as $term ) :
                echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
            endforeach;
                echo '</select>';
            endif;
        ?>
    
        <button>Apply filters</button>
        <input type="hidden" name="action" value="customfilter">
    </form>
    
    <script>
        jQuery(function($) {
            $('#filter').submit(function(){
                var filter = $('#filter');
                $.ajax({
                    url:filter.attr('action'),
                    data:filter.serialize(), // form data
                    type:filter.attr('method'), // POST
                    beforeSend:function(xhr){
                        filter.find('button').text('Applying Filters...');
                    },
                    success:function(data){
                        filter.find('button').text('Apply filters');
                        $('#response').html(data);
                    }
                });
                return false;
            });
        });
    </script>
    

    上面的片段“尝试”创建一个带有指向我的wp-admin文件夹中的admin-ajax. php文件的操作的表单(它在那里)。

    然后循环遍历我的get_terms参数,将我希望的子类别显示到下拉列表中,并带有应用按钮。

    最后一个片段处理这一切。根据按钮的状态更改按钮的文本,并将我的响应div作为返回位置。

    我的函数文件如下所示:

    /* Filter Post Results */
    function catfilter_filter_function(){
        $args = array(
            'orderby' => 'date', // we will sort posts by date
            'order' => $_POST['date'] // ASC or DESC
        );
    
        // for taxonomies / categories
        if( isset( $_POST['categoryfilter'] ) )
            $args['tax_query'] = array(
                array(
                    'taxonomy' => 'category',
                    'field' => 'id',
                    'terms' => $_POST['categoryfilter']
                )
            );
    
        $query = new WP_Query( $args );
    
        if( $query->have_posts() ) :
            while( $query->have_posts() ): $query->the_post();
    
                echo "<div class=\"portfolio-piece\" style=\"background-image: url(" . get_the_post_thumbnail_url() . ");\">";
    
                    echo "<a href=\"" . the_permalink() . "\" class=\"box-link\" target=\"_blank\"></a>";
    
                    echo "<div class=\"portfolio-piece-hover\">";
    
                    echo "</div>";
    
                    echo "<div class=\"portfolio-piece-inner\">";
    
                        echo "<h4>" . the_title() . "</h4>";
    
                    echo "</div>";
    
                echo "</div>";
    
            endwhile;
            wp_reset_postdata();
        else :
            echo 'No posts found';
        endif;
    
        die();
    }
    add_action('wp_ajax_customfilter', 'catfilter_filter_function');
    add_action('wp_ajax_nopriv_customfilter', 'catfilter_filter_function');
    /* END Filter Post Results */
    

    函数文件脚本工作将拉取过滤器中规定的帖子。

    有人能帮我缩小我的类别过滤器,只包含相关的子类别吗?-它们是“投资组合类别”类别的子类别,其中包含鼻涕虫“投资组合类别”

    我可以显示类别的完整列表,或者只显示基本父类别,而不是子类别。。。

    我的类别是这样设置的:

    — Portfolio Piece
    
    — — Portfolio Category
    
    — — — Automation
    
    — — — Design
    
    — — — Digital
    
    — — — Exhibitions
    
    — — — PR / Social
    
    — — — Strategy
    
    — — — Tech Insights
    
    — — Sector
    
    — — — Construction
    
    — — — Manufacturing
    
    — — — Oil & Gas
    
    — — — Science
    

    我从未尝试过50篇不同的文章,无论如何也无法缩小这个列表。

    提前表示衷心的感谢!


  • 共1个答案

    匿名用户

    您可以使用以下命令指定get_terms应该遍历的父级:

    parent => cat_ID
    

    其中cat_ID是类别的ID。

    您可以通过将鼠标悬停在类别列表中该类别的链接上,然后在浏览器左下角的链接注释中检查您将被定向到的URL,来找到类别ID。