Arhive dinamice Ajax nu afișează rezultate corecte

24 iun. 2013, 13:22:37
Vizualizări: 1.01K
Voturi: 1

Sunt perplex de ce acest sistem nu afișează rezultatele corecte. Când selectez doar luna și există 100 de postări pe site, apar doar 3. Dar dacă selectez atât categoria cât și luna, atunci apar cele corecte.

Iată template-ul pentru arhive:

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

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

<div>
<h4>Categorie</h4>

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

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

Iată codul pentru preluarea arhivelor:

<?php
/*
    Template Name: Preluator Arhive
*/

$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;'>Te rugăm să alegi din opțiunile de mai sus.</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="Miniatură postare" style="width: 35px;" /></td>
                <td><a href='<?php the_permalink(); ?>'><?php the_title(); ?></a></td>
                <td><?php comments_popup_link(' ', '1 Comentariu', '% Comentarii'); ?></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;'>Nu s-a găsit nimic.</td></tr>";

        endif; 
    ?>
</table>

Și în final codul 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;'>se încarcă...</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
Toate răspunsurile la întrebare 2
0

acesta este rezultatul final cu care am rămas și care funcționează perfect.

partea din 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( 'Pleacă de aici!' );

$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 Comentarii', '1 Comentariu', '% Comentarii'); ?></td>
        <td><?php the_category();?>
            </tr>
    <?php 
        endwhile; else:
            echo "<tr><td style='text-align: center; font-size: 15px; padding: 5px;'>Nu s-a găsit nimic.</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');

partea 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;">Te rugăm să alegi de mai sus.</td></tr></table>');
            } else {
                $("#archive-content").empty().html(data);
            }
        }
    });
    return false;
});
});
26 iun. 2013 23:55:49
0

Va fi dificil să debughez ceva de genul acesta, deoarece nu am datele tale pe serverul meu, dar faci mai multe lucruri care mi se par riscante.

În primul rând, folosești query_posts. Nu folosi query_posts.

Trebuie menționat că utilizarea acestei funcții pentru a înlocui interogarea principală pe o pagină poate crește timpii de încărcare, în cele mai rele scenarii dublând sau chiar mai mult cantitatea de muncă necesară. Deși este ușor de utilizat, funcția este și predispusă la confuzii și probleme ulterioare. Consultați nota de mai jos pentru detalii.

http://codex.wordpress.org/Function_Reference/query_posts (sublinierile mele)

În al doilea rând, rulezi interogarea înainte să verifici dacă dorești să rulezi o interogare. Adică, înainte de această linie:

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

De ce ai rula o interogare și apoi să verifici dacă vrei să-i spui utilizatorului că nu a completat toate cerințele pentru ca interogarea să ruleze?

În al treilea rând, această condiție...

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

...este ciudată. Este false dacă $cat este gol. Presupun că formularul tău setează acea valoare la -1, dar asta mă aduce la...

În al patrulea rând, pari să ai încredere 100% în datele furnizate de utilizator. POST nu este mai sigur (poate cu 1%) decât GET. Dacă nu există validare undeva care nu este postată, un utilizator rău intenționat ar putea trimite date nesigure prin acea interogare.

În al cincilea rând, nu folosești API-ul AJAX, iar exact pentru asta a fost creat.

24 iun. 2013 17:59:08