Get_post()循环为每个帖子返回相同的the_title()

时间:2016-11-21 作者:Laef

我正在使用get_posts() 从特定类别获取帖子以显示在我的主页顶部,与主页主循环分离。除了标题(通过the_title()) 总是一样的;获取的第一篇文章的标题get_posts(). the_permalink() 也一样,但是the_excerpt() 返回每个帖子的正确结果。

以下是我的代码(我只删除了几行代码,以免无意中删除导致此问题的原因):

$query = get_posts(array(
    \'numberposts\'=>-1,
    \'category\'=>3
    ));
$events = array();

if ($query) {
    foreach ($query as $tpost) {
        $fields = get_post_custom($tpost->ID);
        if (isset($fields[\'event_start\'])) {
            $usetime = $fields[\'event_start\'][0];
            if (isset($fields[\'event_end\'])) {
                $usetime = $fields[\'event_end\'][0];
                }
            if ($usetime>time()) {
                $events[] = array("post"=>$tpost,"fields"=>$fields);
                }
            }
        }
    usort($events,function($a,$b){
        $a = $a[\'fields\'][\'event_start\'][0];
        $b = $b[\'fields\'][\'event_start\'][0];
        if ($a==$b) { return 0; }
        return ($a < $b) ? -1 : 1;
        });
    }

if (count($events)>0) { ?>
    <div class="pad10 tac">
    <h2 class="mar10">Upcoming Events</h2>
    <div class="tiles">
    <?php foreach ($events as $event ) { ?>
        <?php setup_postdata( $event[\'post\'] );?>
        <a href="<?php the_permalink(); ?>" class=\'noshow\'>
        <div class="tile smalltile"><div id=\'post-<?php the_ID(); ?>\'>
            <h2><?php the_title();?></h2>
            <b><?php
            echo(date_i18n("D, F j @ g:ia",$event[\'fields\'][\'event_start\'][0]));
            ?></b>
            <p><?php the_excerpt();?></p>
        </div></div>
        </a>
    <?php }?>
    </div></div>
<?php }?>
我真的很抓狂,尤其是因为这段代码在很大程度上是基于get_posts() 示例来自this article, 据报道,它在哪里工作良好。

我认为这可能与我使用setup\\u postdata有关,但我认为这只是胡乱猜测。

2 个回复
SO网友:Mark Kaplun

将米洛斯的评论变成答案。。。。

您面临的问题是许多面向wordpress模板的函数期望一些全局变量的结果。在里面WP_Query 通过调用the_post() 的方法WP_Query 对象,但具有get_posts 你需要打电话setup_postdata() 为此。

我个人的偏好是尽量避免像the_title 支持以下功能get_the_title, 尽可能接受显式post id。

SO网友:Santo Boldizar

使用setup_postdata() 为此。

Important setup_postdata() 不分配全局$post 所以你自己做这件事很重要。

Important 使用wp_reset_postdata() 在foreach循环之后。

有关更多信息,请访问:https://developer.wordpress.org/reference/functions/setup_postdata/

<?php
    // Get posts
    global $post;
    $posts = get_posts([
        \'post_type\' => \'post\',
        \'numberposts\' => 6
    ]);
?>

<?php foreach ($posts as $key => $post): ?>
    <?php setup_postdata($post); ?>
    <h3>
        <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
            <?php the_title(); ?>
        </a>
    </h3>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the