it-swarm.com.ru

Использование нового WP_Query в шорткоде в настраиваемом поле приводит к тому, что основной контент поста не отображается

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

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

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

Я вполне уверен, что это связано с использованием 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
Rutwick Gangurde

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

0
helenhousandi