AJAX动态档案未显示正确结果

时间:2013-06-24 作者:chrismccoy

我很困惑为什么这不能显示正确的结果,当选择一个月并说网站上有100篇帖子时,只有3篇出现,然后如果你选择了类别和月份,就会显示正确的结果。

这是存档模板

<div id="archive-browser">
<div>
<h4>Month</h4>

<select id="month-choice">
<option val="no-choice"> &mdash; </option>
<?php wp_get_archives(array(\'type\'    => \'monthly\', \'format\'  => \'option\')); ?>
</select>
</div>

<div>
<h4>Category</h4>

<?php wp_dropdown_categories(\'show_option_none= -- \');?> 
</div>
</div>

<div id="archive-wrapper">
<div id="archive-pot"></div>
</div>
这是档案获取者

<?php

/*
    Template Name: Archives Getter
*/

$year = trim($_POST[\'digwp_y\']);
$month = trim($_POST[\'digwp_m\']);
$cat = trim($_POST[\'digwp_c\']);
$querystring = "year=$year&monthnum=$month&cat=$cat&posts_per_page=-1";
query_posts($querystring); 

?>

<?php if (($year == \'\') && ($month == \'\') && ($cat == \'-1\')) { ?>

<table id="archives-table"><tr><td style=\'text-align: center; font-size: 15px; padding: 5px;\'>Please choose from above.</td></tr></table>

<?php } else { ?>

<table id="archives-table">
    <?php    
        if (have_posts()) : while (have_posts()) : the_post(); ?>
            <tr>
                <td><img src="<?php echo get_post_meta($post->ID, \'PostThumb\', true); ?>" alt="" style="width: 35px;" /></td>
                <td><a href=\'<?php the_permalink(); ?>\'><?php the_title(); ?></a></td>
                <td><?php comments_popup_link(\' \', \'1 Comment\', \'% Comments\'); ?></td>
                <td><?php the_date(\'m/j/Y\'); ?></td>
            </tr>
    <?php 
        endwhile; else:

            echo "<tr><td style=\'text-align: center; font-size: 15px; padding: 5px;\'>Nothing found.</td></tr>";

        endif; 
    ?>
</table>
最后是jquery代码

jQuery(function($) {
$("#archive-wrapper").height($("#archive-pot").height());
$("#archive-browser select").change(function() {
$("#archive-pot")
    .empty()
    .html("<div style=\'text-align: center; padding: 30px;\'>loading...</div>");

var dateArray = $("#month-choice").val().split("/");
var y = dateArray[3];
var m = dateArray[4];
var c = $("#cat").val();

$.ajax({
    url: "/archive-getter/",
    dataType: "html",
    type: "POST",
    data: ({
        "digwp_y": y,
        "digwp_m" : m,
        "digwp_c" : c
    }),
    success: function(data) {
        $("#archive-pot").html(data);
        $("#archive-wrapper").animate({
            height: $("#archives-table tr").length * 50
        });
    }
});
});
});

2 个回复
最合适的回答,由SO网友:chrismccoy 整理而成

这就是我最终得到的,效果很好。

功能。php部件

<?php

function scripts_enqueue() {
if(is_page(\'archives\')) {
    wp_enqueue_script(\'ajax_dropdown\', get_stylesheet_directory_uri() . \'/js/loadposts.js\',array(\'jquery\'));
    wp_localize_script( \'ajax_dropdown\', \'myajax\', array(\'custom_nonce\' => wp_create_nonce(\'nonce-ajax-dropdown\'), \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
}
}

add_action( \'wp_enqueue_scripts\', \'scripts_enqueue\' );

function wp_ajax_load_posts(){

if(!wp_verify_nonce( $_GET[\'_wpnonce\'], \'nonce-ajax-dropdown\'))
    die( \'Go away!\' );

$args = array(
    \'year\' => trim($_GET[\'year\']),
    \'monthnum\' => trim($_GET[\'month\']),
    \'posts_per_page\' => -1,
    \'orderby\' => \'date\',
    \'cat\' => trim($_GET[\'cat\'] != "-1") ? trim($_GET[\'cat\']) : 0,
);

$ajaxsort = new WP_Query($args);
?>
<table id="archives-table">
    <?php if ($ajaxsort->have_posts()) : while ($ajaxsort->have_posts()) : $ajaxsort->the_post();?>
            <tr>
                <td><a href=\'<?php the_permalink(); ?>\'><?php the_title(); ?></a></td>
                <td><?php the_time(\'m/j/Y\'); ?></td>
        <td><?php comments_popup_link(\'0 Comments\', \'1 Comment\', \'% Comments\'); ?></td>
        <td><?php the_category();?>
            </tr>
    <?php 
        endwhile; else:
            echo "<tr><td style=\'text-align: center; font-size: 15px; padding: 5px;\'>Nothing found.</td></tr>";
        endif; 
    ?>
</table>
<?php
    exit;
}

add_action(\'wp_ajax_load_posts\', \'wp_ajax_load_posts\');
add_action(\'wp_ajax_nopriv_load_posts\', \'wp_ajax_load_posts\');
jquery部件

jQuery(document).ready(function($) {
$("#archive-browser select").change(function() {
    $(".message").hide();
    $("#archive-content").empty().html("<div style=\'text-align: center; padding: 30px;\'><img src=\'http://i.imgur.com/TA3o5.gif\' /></div>");
    var date = $(\'#month-choice option:selected\').val();
    var dateArray = $("#month-choice").val().split("/");
    var year = dateArray[3];
    var month = dateArray[4];
    var cat = $(\'#cat\').val();
    $.ajax({
        url: myajax.ajaxurl,
        type: \'GET\',
        data: {
            action: \'load_posts\',
            _wpnonce: myajax.custom_nonce,
            cat: cat,
            month: month,
            year: year,
        },
        success: function(data) {
            if (date == \'no-choice\' && cat == "-1") {
                $("#archive-content").empty().html(\'<table class="message" id="archives-table"><tr><td style="text-align: center; font-size: 15px; padding: 5px;">Please choose from above.</td></tr></table>\');
            } else {
                $("#archive-content").empty().html(data);
            }
        }
    });
    return false;
});
});

SO网友:s_ha_dum

调试这样的东西会很困难,因为我的服务器上没有你的数据,但你做的几件事让我觉得很危险。

First, 您正在使用query_posts. 不使用query_posts.

应该注意的是,使用此replace the main query 在页面上可以increase page loading times, 在最坏的情况下more than doubling the amount of work needed or more. 虽然易于使用,但该功能prone to confusion and problems 过后有关详细信息,请参阅下面关于注意事项的注释。

http://codex.wordpress.org/Function_Reference/query_posts (重点矿山)

Second, 在检查是否要运行查询之前,您正在运行查询。也就是说,在这一行之前:

<?php if (($year == \'\') && ($month == \'\') && ($cat == \'-1\')) { ?>
为什么要运行一个查询,然后检查是否要告诉用户他们没有填写运行查询的所有要求?

Third, 这

if (($year == \'\') && ($month == \'\') && ($cat == \'-1\')) {
。。。是一种奇怪的情况。如果是false 如果$cat 为空。您的表单可能会将该值设置为-1 但这让我想到。。。

Fourth, 您似乎百分之百信任用户提供的数据。POST 不会比GET. 除非有未发布的验证,否则恶意用户可能会通过该查询推送不安全的数据。

Fifth, 您没有使用AJAX API 这正是它的目的。

结束

相关推荐

GET_NEXT_POSTS_LINK()在第4页停止显示

请先看一下此快速视频:http://www.screenr.com/8vSHThe problem: get_next_posts_link() 在第4页消失。也就是说,“转到旧帖子”链接会在我进入后消失&paged=4 我的博客。但是,我可以手动键入eg。&paged=5 我确实收到了第五页的帖子(也就是说,帖子在那里,但是get_next_posts_link() 只是没有出现)。So..<打印我的帖子总数会返回正确的数量(33),这告诉我所有帖子都被正确查询了</帖子和博