WordPress 根据页面模板做判断的折腾记录

» 2014-05-24 WordPress 35条评论

我们在制作 WordPress 主题时,页面比较丰富的设计,会针对很多页面写专门的页面模板,如 tpl-contact.php 专门给页面 contact 使用的模板。通常 WordPress 主题的头部和尾部内容相同的部分会用 header.php 和 footer.php 给其他模板文件直接调用,但有时我们的写的专门页面模板有些 header.php / footer.php 部分内容跟其他页面有点不同。

举个例子:还是刚才说的 tpl-contact.php,刚好使用 tpl-contact.php 作为模板的页面的 footer 部分有个电话号码,而默认的 page.php 和其他页面模板又不需要,虽然可以给 tpl-contact.php 复制一个 footer.php 改名为其他名(如 footer-contact.php)给 tpl-contact.php 专用(用 get_footer('contact') 调用),但这样好像有点小题大做了。

我以前不知道 WordPress 本身提供了一个函数来判断的,我用了比较麻烦的判断方法,在 footer.php 加了这样的判断来实现,经过比较“坎坷”……

从前有座山,山里有个庙,我用了『 get_page_template() 』函数:

if (is_page()){
	$page_tpl_name = get_page_template(); //获取模板文件全路径
	$page_tpl_name = split('/tpl-', $page_tpl_name); //分割,囧
	if ($page_tpl_name[1] == 'contact.php') {
		/* 显示电话号码 */
	}
}

自从庙里有个老和尚和小和尚后,我用了『 get_post_custom_values() 』来实现

if (is_page()){
	$page_tpl = get_post_custom_values('_wp_page_template'); //获取字段 _wp_page_template 的数组值
	if ( $page_tpl[0] == 'tpl-contact.php' ) { //判断第一个数组值(模板文件名)是否是 tpl-contact.php
		/* 显示电话号码 */
	}
}

当老和尚开始向小和尚讲故事的时候,我才知道 WordPress 本来就有个『 is_page_template() 』函数用来判断模板文件是否使用时,我立即打住老和尚讲无限循环的故事!

if ( is_page_template('tpl-contact.php') ) {
	/* 显示电话号码 */
}

注1:is_page_template 不能用在 loop 里面,如果之前有 loop,先在 loop 后面使用 wp_reset_query(),然后再使用 is_page_template
注2:如果模板文件在某个文件夹里,如 template/tpl-contact.php,那么这样 if ( is_page_template('template/tpl-contact.php') ) //需要wp3.4

具体参考 codex:http://codex.wordpress.org/Function_Reference/is_page_template

zww
or
oooo

“WordPress 根据页面模板做判断的折腾记录”有35条评论

  1. 大肥羊 says:

    沙发? :mrgreen:

    1. 大肥羊 says:

      @zwwooooo
      MikroTik RB951G-2HnD 你这个路由器在哪买的呢?

  2. aunsen says:

    这样做专题页面就方便多了

    1. zwwooooo says:

      @aunsen
      嗯,有时会有这种需要

  3. WP好多实用的函数~

  4. 甜菜 says:

    额...zww你太有爱了

    1. zwwooooo says:

      @甜菜
      这……指啥

  5. 西门 says:

    WP函数好多啊,第一次听这个,不过很有用

    1. 甜菜 says:

      @西门
      围观西门大叔的土豪Mac

    2. zwwooooo says:

      @西门
      函数太多,通常遇到需求才会去挖

  6. axiu says:

    好多和尚!

    1. zwwooooo says:

      @axiu
      你博客首页是故意的么?文章内容宽度

  7. 大发 says:

    我现在都是直接添加一个新query,不新建页面了,比较容易控制

    1. zwwooooo says:

      @大发
      新query?怎么用?没页面你怎么访问?

    2. 大发 says:

      @zwwooooo
      query_vars,就像分类页,标签页一样

  8. 竟然找不到留言页面。。。话说我记得这个评论框从侧栏移到正文部分有教程来着,怎么也找不到了

    1. zwwooooo says:

      @空空裤兜
      你是说评论跟随么?这个我没写吧

  9. Andrew says:

    主题改后,好看多了

  10. 郑永 says:

    这故事挺好,贯穿全文。

    1. zwwooooo says:

      @郑永
      这……如果有人有这个需求,希望别这样走弯路了,哈

  11. jalena says:

    我这里有个模版他是直接在function里面把模版全定义为hook,再用你的这个函数判断实现的!

  12. 536 says:

    版主,您左下部的Welcome很可爱,请教怎么实现的?
    还有,移动宽带访问不了贵站 :???:

    1. zwwooooo says:

      @536
      那个是读取浏览器 cookie 获取评论用户的邮箱,然后显示此邮箱的用户在我这里的评论
      移动宽带啊,没法照顾了,主机在香港

  13. WP就是一条学无止尽的路啊,又学到新东西了

  14. Demon says:

    对了.请教大叔一个问题. 我的音乐播放插件,在开启super cache之后就出现了无法获取虾米音乐列表的错误. 应该怎么解决呢?

    1. zwwooooo says:

      @Demon
      不清楚啊,没用过音乐播放器插件,硬要解决方法就是不要用缓存了,除非你博客访问量巨大……

    2. zwwooooo says:

      @Demon
      哦,可以考虑用 memcached 的缓存方式

  15. 博主,还是挺早以前,我在你网站看见左侧调用了外站一排的文章(还图文并茂),不知道能不能分享一下该如何折腾这种功能,试过用“WP_SimplePie_File”,但是只能得到标题,无法实现缩略图显示

    1. zwwooooo says:

      @亿品元素
      代码木有写成大众版,提供大概思路:用 rss 获取外站最新文章,然后就有标题、链接、文章摘录了,这些网上很多教程。如果要图片,就要在对方网站的 feed 里面加入文章图片的相关信息(如图片地址),然后用正则过滤出来。

  16. 用 rss 获取外站最新文章,这个确实网上有很多教程,现在就是不知道如何获取图片,或许你啥时候有空,折腾一文,教教大家?

    1. zwwooooo says:

      @亿品元素
      图片是这样的:你在 functions.php 自定义下feed输出,如 if (is_feed()) { //在content后面插入个图片地址 },然后获取此feed后,用正则过滤出图片地址来就行了

  17. 网盘街 says:

    wp自带的功能很丰富了,要养成经常查查codex的好习惯 :lol:

    1. zwwooooo says:

      @网盘街
      有时你需要时就找不到 :mrgreen:

回复给 网盘街 ¬
取消回复

昵称 *

网址

B em del U Link Code Quote