web-dev-qa-db-fra.com

Ajax Dynamic Archives ne montre pas les résultats corrects

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"> &mdash; </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
        });
    }
});
});
});
1
chrismccoy

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;
});
});
1
chrismccoy

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.

0
s_ha_dum