Arhive dinamice Ajax nu afișează rezultate corecte
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"> — </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
});
}
});
});
});
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;
});
});

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.
