WordPress的条件标签(Conditional Tags)可以帮助我们确定处于WordPress什么类型的页面,例如是否处于首页、是否处于文章页面等等,还可以根据post ID进一步确认显示的页面,不过使用条件标签的使用位置需要特别注意。

最佳使用位置

条件标签是给模板用的,自然在模板文件中使用时百试不爽,除非用错了,否则不会出问题。

在functions.php中使用条件标签

如果你打开Conditional Tags的官方文档,立刻就能发现下面这段加粗的话

Warning: You can only use conditional query tags after the posts_selection action hook in WordPress (the wp action hook is the first one through which you can use these conditionals). For themes, this means the conditional tag will never work properly if you are using it in the body of functions.php, i.e. outside of a function.

表达了如下的意思:

  • 条件标签只能在posts_selection 这个action发生后才能安全使用
  • action的发生顺序在官网有一篇很好的解释>>
  • 第一个可以绝对安全使用条件标签的action是wp

这一位置在functions.php的body中使用条件标签通常是无效的

对于最后一条,也有例外,例如is_admin()这个条件标签就可以在functions.php的body中使用,判断当前页面是处于前台还是后台,而不是如其名字所示判断用户是否是管理员(用current_user_can()判断用户角色)。

哪个action发生后可以使用条件标签

实践中发现

在action pre_get_posts中可以使用如下条件标签

可以使用is_home()、is_single()、is_page()、is_category()等标签,除了is_home()其它标签都是可以用ID或slug作为参数进一步判断,但这种进一步判断在pre_get_posts这个action发生时是不会生效的,所以这个钩子里只能用条件标签简单的判断是处于哪种类型的页面,不能精确到ID。

pre_get_posts是在WordPress query查询前执行的,所以用这个钩子可以改变查询参数而不用担心将query_posts执行两遍

Exposes the query-variables object before a query is executed

用posts_selection以及它以后执行的action,都可以正常使用所有的条件标签。

 

3条留言

  1. 如果我想在让一个js文件只在主题里的特定页面加载,合理的方式是什么呢?
    在function.php中用wp_enqueue_scripts action调用一个加载js的函数,在函数里再用is_page(id)做条件判断么?
    谢谢!

    1. 抱歉,我知道问题在哪里了。
      我的主题中header.php 里面没有写 wp_head()

      1. 原来如此,顺便查下footer.php里有没有写wp_footer()吧。
        关于你说的哪里加载脚本合适的问题,你选择的钩子至少要满足两个条件:
        1. 在WordPress开始输出脚本之前告诉它你要加载什么
        2. 如果使用条件标签,那必须选择条件标签定义以后执行的钩子。
        满足条件且常用的有这几个
        pre_get_posts
        template_redirect
        wp_enqueue_scripts

        那么为什么要选wp_enqueue_scripts?因为这个钩子只在前台执行,你的脚本后台用不到,那当然不用让这个程序在后台也执行一遍了对吧。如果你没有is_page判断,那脚本被加载到后台,可能导致后台js错误呢。

评论功能已关闭