【问题标题】:Wordpress Query Posts with Multiple Filters带有多个过滤器的 Wordpress 查询帖子
【发布时间】:2021-09-27 07:31:20
【问题描述】:

我正在使用 AJAX 按类别过滤帖子,效果很好。但是,当我尝试添加另一个过滤器以按名为专辑日期的自定义字段进行过滤时,我的原始类别过滤器不起作用。那里的每个过滤器都有自己的工作原理,但它们不能一起工作。这是精简后的代码。

我仍在学习这一切如何协同工作,因此我们将不胜感激!

PHP 代码

function my_filter_function(){

    // post date
    $args = array(
        'orderby' => 'date',
        'order' => $_POST['date']
    );

    // for taxonomies / categories
    if(isset($_POST['categoryfilter']))
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $_POST['categoryfilter']
            )
        );

    // album year
    if(isset($_POST['yearfilter']))
        $args = array(
            'meta_key'      => 'album_year',
            'meta_value'    => $_POST['yearfilter'],
        );

    $query = new WP_Query( $args );
    
    if( $query->have_posts() ) :
        while( $query->have_posts() ): $query->the_post();
            echo '<h1>' . $query->post->post_title . '</h1>';
            ...
        endwhile;
        wp_reset_postdata();
    else :
        echo 'No posts found';
    endif;
    
    die();
}

add_action('wp_ajax_myfilter', 'my_filter_function'); // wp_ajax_{ACTION HERE} 
add_action('wp_ajax_nopriv_myfilter', 'my_filter_function');

表格代码

<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
    <?php
        // Category Filter
        if($terms = get_terms(array('taxonomy' => 'category', 'orderby' => 'name'))) : 
            echo '<select name="categoryfilter"><option value="">Select category...</option>';
            foreach ( $terms as $term ) :
                echo '<option value="' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
            endforeach;
            echo '</select>';
        endif;
    ?>

    <?php 
        // Year Filter
        $posts = get_posts(array(
            'posts_per_page'    => -1,
            'post_type'         => 'post',
            'meta_key'          => 'album_year',
            'orderby'           => 'meta_value',
            'order'             => 'DESC'
        ));

        if( $posts ): 
            echo '<select name="yearfilter"><option value="">Select Year...</option>';
                foreach($posts as $post): 
                    $album_year = get_field('album_year');
                    echo '<option value="' . $album_year . '">' . $album_year . '</option>';
                endforeach;
            echo '</select>';
            
            wp_reset_postdata();
        endif; 
    ?>
    
    <label>
        <input type="radio" name="date" value="ASC" /> Date: Ascending
    </label>
    <label>
        <input type="radio" name="date" value="DESC" checked="checked" /> Date: Descending
    </label>
    
    <button>Apply filter</button>
    
    <input type="hidden" name="action" value="myfilter">
</form>

【问题讨论】:

    标签: php ajax wordpress filter


    【解决方案1】:

    我尚未测试此代码,但您似乎正在为 yearfilter 覆盖您的 args 变量。

    这个

    // album year
    if(isset($_POST['yearfilter'])) {
        $args = array(
            'meta_key'      => 'album_year',
            'meta_value'    => $_POST['yearfilter'],
        );
    }
    

    应该是这样的

    // album year
    if(isset($_POST['yearfilter'])) {
        $args['meta_key'] = 'album_year';
        $args['meta_value'] = $_POST['yearfilter'];
    }
    

    如果他们单独工作,这应该可以解决问题。

    【讨论】:

    • 嗯,只有在选择了类别和专辑日期时才有效。如果我只选择专辑日期,它不会返回任何内容。
    • 实际上这最终起作用了但是我必须添加一个条件来检查像这样的空帖子变量 if(isset($_POST['yearfilter']) && $_POST['yearfilter'] != "")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2013-02-05
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多