web-dev-qa-db-fra.com

Remplacez query_posts par WP_Query dans la page mais ne fonctionne pas

J'ai ce code dans page.php et il appelle la partie modèle pour ma maison. À l'intérieur du home.php, j'ai utilisé query_posts au lieu de WP_Query et je voulais le changer en WP_Query.

J'ai essayé de le changer mais ça ne marche plus.

Ceci est le code précédent utilisant query_posts qui fonctionne:

    $args = array(
                'post_type' => 'post',     
                  "orderby"   => "date",
                  "order"     => "DESC",
                  "posts_per_page" => 24,
                'tax_query' => array(
                      'relation' => 'AND',
                               array(
                                 'taxonomy' => 'category',
                                 'terms' => 'uncategorized',
                                 'field' => 'slug'
                               ),
                           array(
                             'taxonomy' => 'creatives-content-types',
                             'terms' => 'newsfeed',
                             'field' => 'slug'
                           )
                        )
                    );
            query_posts($args);
            $count = 0;

            $html_col_o =  '<div>';
            $html_col_t =  '<div>';
            $html_col_th =  '<div>';
            while ( have_posts() ) : the_post();
                $count++;
                $image = get_field('featured_image', $post->ID);
                $size = 'large';            
                $image_url = $image['sizes'][$size];

                $description ="<h2>".get_the_title()."</h2>".get_field('description',$post->ID);
                if($count%3 == 1){
                    $html_col_o = $html_col_o. '<img src="'.$image_url.'" id="img-'.$count.'" data-count="'.$count.'" data-description="'.$description.'"/>';
                } else if($count%3 == 2){
                    $html_col_t = $html_col_t. '<img src="'.$image_url.'" id="img-'.$count.'" data-count="'.$count.'" data-description="'.$description.'"/>';
                } else if($count%3 == 0){
                    $html_col_th = $html_col_th. '<img src="'.$image_url.'" id="img-'.$count.'"  data-count="'.$count.'" data-description="'.$description.'"/>';
                }
            endwhile;

                $html_col_o =  $html_col_o.'</div>';
                $html_col_t =  $html_col_t.'</div>';
                $html_col_th =  $html_col_th.'</div>';
            echo $html_col_o.$html_col_t.$html_col_th;
        ?>

Et ceci est celui transformé en utilisant WP_Query mais ne fonctionne pas:

    $args = array(
                        'post_type' => 'post',     
                          "orderby"   => "date",
                          "order"     => "DESC",
                          "posts_per_page" => 24,
                        'tax_query' => array(
                              'relation' => 'AND',
                               array(
                                 'taxonomy' => 'category',
                                 'terms' => 'uncategorized',
                                 'field' => 'slug'
                               ),
                           array(
                             'taxonomy' => 'creatives-content-types',
                             'terms' => 'newsfeed',
                             'field' => 'slug'
                           )
                        )
                    );
            $custom_query = new WP_Query($args);
            $count = 0;

            $html_col_o =  '<div>';
            $html_col_t =  '<div>';
            $html_col_th =  '<div>';
            while ( $custom_query->have_posts() ) : $custom_query->the_post();
                $count++;
                $image = get_field('featured_image', $custom_query->$post->ID);
                $size = 'large';            
                $image_url = $image['sizes'][$size];

                $description ="<h2>".get_the_title()."</h2>".get_field('description',$custom_query->$post->ID);
                if($count%3 == 1){
                    $html_col_o = $html_col_o. '<img src="'.$image_url.'" id="img-'.$count.'" data-count="'.$count.'" data-description="'.$description.'"/>';
                } else if($count%3 == 2){
                    $html_col_t = $html_col_t. '<img src="'.$image_url.'" id="img-'.$count.'" data-count="'.$count.'" data-description="'.$description.'"/>';
                } else if($count%3 == 0){
                    $html_col_th = $html_col_th. '<img src="'.$image_url.'" id="img-'.$count.'"  data-count="'.$count.'" data-description="'.$description.'"/>';
                }
            endwhile;

                $html_col_o =  $html_col_o.'</div>';
                $html_col_t =  $html_col_t.'</div>';
                $html_col_th =  $html_col_th.'</div>';
            echo $html_col_o.$html_col_t.$html_col_th;

Quand j'ai essayé d'ajouter: echo "count:". $ Custom_query-> found_posts

ça ne retourne rien.

L'exemple de sortie: (corrigez en utilisant query_posts) Correct output using query_posts

Et voici ce qui sort en utilisant wp_query

enter image description here

Que vais-je faire? y a-t-il un problème avec mon code? Aidez-moi, s'il vous plaît. Je vous remercie.

1
karlo jay bueno

Il ne devrait y avoir aucune raison pour que vous obteniez des résultats avec query_posts et non avec WP_Query. query_posts utilise WP_Query, les deux doivent donc fonctionner de la même manière.

Votre code est vraiment en désordre et vous utilisez plusieurs syntaxes, ce qui rend votre code difficile à déboguer. Cela cache des bugs évidents et vous envoie vraiment sur des poursuites inutiles d'oie sauvage. De plus, il n'est pas nécessaire de définir des arguments avec ses valeurs par défaut.

Permet de réécrire votre code en quelque chose de plus lisible et plus fiable.

/**
 * Set the query arguments we will use to get posts by
 * Since PHP 5.4 we can use short array syntax, so we can use []
 * instead of array(). You should be on PHP 5.6 already and should not 
 * be using any version prior to 5.6
 */
$args = [ 
    'posts_per_page'   => 24,
    'suppress_filters' => true, // Do not let filters change the query
    'tax_query'        => [
        [ // Removed the relation as AND is default value
            'taxonomy' => 'category',
            'terms'    => 'uncategorized',
            'field'    => 'slug'
        ],
        [
            'taxonomy' => 'creatives-content-types',
            'terms'    => 'newsfeed',
            'field'    => 'slug'
        ]
    ]
];
$custom_query = new WP_Query($args);

if ( $custom_query->have_posts() ) { // Always first make sure you have posts to avoid bugs
    $count = 0;

    $html_col_o  = '<div>';
    $html_col_t  = '<div>';
    $html_col_th = '<div>';

    while ( $custom_query->have_posts() ) {
        $custom_query->the_post();

        $count++;
        $image     = get_field( 'featured_image', get_the_ID() ); // Use get_the_ID() for reliability

        if ( $image ) { //Make sure we have an image to avoid bugs or unexpected output
            $size      = 'large';           
            $image_url = $image['sizes'][$size];

            $description = '<h2>' . get_the_title() . '</h2>' . get_field( 'description', get_the_ID() ); // Again, use get_the_ID()

            if( $count%3 == 1 ) {
                $html_col_o  = $html_col_o  . '<img src="' . $image_url . '" id="img-' . $count . '" data-count="' . $count . '" data-description="' . $description . '"/>';
            } elseif( $count%3 == 2 ) {
                $html_col_t  = $html_col_t  . '<img src="' . $image_url . '" id="img-' . $count . '" data-count="' . $count . '" data-description="' . $description . '"/>';
            } elseif( $count%3 == 0 ) {
                $html_col_th = $html_col_th . '<img src="' . $image_url . '" id="img-' . $count . '" data-count="' . $count . '" data-description="' . $description . '"/>';
            }

        }
    }

    $html_col_o  = $html_col_o  . '</div>';
    $html_col_t  = $html_col_t  . '</div>';
    $html_col_th = $html_col_th . '</div>';

    echo $html_col_o . $html_col_t . $html_col_th;

    wp_reset_postdata(); // VERY VERY IMPORTANT, restes the $post global back to the main query
}

Vous pouvez maintenant faire echo $custom_query->request pour inspecter la requête SQL générée. Vous pouvez également utiliser var_dump( $custom_query ) pour inspecter l'objet de requête complet. Vous devez également activer le débogage et rechercher les bogues évidents.

Mais comme je l’ai dit, il ne devrait y avoir aucune raison pour que query_posts fonctionne et WP_Query non

1
Pieter Goosen