WordPress主题开发文档——条件标签

可以在经典主题的模板文件中使用条件标记,以根据当前页面匹配的条件更改内容的显示。他们告诉WordPress在特定条件下显示什么代码。条件标记通常与 PHP 一起使用,如果 /else 条件语句。

wordpress

代码首先检查语句是真还是假。如果发现该语句为 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

条件

下面列出的是以下每个条件语句证明为真的条件。可以接受参数的标签被记录下来。

主页

is_home()

当显示主博客页面时,此条件返回 true,通常按标准的时间倒序排列。如果您的主页已设置为静态页面,则只有在您在“阅读设置”中设置为“帖子页面”的页面上才会证明这是真的>。

首页

is_front_page()

当显示网站的首页时,此条件返回 true,无论它是设置为显示帖子还是静态页面。

在以下情况下返回 true:

  1. 显示主博客页面,并且
  2. “阅读>设置 – >首页显示”选项设置为“您的最新帖子”

  1. 当“阅读 ->首页显示>设置”设置为“静态页面”
  2. “首页”值是当前显示的页面。

管理面板

is_admin()

当显示仪表板或管理面板时,此条件返回 true。

单个帖子页面

is_single()

显示任何单个帖子(或附件,或自定义帖子类型)时返回 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_singular()

对任何is_single、is_page和is_attachment返回 true。它确实允许测试帖子类型。

粘性帖子

is_sticky()

如果已选中当前帖子的“将此帖子粘贴到首页”复选框,则返回 true。在此示例中,未给出任何 post ID 参数,因此使用 Loop 帖子的帖子 ID。

is_sticky( ’17’ )
当帖子 17 被视为粘性帖子时返回 true。

帖子类型

get_post_type()

您可以通过在条件中包含get_post_type()来测试当前帖子是否属于某种类型。它实际上不是一个条件标记,但它返回当前帖子的已注册帖子类型

如果 ( ‘book’ == get_post_type() ) …

post_type_exists()

如果给定的帖子类型是已注册的帖子类型,则返回 true。这不会测试帖子是否是某个post_type。注意:此函数替换了一个名为 is_post_type的函数,该函数在 3.0 开发中短暂存在。

帖子类型是分层的

is_post_type_hierarchical( $post类型 )

如果此 $post_type 在注册时已设置了分层支持,则返回 true。

is_post_type_hierarchical( “书” )

如果书籍帖子类型已注册为支持分层,则返回 true。

帖子类型存档

is_post_type_archive()

在任何帖子类型存档中返回 true。

is_post_type_archive( $post类型 )

如果在与 $post_type 匹配的帖子类型存档页面上返回 true(可以是单个帖子类型或帖子类型数组)。

要打开帖子类型存档,请在注册帖子类型时使用“has_archive”=> true。

任何包含帖子的页面

comments_open()

当允许在WordPress循环中处理当前帖子的评论时。

pings_open()

当在WordPress循环中处理当前帖子时允许ping。

“页面”页面

本节指的是WordPress页面,而不是您博客中的任何通用网页,换句话说,是指内置post_type“页面”。

is_page()

显示任何页面时。

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()

是否正在使用页面模板?

is_page_template( “大约.php” )

页面模板是否“关于”正在使用?请注意,与其他条件不同,如果要指定特定的页面模板,则需要使用文件名,例如 about.php 或 my_page_template.php。

注意:如果文件位于子目录中,则还必须包含此文件。这意味着这应该是与您的主题以及文件名相关的文件路径,例如“页面模板/关于.php”。

类别页面

is_category()

显示类别存档页面时。

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( “温和” )

当显示带有“轻度”信息区的标签的归档页面时。

is_tag( 阵列( “锐利”,“温和”, “极端” )

当显示的标记存档具有“锐”、“温和”或“极端”的辅助信息时,返回 true。

has_tag()

当前帖子具有标记时。必须在循环中使用。

has_tag( “温和” )

当当前帖子的标签为“轻度”时。

has_tag( 阵列( “锐利”,“温和”, “极端” )

当当前帖子在数组中具有任何标记时。

另请参阅is_archive() 和标签模板

分类页面

is_tax()

显示任何分类存档页面时。

is_tax( “风味” )

当显示变种分类的分类存档页面时。

is_tax(“味道”,“温和”)

当显示带有“温和”蛞蝓的口味分类的存档页面时。

is_tax( “味道”, 阵列( “尖锐”,“温和”, “极端” )

当显示的口味分类存档具有“锐利”、“温和”或“极端”的辅助信息时,返回 true。

has_term()

检查当前帖子是否有任何给定的条款。第一个参数应为空字符串。它需要一个分类 slug/name 作为第二个参数。

has_term( “绿色”, “颜色” )

当当前帖子具有分类“颜色”中的术语“绿色”时。

has_term( 阵列( “绿色”, “橙色”, “蓝色” ), “颜色” )

当前帖子在数组中具有任何术语时。

另请参见 is_archive() 。

已注册的分类法

taxonomy_exists()

当通过register_taxonomy()注册特定分类时。以前is_taxonomy(),在 V3.0 中已不推荐使用

作者页面

is_author()

显示任何“作者”页面时。

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() 和作者模板

多作者网站

is_multi_author()

当多个作者为某个网站发布帖子时。随版本 3.2 一起提供。

日期页面

is_date()

当显示任何基于日期的存档页面时(即每月、每年、每天或基于时间的存档)。

is_year()

显示年度存档时。

is_month()

显示每月存档时。

is_day()

显示每日存档时。

is_time()

当显示每小时、“分钟”或“第二”存档时。

is_new_day()

如果今天是新的一天,根据发布日期。应在循环内部使用。

任何存档页面

is_archive()

显示任何类型的“存档”页面时。类别、标签、作者和基于日期的页面都是存档类型。

搜索结果页

is_search()

显示搜索结果页存档时。

A 404 未找到页面

is_404()

当页面在“HTTP 404:未找到”错误后显示时。

隐私政策页面

is_privacy_policy()

显示“隐私策略”页时。

附件

is_attachment()

显示帖子或主页的附件文档时。附件是通过帖子编辑器的上传实用程序上传的图像或其他文件。附件可以显示在自己的“页面”或模板上。

单页、单篇文章或附件

is_singular()

当以下任一项返回 true 时:或 。is_single()is_page()is_attachment()

is_singular( “书” )

查看“自定义帖子类型”图书的帖子时为 True。

is_singular( 阵列( “报纸”, “书” )

查看“自定义帖子类型”报纸或书籍的帖子时为 True。

联合供稿

is_feed()

当请求的站点是联合时。此标记通常不由用户使用;它由WordPress内部使用,可供插件开发人员使用。

引用通告

is_trackback()

当请求的网站是WordPress的钩子进入其Trackback引擎时。此标记通常不由用户使用;它由WordPress内部使用,可供插件开发人员使用。

预览

is_preview()

在“草稿”模式下查看正在显示的单个帖子时。

有摘录

has_excerpt()

当前帖子有摘录时

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
} ?>

分配了导航菜单

has_nav_menu()

已注册的导航菜单位置是否分配了菜单

返回:已分配(真)或不(假)

循环内部

in_the_loop()

检查您是否处于“循环内”。对于插件作者很有用,当您在循环中时,此条件返回为 true。

边栏处于活动状态

is_active_sidebar()

检查给定的边栏是否处于活动状态(正在使用中)。如果边栏(由名称、id 或数字标识)正在使用中,则返回 true,否则函数返回 false。

网络的一部分(多站点)

is_multisite()

检查当前站点是否在WordPress MultiSite安装中。

主站点(多站点)

is_main_site()

确定站点是否为网络中的主站点。

网络管理员(多站点)

is_super_admin()

确定用户是否为网络(超级)管理员。

活动插件

is_plugin_active()

检查插件是否已激活。

儿童主题

is_child_theme()

检查子主题是否正在使用中。

主题支持功能

current_theme_supports()

检查是否存在各种主题功能。

工作实例

下面是演示如何使用这些条件标记的工作示例。

单柱

此示例演示如何仅在查看单个帖子页面时使用来显示特定内容: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!';
 }
?>
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片