GET_POSTS在页面模板中工作,但不在短码中工作

时间:2018-10-25 作者:Brad Ahrens

我正在尝试编写一个短代码,其中包括“get\\u posts”,以便获取博客帖子数据,然后在页面上显示最近的3篇文章。

此代码在模板中工作。然而,当我将其放入输出缓冲区(ob\\u start)内的短代码中时,它无法检索帖子。相反,它会获取当前页面本身并循环浏览该页面(在本例中为主页)。

你知道我怎样才能让它按照最初的意图在帖子中循环吗?

以下是在模板中工作的代码:

<?php $lastposts = get_posts( array(\'posts_per_page\' => 3) );?>
<?php if ( $lastposts ) {
    foreach ( $lastposts as $post ) :
        setup_postdata( $post ); ?>
        <div class="single_post" onclick="location.href = \'<?php the_permalink(); ?>\';">
            <div class="postbox" style="background-image: url(\'<?php echo catch_first_image() ?>\');">
                <div class="pink_cover">
                    <div class="text-center datebox">
                        <h5><?php the_time(\'j\'); ?></h5>
                        <hr>
                        <h6><?php the_time(\'M\'); ?></h6>
                        <h6><?php the_date(\'Y\'); ?></h6>
                    </div>
                </div>
            </div>
            <div class="row infobox">
                <div class="col-9">
                    <h3><a href="<?php the_permalink(); ?>"><?php the_category($separator = \', \'); ?></a></h3>
                    <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                </div>
                <div class="col-3 infobox-moreinfo">
                    <img src="more_info.png">
                </div>
            </div>
        </div>
    <?php endforeach; wp_reset_postdata(); } ?>
下面是一个短代码,虽然在页面上显示类似的内容,但它本身并不能检索博客帖子。

add_shortcode(\'home_blog\', function(){
    ob_start();
    ?>
        <?php $lastposts = get_posts( array(\'posts_per_page\' => 3) );?>
            <?php if ( $lastposts ) {
                foreach ( $lastposts as $post ) :
                    setup_postdata( $post ); ?>
                    <div class="single_post" onclick="location.href = \'<?php the_permalink(); ?>\';">
                        <div class="postbox" style="background-image: url(\'<?php echo catch_first_image() ?>\');">
                            <div class="pink_cover">
                                <div class="text-center datebox">
                                    <h5><?php the_time(\'j\'); ?></h5>
                                    <hr>
                                    <h6><?php the_time(\'M\'); ?></h6>
                                    <h6><?php the_date(\'Y\'); ?></h6>
                                </div>
                            </div>
                        </div>
                        <div class="row infobox">
                            <div class="col-9">
                                <h3><a href="<?php the_permalink(); ?>"><?php the_category($separator = \', \'); ?></a></h3>
                                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                            </div>
                            <div class="col-3 infobox-moreinfo">
                                <img src="more_info.png">
                            </div>
                        </div>
                    </div>
                <?php endforeach; wp_reset_postdata(); } ?>
        <?php
        $output = ob_get_clean();
        return $output;
});

1 个回复
最合适的回答,由SO网友:Antti Koskinen 整理而成

您的shortcode函数中的foreach循环之前可能缺少global$post。请参阅setup_postdata 法典条目。

结束