Используя новый WP_Query в shortcode в пользовательском поле заставляет основное содержание сообщения не отображаться

У меня есть пользовательский тип сообщения файлов, я пытаюсь перечислить использование нового WP_Query.

Это хорошо работает, когда я добавляю shortcode в основном содержании сообщения. Однако, когда я добавляю shortcode к пользовательскому полю (который я установил для отображения на странице наряду с основным содержанием как вторичный "столбец"), основное содержание исчезает!

Если я комментирую, "в то время как... have_posts ()" и "endwhile" строки, основное содержание отображается; однако, даже после комментирования любой строки, основное содержание исчезает, если я также не удаляю "в то время как".

Я вполне уверен, это имеет отношение к использованию WP_Query (так или иначе, это угоняет цикл), даже при том, что это не было должно.

Есть ли что-то, что я пропускаю?

Вот shortcode:

   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
04.03.2012, 03:29
3 ответа

Вы используете 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
19.02.2020, 22:49
  • 1
    YIKES! Я устал и вставил версию кода, с которым я играл вокруг. Я на самом деле использовал WP_Query, который вызвал проблему (я верю), таким образом, я начинал использовать функцию get_posts. Я попытаюсь вставить в Вашей версии для наблюдения то, что происходит. –  jfacemyer 04.03.2012, 03:24
  • 2
    СЛАДКИЙ! Интересно, использовало ли это get_post_meta... кажется, что это было всем, что было действительно изменено из моего исходного кода. Вы - бомба. Я дал бы Вам удар, если я мог ^^ –  jfacemyer 04.03.2012, 03:51
  • 3
    :), все еще изучая Хороший :) –  jfacemyer 09.03.2012, 03:50

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

0
19.02.2020, 22:49

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

-1
19.02.2020, 22:49
  • 1
    Код автора не изменяет основной запрос. Почему сброс должен сделать что-либо полезное? –  fuxia♦ 03.03.2012, 09:34
  • 2
    +1 @toscho. Если он использовал query_posts, wp_reset_query() было решение. –  Rutwick Gangurde 03.03.2012, 10:06
  • 3
    я верю этому, является истинным использующим новым wp_query также, так как он настраивает отдельный цикл, корректный? В любом случае я уже попробовал это (только, чтобы быть бесспорным) без успеха. –  jfacemyer 04.03.2012, 03:34

Теги

Похожие вопросы