setup_postdata
setup_postdata 函数是 WordPress 中一个比较神奇的函数,能将对象变量声明到全局的$post
变量中,这样我们就可以像在主循环中为所欲为的使用模板标签了。
说这么多都只是空谈,setup_postdata这个函数平时我们很少用到,以至于目前为止我还没找到一个中文的介绍文章。
只是在其他文章中能找到只字片语,但因为确实很实用,所以就单独行文,备忘之。
setup_postdata 函数描述
英文版的我就不放了,
我的解释是:
将我们自定义查询的文章对象声明到全局$post
变量中,以便我们使用模板标签。
这里的查询变量我们需要从get_post()或是get_posts查询获得,当然只要是标准的文章对象,你都可以用setup_postdata来声明到全局去,不仅限于这两个函数。
使用
//获取全局变量, global $post; setup_postdata( $post );
官方的例子就是这么坑爹。
来一个复杂点的:
<ul> <?PHP //定义查询条件 $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); //获得查询文章(多篇) $myposts = get_posts( $args ); //遍历文章数组 foreach( $myposts as $post ) : setup_postdata($post); ?> setup_postdata( $post ); <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; //重置 算是setup_postdata( )的反函数wp_reset_postdata(); ?> </ul>
这样是不是就清晰多了?
再来一个例子吧,以下的例子源自 我目前用的主题的边栏的随机/最新 文章显示模块
function dw_side_post($i = 3) { global $post; $mylist = ''; $mytitle = is_single () ? '最新文章' : '随机推荐'; $posts = is_single () ? get_posts ( "numberposts={$i}&orderby=post_date" ) : get_posts ( "numberposts={$i}&orderby=rand" ); foreach ( $posts as $post ) { setup_postdata ( $post ); $mylist .= '<li><a href="' . get_permalink () . '">' . get_the_title () . '</a></li>'; } $output = '<div class="widget"><div class="title">' . $mytitle . '</div><ul>' . $mylist . '</ul></div>'; echo $output; }
注意
使用本函数的时候,请注意不要在主循环中使用,不然会达不到你预期的效果,
怎样退出循环,这个你可以在调用该函数不成功的时候去搜搜。