web-dev-qa-db-ja.com

ページ内でquery_postsをWP_Queryに変更しても機能なし

私はこのコードをpage.phpに持っています、そしてそれは私の家のためのテンプレート部分を呼び出します。 home.phpの中で私はWP_Queryの代わりにquery_postsを使い、それをWP_Queryに変えたいと思いました。

変更しようとしましたが、もう動作しません。

これは、query_postsを使った以前のコードです。

    $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;
        ?>

そしてこれはWP_Queryを使用して変換されたものですが動作しません:

    $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;

私が追加しようとしたとき:echo "count:"。$ custom_query-> found_posts

それは何も返しません。

出力例:(query_postsを使用して正しいもの) Correct output using query_posts

そしてこれがwp_queryを使って出てくるものです

enter image description here

何をしたらいいでしょう?コードに問題がありますか?私を助けてください。ありがとうございました。

1
karlo jay bueno

query_postsではなくWP_Queryで結果が得られる理由はありません。 query_postsWP_Queryを使用するので、両方とも同じように動作するはずです。

あなたのコードは本当に面倒であり、あなたはあなたのコードをデバッグするのを難しくする複数の構文を使っています。これは明らかなバグを隠し、不必要な野生のガチョウの追跡にあなたを本当に導きます。また、引数をデフォルト値で設定する必要はありません。

コードを読みやすく信頼性の高いものに書き換えてください。

/**
 * 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
}

生成されたSQLクエリを検査するためにecho $custom_query->requestを実行できます。あるいは、完全なクエリオブジェクトを検査するためにvar_dump( $custom_query )を実行できます。また、デバッグをオンにして明らかなバグを探す必要があります。

しかし、私が言ったように、query_postsが機能し、WP_Queryが機能しない理由はないはずです。

1
Pieter Goosen