Je suis perplexe sur la raison pour laquelle cela n’affiche pas les résultats corrects. Lorsque vous sélectionnez le mois seul et que 100 messages sont affichés sur le site, seuls 3 s'affichent, puis si vous sélectionnez la catégorie et le mois, le bon.
voici le modèle d'archives
<div id="archive-browser">
<div>
<h4>Month</h4>
<select id="month-choice">
<option val="no-choice"> — </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>
voici les archives getter
<?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>
et enfin le code 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
});
}
});
});
});
c'est ce que j'ai fini avec qui fonctionne bien.
partie 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( '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 part
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;
});
});
Il sera difficile de déboguer quelque chose comme cela car je n'ai pas vos données sur mon serveur, mais vous faites plusieurs choses qui me paraissent douteuses.
D'abord , vous utilisez query_posts
. Ne pas utiliser query_posts
.
Il convient de noter que l’utilisation de cette option pour remplacer la requête principale d’une page peut augmenter les temps de chargement de la page , dans le pire des cas plus que doubler la quantité de travail nécessaire ou plus . Bien que facile à utiliser, la fonction est également sujette à la confusion et à des problèmes par la suite. Voir la note ci-dessous sur les mises en garde pour plus de détails.
http://codex.wordpress.org/Function_Reference/query_posts (c'est moi qui souligne)
Deuxièmement , vous exécutez votre requête avant de vérifier si vous souhaitez exécuter une requête . C'est-à-dire avant cette ligne:
<?php if (($year == '') && ($month == '') && ($cat == '-1')) { ?>
Pourquoi devriez-vous exécuter une requête et vérifier ensuite si vous voulez indiquer à l'utilisateur qu'il n'a pas rempli toutes les conditions requises pour l'exécution de la requête?
Troisième , ceci ...
if (($year == '') && ($month == '') && ($cat == '-1')) {
... est une condition étrange. Si est false
si $cat
est vide. Vraisemblablement, votre formulaire attribue cette valeur à -1
mais cela m'amène à ...
Quatrième , vous semblez faire confiance aux données fournies par l'utilisateur à 100%. POST
n'est pas plus sécurisé (peut-être 1% de plus) que GET
. À moins d'une validation non postée, un utilisateur malveillant pourrait potentiellement envoyer des données non sécurisées via cette requête.
Cinquième , vous n'utilisez pas l'API AJAX et c'est exactement le genre de chose à laquelle il est destiné pour.