web-dev-qa-db-fra.com

WP_Query personnalisé ne renvoyant pas de résultats lors de l'interrogation d'un type d'article personnalisé

J'ai créé un type de message personnalisé appelé 'award':

function award_post_type() {

    $labels = array(
        'name' => 'Awards',
        'singular_name' => 'Award'
    );
    $args = array(
        'labels' => $labels, 
        'public' => true,
        'has_archive' => true,
        'supports' => array( 'title', 'editor', 'excerpt' )
    );
    register_post_type( 'award', $args );

}

add_action( 'init', 'award_post_type' );

Maintenant, je suis dans les archives de type de message de récompense et j'essaie d'afficher une liste de récompenses ordonnées dans les délais impartis (qui sont stockées dans un champ personnalisé). Les prochains articles doivent être chargés via AJAX en cliquant sur le bouton "Charger plus".

La première chose que j'ai faite a été de modifier la requête principale en utilisant pre_get_posts:

function order_by_deadline( $query ) {
    if ( ! is_admin() && is_post_type_archive( 'award' ) ) {
        if( $query->is_main_query() ) {
            $query->set( 'orderby', 'deadline' );
            $query->set( 'meta_key', 'deadline' );
        }
    }
}

add_action( 'pre_get_posts', 'order_by_deadline' );

Cela fonctionne bien. Mais lorsque je tente de charger les prochains messages en utilisant AJAX, aucun résultat n'est affiché . Voici l'action que je passe à l'appel AJAX, qui inclut le WP_Query personnalisé que j'ai créé pour appeler les nouveaux messages:

function load_next_awards() { 

    // The number of the page is received from an attribute of the Load More button. I'm 100% sure this has nothing to do with the issues I'm having, so just ignore it.
    $page = $_POST[ 'page' ]; 

    $args = array(
        'paged' => $page, 
        'post_type' => 'award',
        'post_status' => 'publish'
        'post__not_in' => get_option( 'sticky_posts' ),
        'orderby' => 'meta_value_num',
        'meta_key' => 'deadline'
    );

    $next_posts = new WP_Query( $args );  

    if( $next_posts->have_posts() ) :   
        while( $next_posts->have_posts() ) : the_post(); 
            get_template_part( 'views/post/content', get_post_format() );
        endwhile;
    endif;

    wp_reset_postdata();

    die();

} 

Je suis à court d'idées. Le WP_Query personnalisé me semble correct, mais il ne renvoie aucun résultat lorsque je clique sur "Charger plus". Si je change le paramètre post_type en post ou page à la place, il affiche correctement mes publications et mes pages.

1
grazianodev

J'ai trouvé la solution. Le problème était que j'avais un numéro différent pour le paramètre posts_per_page dans la requête initiale et dans la requête personnalisée que je crée via AJAX. Dans le code que j'ai fourni, posts_per_page n'y est même pas parce que j'utilise quelques classes imbriquées. J'ai donc posté une version simplifiée du code pour plus de simplicité. J'étais persuadé que les problèmes étaient liés aux types de publication personnalisés. Jamais pensé utiliser un posts_per_page différent risquerait de poser problème. Des excuses à ce sujet.

Donc oui, si vous rencontrez le même problème, assurez-vous que votre posts_per_page est le même pour toutes vos requêtes!

2
grazianodev

Essayez d’initialiser la publication avec $next_posts->the_post() au lieu de the_post(). the_post seul essaiera d'utiliser la requête principale et dans ce contexte, il n'en existe pas.

0
Welcher

Si vous utilisez AJAX, vous devez contrôler votre sortie pour "cracher" le contexte une seule fois. Et chaque fois que vous utilisez un élément de modèle ou toute autre fonction imprimant du contenu, celui-ci sera probablement imprimé plusieurs fois (en utilisant echo, _e ou même un balisage HTML).

Dans ce cas, vous devez utiliser le tampon de sortie. Fondamentalement, vous mettrez tout votre contenu dans cette mémoire tampon au lieu de l’imprimer et, après tout traitement, vous finirez par l’imprimer/imprimer.

Ici vous pouvez trouver une bonne référence pour l’utiliser et [ici la page de manuel PHP] à ce sujet 2 .

Vos fonctions ressembleraient à ceci:

function load_next_awards() { 

    // The number of the page is received from an attribute of the Load More button. I'm 100% sure this has nothing to do with the issues I'm having, so just ignore it.
    $page = $_POST[ 'page' ]; 

    $args = array(
        'paged' => $page, 
        'post_type' => array( 'award' ),
        'post_status' => 'publish'
        'post__not_in' => get_option( 'sticky_posts' ),
        'orderby' => 'meta_value_num',
        'meta_key' => 'deadline'
    );

    $next_posts = new WP_Query( $args );  

    if( $next_posts->have_posts() ) :   
        //initiates output buffer
        ob_start();
        while( $next_posts->have_posts() ) : $next_posts->the_post(); 
            get_template_part( 'views/post/content', get_post_format() );
        endwhile;

        // clean outbut buffer (ob) after assigning it's contents to a variable
        $html = ob_get_clean();
    endif;

    wp_reset_postdata();

    // echo cached html markup and leave function
    echo $html;

    die();

} 

Faites-moi savoir si cela aide.

0
Celso Bessa