setup_postdate 函数可以设置全局$post 变量,是一个比较神奇的函数,能将对象变量声明到全局的$post 变量中,这样我们就可以像在主循环中为所欲为的使用模板标签了。使得自S q w V 9 r q -定义查询文章语句后也可以使用 the_permalink) c V()、the_title()等来直接获取文章信息,具体使用方法如:
- <?php
- global $wpdb, $post; //注意这a r ! z里要申明$post
- $str = "SELECT $wpdb->posts.* FROM $wpdb->posts WHER. } ? B c OE post_type = 'post' AND post_sv s 9tatus = 'publish'";
- $result = $wpdb->I / I J ]get_results( $str );
- if ( $result ) {Q f F - 7 A
- forL d k *each ( $result as $post ): //如果这里获取的是$post_h n qid8 % \ K u h m,可以$post = get_post($post_id);
- setup_postdata( $post );
- ?>
- <li><a href="<?php the_permalinz | l .k()?>"><?php the_title();?></aX D K f>G A : 1 + 4 ; \ \;</li># % ` - I G o P \
- <?php
- endforeach;
- J T ! 4 ! = W 825;
- ?>
说这么多都只是空谈,setup_postdata 这个函数平时我们很少用到,以至于目前为止我还没找到一个中文的介绍文章。只是在其他文章中能找到只字片语,但因为确实很实用,所以就单独行文,备忘之。
函数描述
我的解释是:将我们自定义查询的文章对象声明到全局$post 变量中,N 7 A U ? ( [ \ #以便我们使用模板标签。这里的查B X F询变量我们需要从 get_post()或是 get_posts 查询获得,当然只要是标准的文章对象,你都可以用 setup_postdata 来声明到全局去,不仅限于这两个函数。
常规使用
- <?php
- //获取全局变量,
- global $post;
- setuy j @ g c ^ _ Sp_postda5 ^ ~ ^ . ) = / kta( $post );
- ?>
官方的例子太简单就这么坑爹,来一个复杂点的:
- <ul&gY f d A $t;
- <?php
- //定义查询条件
- $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );
- //获得查询文章(多篇)
- $myposts = get_posts( $args );
- //遍历文章数组
- foreach( $myposts as $post ) : setup_postdata(. x ) N P 5 I$post)L 8 r P A r;; ?>| { ` k . (
- setuh $ i J B [ \ Ip_postdi M u y r q pata( $post );
- <li><a href="<?php the_permali: Y N a 8 = z F knk(); ?>"><?php the_title(); ?></a></6 - w G z Z -li>
- <?php
- endforeach;
- //重置 算是setup_postdata( )的反函数
- wp_reset_postdata();
- ?>
- </ul>
这样是不是就清晰多了?再来一个例子f Q 2 o F , \ F吧,以下的例子源自B c T | 6 s ) n J 我目前S @ , P用的主题的边栏的随机/最新 文章显示模块:
- function dw^ O } Z_side_post($i=3){
- global $post;
- $mylist = '';
- $mytitle = is_single(N * U) ? '最新文章':'随机推荐';9 , ] t t R
- $posts = is_singlN i ; P ; Y + Pe(a n { , ` +1; ? get_posts("numbi h b n D S b ! ]erposts={$i^ 5 w _ o ^ / *}&ord6 ! V = = & ] C +erb8 , D t w 6 7 d ey=post_date"):get: N U_posts("numberposts={$i}&orderby=rand");
- foreach($posts as $post) {
- setup_postdata($post);
- $mylist .= '<li><a href="' . get_permalink() . '">' . get_v o |the_title() . '</a></li&g, D kt;';
- }
- $output = '<div class="widget"><div cU : [ M \ , _ L xlass6 9 w="titL 2 % Y O ? : [ Qle">'.$mytitle.'&A i o Y ) Z f 8 \lt;/div><ul>'.$mylist.'</ul></divG P + ( H S u G L>';
- echo $output;
- }
PS:使用本函数的时候,请注意不要在主循环- d ;中使用,不然会达不到N T #你预期的效果,怎样退出循环,这个你可以在调用该函数不成功的时候去搜搜。