AJAX filter posts by year

时间:2019-01-25 作者:desh

因此,我有一个HTML选择表单,允许用户选择2017年、2018年等年份

因此,我想要实现的是,当用户选择2017年时,2017年的帖子将加载到页面上。

我的过程是使用AJAX和WP\\U查询来实现这一点。

但是,我收到的错误是错误400错误请求。

因此,我们将非常感谢您提供的任何帮助。

Front end

<form action="<?php echo site_url()?>/wp-admin/admin-ajax.php" method="POST" id="filter>
   <select id="year"></select>
</form>
JS ajax请求

$.ajax({
    url : filter.attr(\'action\') ,
    data : filter.serialize() ,
    type : filter.attr(\'method\') ,
    success : function (response)
    {
        console.log(response)
    } ,
    error : function (request , status , error)
    {
        console.log(request.responseText)
        console.log(error)
    } ,
    headers: {
        \'Content-type\': \'application/x-www-form-urlencoded\'
    } ,
    datatype : \'xml\'
}).done(function () {
    console.log(\'ajax completed\')
})

functions.php

function filter_post_asb
{
    $args = array(
    \'cat\' => 43 ,
    \'year\' => $_POST[\'year\']
    );
    $query = new WP_Query($args);
    if ( $query -> have_posts()) :
    ?>
    <div class="container">
    <select id="year"></select>
    <ul class="slides">
        <?php while($query -> have_posts()) : $query -> the_post(); ?>
        <li>
            <img src="<?php bloginfo(\'template_url\')?>/images/logo.png" >
            <?php the_content(); ?>
            <h2><?php the_permalink();?></h2>
            <h4><?php the_title();?></h4>
        </li>
        <li>
            <?php the_post_thumbnail();?>
        </li>
        <?php endwhile ; ?>
        <?php wp_reset_postdata();?>
    </ul>
</div>
<?php
endif;
}

add_action(\'wp_ajax_filter\', \'filter_post_asb\');
add_action(\'wp_ajax_nopriv_filter\', \'filter_post_asb\');
再次感谢您提供的所有信息。

1 个回复
最合适的回答,由SO网友:Jaydip Nimavat 整理而成

尝试更改相应的代码:

Front end

<form action="<?php echo site_url()?>/wp-admin/admin-ajax.php" method="POST" id="filter>
   <select name="year"></select>
   <input type="hidden" name="action" value="filter" />
</form>
JS ajax请求

$.ajax({
    url : filter.attr(\'action\') ,
    data : filter.serialize() ,
    type : filter.attr(\'method\') ,
    success : function (response)
    {
        console.log(response)
    },
    error : function (request , status , error)
    {
        console.log(request.responseText)
        console.log(error)
    }
}).done(function () {
    console.log(\'ajax completed\')
})

functions.php

function filter_post_asb {

    ob_start()

    $args = array(
       \'cat\' => 43,
       \'year\' => $_POST[\'year\']
    );
    $query = new WP_Query($args);

    if ( $query -> have_posts()) : ?>
    <div class="container">
    <select id="year"></select>
    <ul class="slides">
        <?php while($query -> have_posts()) : $query -> the_post(); ?>
        <li>
            <img src="<?php bloginfo(\'template_url\')?>/images/logo.png" >
            <?php the_content(); ?>
            <h2><?php the_permalink();?></h2>
            <h4><?php the_title();?></h4>
        </li>
        <li>
            <?php the_post_thumbnail();?>
        </li>
        <?php endwhile ; ?>
        <?php wp_reset_postdata();?>
    </ul>
   </div>
   <?php
   endif;
   echo ob_get_clean();

   // OR
   // $html = ob_get_clean();
   // echo json_encode( array( \'html\' => $html ) );
   exit;
}

add_action(\'wp_ajax_filter\', \'filter_post_asb\');
add_action(\'wp_ajax_nopriv_filter\', \'filter_post_asb\');