Использование нового запроса WP в шорткоде в настраиваемом поле приводит к тому, что основное содержимое публикации не отображается
У меня есть файлы пользовательского типа записей, которые я пытаюсь перечислить с помощью нового WP_Query.
Это отлично работает, когда я добавляю шорткод в основной контент поста. Однако, когда я добавляю шорткод в пользовательское поле (которое я настроил для отображения на странице вместе с основным содержимым в качестве дополнительного "столбца"), основное содержимое исчезает!
Если я закомментирую строки "while...have_posts()" и "endwhile", отобразится основное содержимое; однако даже после комментирования из каждой второй строки основное содержимое исчезает, если я также не удалю "в то время как".
Я почти уверен, что это связано с использованием 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;
}
3 answers
Вы используете 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
.
Попробуйте использовать wp_reset_query()
после цикла. Это должно сбросить ваш запрос. Дайте мне знать, работает это или нет.