新しい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;
}
投稿の配列を返す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
を使用してみてください。
関数から戻る前にwp_reset_postdata()
を使うべきです。 wp_reset_query()
と似ていますが、$post
の代わりにグローバル$wp_the_query
を復元します。