Использование нового запроса 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;

}

Author: jfacemyer, 2012-03-03

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 вместо того, чтобы делать длинный разрез, как это делает ваш код.

 4
Author: Rutwick Gangurde, 2012-03-03 05:17:02

Вы должны использовать wp_reset_postdata() перед выходом из функции. Аналогично wp_reset_query(), но восстанавливает глобальный $post вместо $wp_the_query.

 0
Author: helenhousandi, 2012-03-03 17:05:25

Попробуйте использовать wp_reset_query() после цикла. Это должно сбросить ваш запрос. Дайте мне знать, работает это или нет.

 -1
Author: prionkor, 2012-03-03 07:22:33