Archivos dinámicos Ajax no muestran resultados correctos
Estoy desconcertado sobre por qué esto no muestra los resultados correctos. Al seleccionar solo el mes cuando hay 100 posts en el sitio, solo aparecen 3, pero si seleccionas la categoría y el mes, se muestran los correctos.
Aquí está la plantilla de archivos:
<div id="archive-browser">
<div>
<h4>Mes</h4>
<select id="month-choice">
<option val="no-choice"> — </option>
<?php wp_get_archives(array('type' => 'monthly', 'format' => 'option')); ?>
</select>
</div>
<div>
<h4>Categoría</h4>
<?php wp_dropdown_categories('show_option_none= -- ');?>
</div>
</div>
<div id="archive-wrapper">
<div id="archive-pot"></div>
</div>
Aquí está el obtenedor de archivos:
<?php
/*
Plantilla: Obtenedor de Archivos
*/
$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;'>Por favor selecciona arriba.</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="Miniatura del post" title="Miniatura del post" style="width: 35px;" /></td>
<td><a href='<?php the_permalink(); ?>'><?php the_title(); ?></a></td>
<td><?php comments_popup_link(' ', '1 Comentario', '% Comentarios'); ?></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;'>No se encontró nada.</td></tr>";
endif;
?>
</table>
Y finalmente el código 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;'>cargando...</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
});
}
});
});
});

esto es con lo que terminé y funciona muy bien.
parte de 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( '¡Vete!' );
$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 Comentarios', '1 Comentario', '% Comentarios'); ?></td>
<td><?php the_category();?>
</tr>
<?php
endwhile; else:
echo "<tr><td style='text-align: center; font-size: 15px; padding: 5px;'>No se encontró nada.</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');
parte de 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='Cargando contenido' title='Cargando contenido, por favor espere' /></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;">Por favor seleccione una opción.</td></tr></table>');
} else {
$("#archive-content").empty().html(data);
}
}
});
return false;
});
});

Va a ser difícil depurar algo así ya que no tengo tus datos en mi servidor, pero estás haciendo varias cosas que me parecen cuestionables.
Primero, estás usando query_posts
. No uses query_posts
.
Debe tenerse en cuenta que usar esto para reemplazar la consulta principal en una página puede aumentar los tiempos de carga, en el peor de los casos duplicando o más la cantidad de trabajo necesario. Aunque es fácil de usar, la función también es propensa a confusiones y problemas más adelante. Consulta la nota más abajo sobre advertencias para más detalles.
http://codex.wordpress.org/Function_Reference/query_posts (énfasis mío)
Segundo, estás ejecutando tu consulta antes de verificar si quieres ejecutar una consulta. Es decir, antes de esta línea:
<?php if (($year == '') && ($month == '') && ($cat == '-1')) { ?>
¿Por qué ejecutarías una consulta y luego verificarías si quieres decirle al usuario que no ha completado todos los requisitos para que la consulta se ejecute?
Tercero, esta condición...
if (($year == '') && ($month == '') && ($cat == '-1')) {
...es extraña. Será false
si $cat
está vacío. Presumiblemente, tu formulario establece ese valor en -1
, pero eso me lleva a...
Cuarto, parece que confías al 100% en los datos suministrados por el usuario. POST
no es más seguro (quizás un 1% más) que GET
. A menos que haya validación en algún lugar no publicado, un usuario malintencionado podría potencialmente introducir datos inseguros a través de esa consulta.
Quinto, no estás usando la API de AJAX y este es exactamente el tipo de cosas para las que está diseñada.
