在自定义字段中以短码形式使用新的WP_QUERY会导致不显示主要帖子内容

时间:2012-03-03 作者:jfacemyer

我有一个自定义的帖子类型的文件,我正试图使用一个新的WP\\u查询列出。

当我在主要帖子内容中添加短代码时,效果很好。然而,当我向自定义字段添加快捷码时(我已将其设置为与主要内容一起显示在页面上作为第二“列”),主要内容将消失!

如果我注释掉“while…have\\u posts()”和“endwhile”行,将显示主要内容;然而,即使在每隔一行注释完之后,主要内容也会消失,除非我也删除了“while”。

我很确定这与使用WP\\u查询有关(它以某种方式劫持了循环),尽管它不应该这样做。

我有什么遗漏吗?

以下是短代码:

   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 个回复
最合适的回答,由SO网友:Rutwick Gangurde 整理而成

您正在使用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 而不是像你的代码那样长时间的削减。

SO网友:helenhousandi

您应该使用wp_reset_postdata() 返回函数之前。类似wp_reset_query(), 但恢复了全球$post 而不是$wp_the_query.

SO网友:prionkor

尝试使用wp_reset_query() 循环之后。这将重置您的查询。让我知道它是否有效。

结束