Ajax динамические архивы не показывают правильные результаты

24 июн. 2013 г., 13:22:37
Просмотры: 1.01K
Голосов: 1

Я в замешательстве, почему это не показывает правильные результаты. При выборе только месяца, когда на сайте 100 записей, отображаются только 3, но если выбрать категорию и месяц, то показываются правильные результаты.

Вот шаблон архивов:

<div id="archive-browser">
<div>
<h4>Месяц</h4>

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

<div>
<h4>Категория</h4>

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

<div id="archive-wrapper">
<div id="archive-pot"></div>
</div>

Вот обработчик архивов:

<?php
/*
    Шаблон: 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;'>Пожалуйста, выберите параметры выше.</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 комментарий', '% комментариев'); ?></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;'>Ничего не найдено.</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;'>загрузка...</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
        });
    }
});
});
});
0
Все ответы на вопрос 2
0

Вот что у меня получилось в итоге, и это отлично работает.

Часть functions.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( 'Уходи!' );

$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 комментариев', '1 комментарий', '% комментариев'); ?></td>
        <td><?php the_category();?>
            </tr>
    <?php 
        endwhile; else:
            echo "<tr><td style='text-align: center; font-size: 15px; padding: 5px;'>Ничего не найдено.</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' alt='Загрузка' title='Идёт загрузка данных' /></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;">Пожалуйста, выберите из списка выше.</td></tr></table>');
            } else {
                $("#archive-content").empty().html(data);
            }
        }
    });
    return false;
});
});
26 июн. 2013 г. 23:55:49
0

Будет сложно отладить что-то подобное, так как у меня нет ваших данных на моем сервере, но вы делаете несколько вещей, которые кажутся мне рискованными.

Во-первых, вы используете query_posts. Не используйте query_posts.

Следует отметить, что использование этой функции для замены основного запроса на странице может увеличить время загрузки страницы, в худшем случае более чем вдвое увеличивая объем необходимой работы или даже больше. Хотя эта функция проста в использовании, она также склонна к путанице и проблемам в дальнейшем. Подробности см. в примечании ниже о предостережениях.

http://codex.wordpress.org/Function_Reference/query_posts (выделено мной)

Во-вторых, вы выполняете запрос до того, как проверить, нужно ли его выполнять. То есть перед этой строкой:

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

Зачем выполнять запрос, а затем проверять, нужно ли сообщить пользователю, что он не заполнил все необходимые условия для выполнения запроса?

В-третьих, это условие...

if (($year == '') && ($month == '') && ($cat == '-1')) {

...выглядит странным. Оно будет false, если $cat пуст. Предположительно, ваша форма устанавливает это значение в -1, но это подводит меня к...

В-четвертых, вы, кажется, полностью доверяете данным, предоставленным пользователем. POST не намного (может быть на 1%) безопаснее, чем GET. Если где-то нет проверки (которая не показана в коде), злоумышленник может передать небезопасные данные через этот запрос.

В-пятых, вы не используете AJAX API, а это именно тот случай, для которого он предназначен.

24 июн. 2013 г. 17:59:08