web-dev-qa-db-ja.com

カスタムフィールドでショートコードで新しいWP_Queryを使用すると、メインの投稿コンテンツが表示されない

新しいWP_Queryを使用して一覧表示しようとしているファイルのカスタム投稿タイプがあります。

メインの投稿コンテンツ内にショートコードを追加するとうまくいきます。ただし、ショートコードをカスタムフィールド(メインのコンテンツと一緒にページに表示するように設定したもの)に追加すると、メインのコンテンツは表示されなくなります。

"while ... have_posts()"と "endwhile"の行をコメントアウトすると、メインコンテンツが表示されます。ただし、1行おきにコメントアウトした後でも、「while」を削除しない限り、メインコンテンツは消えます。

WP_Queryを使用することに関係していることは間違いありません(どういうわけかループを乗っ取ってしまいます)。

足りないものはありますか。

これがショートコードです。

   function ia_news_display_test($atts){ // [ia_news cat='category' num='numbertodisplay']

extract(shortcode_atts(array(
        'cat' => 'any',
        'num' => '2',
        ), $atts));

$dirloop = new wp_query( array( 
    'post_type' => 'ia_news', 
    'category_name' => $cat,
    'posts_per_page' => $num,
    'orderby' => 'menu_order',
    'order' => 'ASC'
));

if ($dirloop->have_posts()){
    $content = "<ul class='ia_news_list'>\n";
    while ( $dirloop->have_posts() ) : $dirloop->the_post();
        $custom = get_post_custom($post->ID);
        $file_id = $custom["upload_file"][0];
        $file_begin = $custom["begin_date"][0];
        $file_end = $custom["end_date"][0];
        if ('' != $file_end){$file_end = " to ".$file_end;}
        $file_url = wp_get_attachment_url($file_id);

            if ('' != $file_url) { //CHECK FOR EXISTENCE OF FILE URL
               $content .= "<li class='ia_nl'><a href='".$file_url."'>".$cat." ".$file_begin.$file_end."</a></li>\n";
            }
    endwhile;
    $content .= "</ul>\n";
} else { $content = "nothing"; }

return $content;

}

1
jfacemyer

投稿の配列を返すget_postsを使用しています。投稿の配列はforeachを使用してループできますが、the_loopは使用できません。このバージョンのコードを試してください。

function ia_news_display_test($atts){ // [ia_news cat='category' num='numbertodisplay']

extract(shortcode_atts(array(
        'cat' => 'any',
        'num' => '2',
        ), $atts));

$dirloop = new WP_Query( array( 
    'post_type' => 'ia_news', 
    'category_name' => $cat,
    'posts_per_page' => $num,
    'orderby' => 'menu_order',
    'order' => 'ASC'
));

    if ($dirloop->have_posts())
    {
        $content = "<ul class='ia_news_list'>\n";
        while ( $dirloop->have_posts() ) : $dirloop->the_post();

            $file_id = get_post_meta(get_the_id(), "upload_file", true);
            $file_begin = get_post_meta(get_the_id(), "begin_date", true);
            $file_end = get_post_meta(get_the_id(), "end_date", true);

            if ('' != $file_end)
            {
                $file_end = " to ".$file_end;
            }
            $file_url = wp_get_attachment_url($file_id);

            if ('' != $file_url) 
            {   
                //CHECK FOR EXISTENCE OF FILE URL
                $content .= "<li class='ia_nl'><a href='".$file_url."'>".$cat." ".$file_begin.$file_end."</a></li>\n";
            }
        endwhile;
        $content .= "</ul>\n";
    } 
    else
    { 
        $content = "nothing";
    }
    wp_reset_postdata();

    return $content;
}

add_shortcode('ia_news_test', 'ia_news_display_test');

また、カスタムフィールド名がupload_fileである場合は、コードのようにロングカットをする代わりにget_post_metaを使用してみてください。

4

関数から戻る前にwp_reset_postdata()を使うべきです。 wp_reset_query()と似ていますが、$postの代わりにグローバル$wp_the_queryを復元します。

0
helenhousandi