wordpress查询(短代码)总是返回第一篇文章

时间:2012-04-22 08:26:23

标签: wordpress shortcode

我在我的插件中创建了一个短代码,效果很好。 短代码需要采用一些参数并创建一个带输出的自定义循环。

其中一个参数是输出循环的帖子数($ markers)

$args=array(
                'meta_key'=>'_mykey',
                'post_status'=>'publish',
                'post_type'=>'post',
                'orderby'=>'date',
                'order'=>'DESC',
                'posts_per_page'=>$markers,

);

  $wp_query = new WP_Query();
           $wp_query->query($args);

if ($wp_query->have_posts()) : while (($wp_query->have_posts()) ) : $wp_query->the_post();

// do the loop using get_the_id() and $post->id

endwhile;endif;
wp_reset_query();//END query

在结束时,我需要包含所有帖子($markers = '-1' )的数据,有时只需要一个($markers = '1' )或多个($markers = 'x')

所有这些都适用于单页/帖子 - 但我的问题是,当这个函数位于我有多个帖子(!is_single)和($ markers = '1')的地方时,它总会返回LATEST帖子的数据,而不是正确的帖子。 (例如在默认的wordpress主题中,它将显示10个帖子 - 它们都将是相同的数据)

这显然是$post->ID的一个问题 - 但在wp循环外进行自定义循环时如何才能拥有正确的帖子ID?

我试图通过

解决问题
global $post;
 $thePostIDtmp = $post->ID; //get the ID before starting new query as temp id
 $wp_query = new WP_Query();
 $wp_query->query($args);
// Start Custom Loop

if (!is_single()){
$post_id_t = $thePostIDtmp;}
else {
$post_id_t = $post->ID;}

然后使用$post_id_t - 但它似乎不起作用, 我应该不使用get_the_id()吗?或者我应该不使用查询(并使用get_posts)??

任何想法/解决方案/想法??

2 个答案:

答案 0 :(得分:1)

我会使用query_posts(http://codex.wordpress.org/Function_Reference/query_posts)而不是覆盖$ wp对象。您应该可以在页面上包含任意数量的循环。如果您遇到此问题,可以在致电之前使用:http://codex.wordpress.org/Function_Reference/wp_reset_query

我找到了这个:http://blog.cloudfour.com/wordpress-taking-the-hack-out-of-multiple-custom-loops/ 也消除了一些痛苦。

答案 1 :(得分:0)

WordPress中基本上有两种查询帖子:那些改变主循环和那些不改变主循环的帖子。如果要更改主循环(如用于显示类别归档页面的循环),请使用query_posts。它让你做到这一点。删除,更改和附加默认查询的参数以更改典型页面的结果。 query_posts虽然有一些drawbacks

然后有一些查询只是用来从数据库中取出东西来玩游戏,例如在侧栏或当前帖子的附件中显示最新的帖子标题。

为此,创建一个新的WP_Query对象,它将独立于主循环构建自定义循环,如下所示:

// The Query
$the_query = new WP_Query( $args );

// The Loop
while ( $the_query->have_posts() ) : $the_query->the_post();
    echo '<li>';
    the_title();
    echo '</li>';
endwhile;

// Reset Post Data
wp_reset_postdata();

然后有get_posts()就像WP_Query的小兄弟。在我看来,它有一个更简单的界面,并返回一个数组,结果更容易使用。 它看起来像这样:

$myposts = get_posts( $args );
foreach($myposts as $post) : setup_postdata($post);
     echo "<li>";
     the_title();
     echo "</li>";
endforeach;

在foreach模板中,像get_the_id()这样的标签可以正常工作。