可以在经典主题的模板文件中使用条件标记,以根据当前页面匹配的条件更改内容的显示。他们告诉WordPress在特定条件下显示什么代码。条件标记通常与 PHP 一起使用,如果 /else 条件语句。
代码首先检查语句是真还是假。如果发现该语句为 true,则执行第一组代码。如果为 false,则跳过第一组代码,并改为执行第二组代码(在其他代码之后)。
例如,您可以询问用户是否已登录,然后根据结果提供不同的问候语。
1
2
3
4
5
|
if ( is_user_logged_in() ): echo 'Welcome, registered user!' ; else : echo 'Welcome, visitor!' ; endif ; |
请注意,这些标签与WordPress模板层次结构密切相关。
在何处使用条件标记
要使条件标记修改数据,信息必须已从数据库中检索到,即查询必须已经运行。如果在有数据之前使用条件标记,则不会有任何可询问 if/else 语句的内容。
重要的是要注意WordPress在查询运行之前加载,因此,如果您只是在该文件中包含条件标记,它将不起作用。functions.php
实现条件标记的两种方法:
- 将其放在模板文件中
- 从中创建一个函数,该函数挂钩到稍后触发的操作/过滤器中
functions.php
条件
下面列出的是以下每个条件语句证明为真的条件。可以接受参数的标签被记录下来。
主页
当显示主博客页面时,此条件返回 true,通常按标准的时间倒序排列。如果您的主页已设置为静态页面,则只有在您在“阅读设置”中设置为“帖子页面”的页面上才会证明这是真的>。
首页
当显示网站的首页时,此条件返回 true,无论它是设置为显示帖子还是静态页面。
在以下情况下返回 true:
- 显示主博客页面,并且
- “阅读>设置 – >首页显示”选项设置为“您的最新帖子”
或
- 当“阅读 ->首页显示>设置”设置为“静态页面”和
- “首页”值是当前显示的页面。
管理面板
当显示仪表板或管理面板时,此条件返回 true。
单个帖子页面
显示任何单个帖子(或附件,或自定义帖子类型)时返回 true。如果您位于页面上,则此条件返回 false。
is_single( ’17’ )
is_single() 还可以按 ID 和其他参数检查某些帖子。当帖子 17 显示为单个帖子时,上述示例证明是正确的。
is_single( “爱尔兰炖菜” )
参数还包括帖子标题。在这种情况下,当标题为“爱尔兰炖菜”的帖子显示为单个帖子时,它被证明是正确的。
is_single( “炖牛肉” )
当带有Post Slug“炖牛肉”的帖子显示为单个帖子时,证明是正确的。
is_single( 阵列( 17, ‘炖牛肉’, ‘爱尔兰炖’ ) )
当显示的单个帖子是帖子 ID 17,或者post_name是“炖牛肉”,或者post_title是“爱尔兰炖菜”时,返回 true。
is_single( 阵列( 17, 19, 1, 11 )
当显示的单个帖子为帖子 ID = 17、帖子 ID = 19、帖子 ID = 1 或帖子 ID = 11 时,返回 true。
is_single( 阵列( “炖牛肉”, “豌豆汤”, “辣椒” )
当显示的单个帖子是post_name“炖牛肉”,post_name“豌豆汤”或post_name“辣椒”时,返回 true。
is_single( 阵列( “炖牛肉”, “豌豆汤”, “辣椒” )
当显示的单个帖子是post_title是“炖牛肉”,post_title是“豌豆汤”或post_title是“辣椒”时,返回 true。
注意:此功能不区分帖子 ID、帖子标题或帖子名称。如果请求的帖子 ID 为 17,则会显示名为“17”的帖子。据推测,对于带有鼻涕虫“17”的帖子也是如此。
单个帖子、页面或附件
对任何is_single、is_page和is_attachment返回 true。它确实允许测试帖子类型。
粘性帖子
如果已选中当前帖子的“将此帖子粘贴到首页”复选框,则返回 true。在此示例中,未给出任何 post ID 参数,因此使用 Loop 帖子的帖子 ID。
is_sticky( ’17’ )
当帖子 17 被视为粘性帖子时返回 true。
帖子类型
您可以通过在条件中包含get_post_type()来测试当前帖子是否属于某种类型。它实际上不是一个条件标记,但它返回当前帖子的已注册帖子类型。
如果 ( ‘book’ == get_post_type() ) …
如果给定的帖子类型是已注册的帖子类型,则返回 true。这不会测试帖子是否是某个post_type。注意:此函数替换了一个名为 is_post_type的函数,该函数在 3.0 开发中短暂存在。
帖子类型是分层的
is_post_type_hierarchical( $post类型 )
如果此 $post_type 在注册时已设置了分层支持,则返回 true。
is_post_type_hierarchical( “书” )
如果书籍帖子类型已注册为支持分层,则返回 true。
帖子类型存档
在任何帖子类型存档中返回 true。
is_post_type_archive( $post类型 )
如果在与 $post_type 匹配的帖子类型存档页面上返回 true(可以是单个帖子类型或帖子类型数组)。
要打开帖子类型存档,请在注册帖子类型时使用“has_archive”=> true。
任何包含帖子的页面
当允许在WordPress循环中处理当前帖子的评论时。
当在WordPress循环中处理当前帖子时允许ping。
“页面”页面
本节指的是WordPress页面,而不是您博客中的任何通用网页,换句话说,是指内置post_type“页面”。
显示任何页面时。
is_page( ’42’ )
显示第 42 页 (ID) 时。
is_page( ‘About Me and Joe’ )
当显示包含“关于我和乔”post_title的页面时。
is_page( “关于我” )
当显示包含“关于我”的post_name(信息区)的页面时。
is_page( array( 42, ‘about-me’, ‘About Me and Joe’ ) )
当显示的 Pages 文稿 ID = 42,或者post_name是“关于我”,或者post_title是“关于我和 Joe”时,返回 true。
is_page( 阵列( 42, 54, 6 )
当显示的主页 ID = 42、帖子 ID = 54 或帖子 ID = 6 时,返回 true。
测试分页
您可以使用此代码检查您是否位于帖子或已使用 QuickTag 划分为多个页面的页面的第 n 页上。这可能很有用,例如,如果您希望仅在分为几个页面的帖子的第一页上显示元数据。<!--nextpage-->
示例 1
1
2
3
4
5
6
|
<?php $paged = $wp_query ->get( 'page' ); if ( ! $paged || $paged < 2 ) { // This is not a paginated page (or it's simply the first page of a paginated page/post) } else { // This is a paginated page. } ?> |
示例 2
1
2
3
4
5
6
|
<?php $paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false; if ( $paged == false ) { // This is not a paginated page (or it's simply the first page of a paginated page/post) } else { // This is a paginated page. } ?> |
子页面测试
没有函数,但你可以用一点代码来测试它:is_subpage()
片段 1
1
2
3
4
5
6
7
|
<?php global $post ; // if outside the loop if ( is_page() && $post ->post_parent ) { // This is a subpage } else { // This is not a subpage } ?> |
您可以使用代码片段 2 中的代码创建自己的 is_subpage() 函数。将其添加到函数.php文件中。它以与代码段 1 相同的方式测试父页面,但如果存在父页面,则返回父页面的 ID,如果没有父页面,则返回 false。
片段 2
1
2
3
4
5
6
7
8
9
10
|
function is_subpage() { global $post ; // load details about this page if ( is_page() && $post ->post_parent ) { // test to see if the page has a parent return $post ->post_parent; // return the ID of the parent post } else { // there is no parent so ... return false; // ... the answer to the question is false } } |
如果您计划频繁测试子页面,建议使用类似于代码段 2 中的函数,而不是使用像代码段 1 这样的简单测试。
要测试页面的父级是否为特定页面,例如“关于”(默认情况下页面 ID pid 2),我们可以使用代码片段 3 中的测试。这些测试检查我们是否正在查看有问题的页面,以及我们是否正在查看任何子页面。这对于设置特定于网站不同部分的变量非常有用,因此可以使用不同的横幅图像或不同的标题。
片段 3
1
2
3
4
5
6
7
8
9
10
11
|
<?php if ( is_page( 'about' ) || '2' == $post ->post_parent ) { // the page is "About", or the parent of the page is "About" $bannerimg = 'about.jpg' ; } elseif ( is_page( 'learning' ) || '56' == $post ->post_parent ) { $bannerimg = 'teaching.jpg' ; } elseif ( is_page( 'admissions' ) || '15' == $post ->post_parent ) { $bannerimg = 'admissions.jpg' ; } else { $bannerimg = 'home.jpg' ; // just in case we are at an unclassified page, perhaps the home page } ?> |
代码段 4 是一个函数,可让您更轻松地执行上述测试。如果我们正在查看有问题的页面(因此“关于”)或其子页面之一(因此具有ID为“2”的父页面),则此函数将返回true。
片段 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function is_tree( $pid ) { // $pid = The ID of the page we're looking for pages underneath global $post ; // load details about this page if ( is_page( $pid ) ) return true; // we're at the page or at a sub page $anc = get_post_ancestors( $post ->ID ); foreach ( $anc as $ancestor ) { if ( is_page() && $ancestor == $pid ) { return true; } } return false; // we aren't at the page, and the page is not an ancestor } |
将 Snippet 4 添加到函数.php文件,然后调用 is_tree( ‘id’ ) 以查看当前页面是该页面,还是该页面的子页面。在第3段,is_tree(’2’)将“is_page(’关于’))||’”2′ == $post->post_parent“ 在第一个 if 标签内。
请注意,如果您有多个级别的页面,则父页面是正上方的页面,而不是位于层次结构最顶部的页面。
是页面模板
允许您确定您是否在页面模板中,或者是否正在使用特定的页面模板。
是否正在使用页面模板?
is_page_template( “大约.php” )
页面模板是否“关于”正在使用?请注意,与其他条件不同,如果要指定特定的页面模板,则需要使用文件名,例如 about.php 或 my_page_template.php。
注意:如果文件位于子目录中,则还必须包含此文件。这意味着这应该是与您的主题以及文件名相关的文件路径,例如“页面模板/关于.php”。
类别页面
显示类别存档页面时。
is_category( ‘9’ )
当显示类别 9 的存档页面时。
is_category(“臭奶酪”)
当显示名称为“臭奶酪”的类别的存档页面时。
is_category( “蓝纹奶酪” )
当显示带有类别 Slug “blue-cheese” 的类别的存档页面时。
is_category( 阵列( 9, “蓝纹奶酪”, “臭奶酪” )
当显示的帖子类别为 term_ID 9 或鼻涕虫“蓝纹奶酪”或名称为“臭奶酪”时,返回 true。
in_category( ‘5’ )
如果当前帖子位于指定的类别 ID 中,则返回 true。
in_category( 阵列( 1, 2, 3 )
如果当前帖子属于类别 1、2 或 3,则返回 true。
!in_category( 阵列( 4, 5, 6 )
如果当前帖子不在类别 4、5 或 6 中,则返回 true。请注意 !在开始时。
注意:请务必在测试时检查拼写。“is”或“in”之间有很大的区别。
另请参见is_archive() 和类别模板。
标记页
显示任何标签存档页面时。
is_tag( “温和” )
当显示带有“轻度”信息区的标签的归档页面时。
is_tag( 阵列( “锐利”,“温和”, “极端” )
当显示的标记存档具有“锐”、“温和”或“极端”的辅助信息时,返回 true。
当前帖子具有标记时。必须在循环中使用。
has_tag( “温和” )
当当前帖子的标签为“轻度”时。
has_tag( 阵列( “锐利”,“温和”, “极端” )
当当前帖子在数组中具有任何标记时。
另请参阅is_archive() 和标签模板。
分类页面
显示任何分类存档页面时。
is_tax( “风味” )
当显示变种分类的分类存档页面时。
is_tax(“味道”,“温和”)
当显示带有“温和”蛞蝓的口味分类的存档页面时。
is_tax( “味道”, 阵列( “尖锐”,“温和”, “极端” )
当显示的口味分类存档具有“锐利”、“温和”或“极端”的辅助信息时,返回 true。
检查当前帖子是否有任何给定的条款。第一个参数应为空字符串。它需要一个分类 slug/name 作为第二个参数。
has_term( “绿色”, “颜色” )
当当前帖子具有分类“颜色”中的术语“绿色”时。
has_term( 阵列( “绿色”, “橙色”, “蓝色” ), “颜色” )
当前帖子在数组中具有任何术语时。
另请参见 is_archive() 。
已注册的分类法
当通过register_taxonomy()注册特定分类时。以前is_taxonomy(),在 V3.0 中已不推荐使用
作者页面
显示任何“作者”页面时。
is_author( ‘4’ )
当显示作者编号 (ID) 4 的存档页面时。
is_author( 薇薇安 )
当显示昵称为“薇薇安”的作者的存档页面时。
is_author( “约翰-琼斯” )
当显示具有 Nicename “john-jones” 的作者的存档页面时。
is_author( array( 4, ‘john-jones’, ‘Vivian’ ) )
当作者的存档页面是用户 ID 4,或者user_nicename“john-jones”或昵称“Vivian”
另请参见is_archive() 和作者模板。
多作者网站
当多个作者为某个网站发布帖子时。随版本 3.2 一起提供。
日期页面
当显示任何基于日期的存档页面时(即每月、每年、每天或基于时间的存档)。
显示年度存档时。
显示每月存档时。
显示每日存档时。
当显示每小时、“分钟”或“第二”存档时。
如果今天是新的一天,根据发布日期。应在循环内部使用。
任何存档页面
显示任何类型的“存档”页面时。类别、标签、作者和基于日期的页面都是存档类型。
搜索结果页
显示搜索结果页存档时。
A 404 未找到页面
当页面在“HTTP 404:未找到”错误后显示时。
隐私政策页面
显示“隐私策略”页时。
附件
显示帖子或主页的附件文档时。附件是通过帖子编辑器的上传实用程序上传的图像或其他文件。附件可以显示在自己的“页面”或模板上。
单页、单篇文章或附件
当以下任一项返回 true 时:或 。is_single()
is_page()
is_attachment()
is_singular( “书” )
查看“自定义帖子类型”图书的帖子时为 True。
is_singular( 阵列( “报纸”, “书” )
查看“自定义帖子类型”报纸或书籍的帖子时为 True。
联合供稿
当请求的站点是联合时。此标记通常不由用户使用;它由WordPress内部使用,可供插件开发人员使用。
引用通告
当请求的网站是WordPress的钩子进入其Trackback引擎时。此标记通常不由用户使用;它由WordPress内部使用,可供插件开发人员使用。
预览
在“草稿”模式下查看正在显示的单个帖子时。
有摘录
当前帖子有摘录时
has_excerpt( 42 )
当帖子 42 (ID) 有摘录时。
1
2
3
4
5
6
7
|
<?php // Get $post if you're inside a function global $post; if ( empty ( $post ->post_excerpt ) ) { // This post has no excerpt } else { // This post has excerpt } ?> |
其他用途
当您需要隐藏自动显示的摘录并仅显示帖子的摘录时。
1
2
3
4
5
6
7
|
<?php if ( ! has_excerpt() ) { echo '' ; } else { the_excerpt(); } ?> |
替换文本或代码的自动摘录。
1
2
3
|
<?php if ( ! has_excerpt() ) { // your text or code } ?> |
分配了导航菜单
已注册的导航菜单位置是否分配了菜单
返回:已分配(真)或不(假)
循环内部
检查您是否处于“循环内”。对于插件作者很有用,当您在循环中时,此条件返回为 true。
边栏处于活动状态
检查给定的边栏是否处于活动状态(正在使用中)。如果边栏(由名称、id 或数字标识)正在使用中,则返回 true,否则函数返回 false。
网络的一部分(多站点)
检查当前站点是否在WordPress MultiSite安装中。
主站点(多站点)
确定站点是否为网络中的主站点。
网络管理员(多站点)
确定用户是否为网络(超级)管理员。
活动插件
检查插件是否已激活。
儿童主题
检查子主题是否正在使用中。
主题支持功能
检查是否存在各种主题功能。
工作实例
下面是演示如何使用这些条件标记的工作示例。
单柱
此示例演示如何仅在查看单个帖子页面时使用来显示特定内容:is_single()
1
2
3
4
5
|
if ( is_single() ) { echo 'This is just one of many fabulous entries in the ' . single_cat_title() . ' category!' ; } |
如何在循环中使用条件标记的另一个示例。选择在索引中显示内容或摘录.php当这是显示单个帖子或主页时。
1
2
3
4
5
6
7
8
9
10
|
if ( is_home() || is_single() ) { the_content(); } else { the_excerpt(); } |
当您需要显示代码或元素时,请在不是主页的位置显示。
1
2
3
4
5
|
<?php if ( ! is_home() ) { // Insert your markup ... } ?> |
检查多个条件
可以使用 PHP 运算符在单个 if 语句中计算多个条件。
如果您需要检查条件组合的计算结果是否为 true 或 false,这将非常方便。
1
2
3
4
5
6
7
8
|
// Check to see if any of 2 conditionals are met if ( is_single() || is_page() ) { // If it's a single post or a single page, do something special } if ( is_archive() && ! is_category( 'nachos' ) ) { // If it's an archive page for any category EXCEPT nachos, do something special } |
1
2
3
4
5
6
7
8
9
10
11
12
|
// Check to see if 3 conditionals are met if ( $query ->is_main_query() && is_post_type_archive( 'products' ) && ! is_admin() ) { // If it's the main query on a custom post type archive for Products // And if we're not in the WordPress admin, then do something special } if ( is_post_type_archive( 'movies' ) || is_tax( 'genre' ) || is_tax( 'actor' ) ) { // If it's a custom post type archive for Movies // Or it's a taxonomy archive for Genre // Or it's a taxonomy archive for Actor, do something special } |
基于日期的差异
如果有人按日期浏览我们的网站,让我们使用不同的颜色来区分不同年份的帖子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php // this starts The Loop if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2 id= "post-<?php the_ID(); ?>" > <a href= "<?php the_permalink() ?>" rel= "bookmark" ><?php the_title(); ?></a></h2> <small><?php the_time( 'F jS, Y' ) ?> by <?php the_author() ?></small> <?php // are we showing a date-based archive? if ( is_date() ) { if ( date ( 'Y' ) != get_the_date( 'Y' ) ) { // this post was written in a previous year // so let's style the content using the "oldentry" class echo '<div class="oldentry">' ; } else { echo '<div class="entry">' ; } } else { echo '<div class="entry">' ; } the_content( 'Read the rest of this entry »' ); ?></div> |
可变侧边栏内容
此示例将根据读者当前正在查看的页面在边栏中显示不同的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<div id= "sidebar" > <?php // let's generate info appropriate to the page being displayed if ( is_home() ) { // we're on the home page, so let's show a list of all top-level categories wp_list_categories( 'optionall=0&sort_column=name&list=1&children=0' ); } elseif ( is_category() ) { // we're looking at a single category view, so let's show _all_ the categories wp_list_categories( 'optionall=1&sort_column=name&list=1&children=1&hierarchical=1' ) } elseif ( is_single() ) { // we're looking at a single page, so let's not show anything in the sidebar } elseif ( is_page() ) { // we're looking at a static page. Which one? if ( is_page( 'About' ) ) { // our about page. echo "This is my about page!" ; } elseif ( is_page( 'Colophon' ) ) { echo "This is my colophon page, running on WordPress " . bloginfo( 'version' ) . "" ; } else { // catch-all for other pages echo "Vote for Pedro!" ; } } else { // catch-all for everything else (archives, searches, 404s, etc) echo "Pedro offers you his protection." ; } // That's all, folks! ?> </div> |
有用的 404 页面
创建错误 404 页文章h 作为在编写友好消息部分中使用 PHP 条件函数的示例。isset()
在主题的页脚中.php文件
有时,在其他模板(如侧边栏.php)中执行的查询可能会损坏某些条件标记。例如,在页眉中.php条件标记可以正常工作,但在主题的页脚中不起作用.php。诀窍是将wp_reset_query放在页脚中的条件测试之前。例如:
1
2
3
4
5
|
<?php wp_reset_query(); if ( is_page( '2' ) ) { echo 'This is page 2!' ; } ?> |
暂无评论内容