WordPress主题开发教程 — 条件标签函数
2024/11/06 06:21:02 懒猫导航网 已浏览4次
条件函数可以在WordPress模版中使用,通常作为if/else的判断条件,来判断当前页面是否满足某个条件,然后根据判断结果显示对应的内容。
该函数一般返回一个布尔值,如果返回值为true,if后面的代码被执行,如果返回false,else后面的代码被执行。
下面的示例代码中,我们使用is_user_logged_in()函数来判断用户是否已经登录,然后根据用户的登录状态,显示对应的问候语。
if(is_user_logged_in()):
echo'欢迎光临,已注册用户!';
else:
echo'欢迎光临,请注册一个用户!';
endif;
在什么地方使用条件标签函数
在使用条件函数之前,条件函数用来进行判断的信息必须已经从数据库中获取出来了,也就是WordPress查询已经运行过了。如果在WordPress获取到数据之前使用条件函数,条件函数是不工作的。
请注意:由于WordPress的functions.php在运行查询之前加载,如果在这个文件中使用条件函数,很有可能获取不到我们想要的结果。
我们可以通过三种方法使用条件函数:
在模板文件中使用。
在functions.php中创建一个函数,然后在模版文件中调用这个函数
在functions.php中创建一个函数,然后在action或filter中使用这个函数。
条件标签函数详解
下面是我们可以使用的返回结果为true的条件函数,有些条件函数可以接受参数。
主页
is_home()
如果当前页面为网站首页,此函数返回true,如果阅读设置里面的主页设置为了「静态页面」,该函数只在设置为「你的最新文章」的页面中返回true.
is_front_page()
无论在阅读设置里面设置的是「最新文章」还是「静态页面」,只要当前页面是网站首页,此函数就返回true。
也就是,该函数再以下两种情况下返回true
博客首页
「设置->阅读->首页显示」被设置为「您的最新文章」
或者
「设置->阅读->首页显示」被设置为「一个静态页」
当前显示的是上面选择的静态页面
管理后台
is_admin()
当我们在仪表盘或后台页面时,此函数返回true。
单个文章页面
is_single()
当前页面是文章详情页(或附件、自定义文章类型详情页)时,返回true。如果是页面,则返回false。
is_single(’17’)
is_single()还可以通过文章ID和其他文章参数判断是否为特定的某个文章。当文章ID为17时,上面的函数返回true。
is_single(‘Hello World’)
参数也可以是文章标题,当前页面是标题为「Hello World」的文章时,上面的函数返回true
is_single(‘hello-world’)
参数也可以是文章别名,当前页面是别名为「hello-world」的文章时,上面的函数返回true.
is_single(array(17,‘beef-stew’,‘Irish Stew’))
该函数的参数也可以是一个数组,数组的元素可以是文章ID、文章别名、文章名。
注意:该函数的参数不区分文章ID、别名或标题,假设我们传入17作为参数,当文章ID为17或者别名为17时,该函数都返回true。
文章详情、页面、或附件页面
is_singular()
任何is_single,is_page和is_attachment为true的情况下,这个函数都返回true,该函数还接受一个文件类型名称作为参数,用来判断是否为某个文章类型的文章详情页。
置顶文章
is_sticky()
如果当前文章在编辑界面被设置了置顶,该函数返回true。在循环中,该函数可以接受一个文章ID作为参数,来判断某个文章是否置顶,
is_sticky(’17’)
判断ID为17的文章是否为置顶文章。在文章循环中使用时,这个参数会自动设置,可以省略。
文章类型
get_post_type()
我们可以通过get_post_type()来测试当前文章是否为某个文章类型中的文章。严格来说,这不是一个条件函数,但是我们可以拿他返回的结果来个我们需要判断的文章类型做对比,如下:
if('book'==get_post_type())...
post_type_exists()
用来判断某个文章类型是否已经被注册。
文章类型是否是分级的
is_post_type_hierarchical($post_type)
该函数用来判断某个文章类型是否是分级的,比如WordPress默认的页面,有父页面和子页面的功能,就说明这个文章类型是分级,那么下面的函数就会返回true:
is_post_type_hierarchical('page')
文章类型存档页(列表页)
is_post_type_archive()
用来判断当前页面是否为文章类型的列表页。
is_post_type_archive($post_type)
该函数接受一个文章类型名称作为参数,来判断当前页面是否为某个文章类型的列表页。
注意:注册文章类型时,设置了参数‘has_archive’=>true的文章类型才有列表页。
评论弹出窗口
is_comments_popup()
是否在「评论弹出窗口」中。
任何包含文章的页面
comments_open()
当前文章允许发表评论时,返回true
pings_open()
当前文章允许ping时,返回true
“PAGE”页面
本节中使用的「page」指的是WordPress的页面,而不是我网站中的任何网页,或者换言之,指的是内置的「页面」文章类型。
is_page()
当前网页是「页面」时。
is_page(’42’)
当前页面是ID为42的页面时,返回true。
is_page(’About Me’)
当前页面的标题为「About me」时,返回true。
is_page(’about-me’)
当前页面的别名为「About me」时,返回true。
is_page(array(42,’about-me’,’About Me’))
当前页面的ID是42,或post_name是「about-me」,或post_title是「About Me」时,返回true。
is_page(array(42,54,6))
当前页面是ID为42、54或6时,返回true。
测试页面分页
我们可以使用此代码检查我们是否位于使用QuickTag<!--nextpage-->分割为多个页面的文章或页面的第n页上。有时候这会很有用,例如,如果您希望仅在分为多个页面的文章的第一页上显示元数据。
例1
<?php
$paged=$wp_query->get('page');
if(!$paged||$paged<2){
//这不是一个有分页的页面,或是有分页页面中的第一页
}else{
//这是一个有分页的页面
}?>
例2
<?php
$paged=get_query_var('page')?get_query_var('page'):false;
if($paged==false){
//这不是一个有分页的页面,或是有分页页面中的第一页
}else{
//这是一个有分页的页面
}
?>
测试子页面
WordPress没有is_subpage()函数,但是我们可以使用其他方式来测试当前页面是否为另外一个页面的子页面:
代码片段1
<?php
global$post;//如果在文章循环外部使用,加上此代码
if(is_page()&&$post->post_parent){
//这是一个子页面
}else{
//这不是一个子页面
}
?>
我们可以使用代码片段2中的代码创建自己的is_subpage()函数。将其添加到functions.php文件中。它以与Snippet 1以相同的方式来测试是否为子页面,但如果有,则返回父页面的ID,如果没有,则返回false。
代码片段2
function is_subpage(){
global$post;
if(is_page()&&$post->post_parent){
return$post->post_parent;
}else{
return false;
}
}
如果我们需要经常测试子页面,建议使用Snippet 2中的函数,而不是像Snippet 1那样类每次需要测试时复制。
要测试页面的父级页面是否是特定页面,例如“About”(页面ID为2),我们可以使用Snippet 3中的测试。这些测试可以检查我们是否正在查看指定页面或其子页面。这对于为网站不同部分设置特定的内容非常重要,如,我们可以为不同的页面、子页面设置不同的标题和Banner。
代码段3
<?php
if(is_page('about')||'2'==$post->post_parent){
//页面标题为"About",或者是"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';//在其他页面中时
}
?>
Snippet 4是一个可以让我们更轻松地执行上述测试的函数。如果我们正在查看指定页面(如“About”)或其中一个子页面(此页面的父级ID为“2”),此函数将返回true。
代码片段4
function is_tree($pid){
global$post;
if(is_page($pid)){
return true;
}
$anc=get_post_ancestors($post->ID);
foreach($anc as$ancestor){
if(is_page()&&$ancestor==$pid){
return true;
}
}
return false;
}
将Snippet 4添加到主题的functions.php文件中,并调用is_tree(‘id’)来查看当前页面是否为页面,或是页面的子页面。在Snippet 3中,is_tree(‘2’)将替换第一个if标签内的"is_page('about')||'2'==$post->post_parent"
请注意,如果我们有多个页面级别,则父页面是当前页面的直接父页面,而不是层次结构最顶层的页面。
是否为页面模板
WordPress允许我们确定当前页面是否使用了页面模版或是否使用了特定的页面模版。
is_page_template()
是否使用了页面模板?
is_page_template(‘about.php’)
是否使用了「about.php」页面模版?请注意,与其他判断函数不同,如果要指定页面模板,则需要使用文件名,例如about.php或my_page_template.php。
注意:如果模版文件位于子目录中,参数中还需要包含目录,例如‘page-templates/about.php’。
分类页面
is_category()
显示“分类目录存档”页面时,返回true
is_category(‘9’)
显示ID为9的分类目录存档页面时,返回true
is_category(‘Stinky Cheeses’)
当显示名称为“Stinky Cheeses”的分类目录存档页面时,返回true
is_category(’blue-cheese’)
显示别名为“blue-cheese”的分类目录存档页面时,返回true
is_category(array(9,’blue-cheese’,’Stinky Cheeses’))
显示ID为9,或别名为「blue-cheese」,或名称为「Stiky Cheeses」的分类目录存档页面时,返回true。
in_category(‘5’)
如果当前文章在ID为5的分类目录中时,返回true。
in_category(array(1,2,3))
如果当前文章在ID为1、2或3的分类目录中时,返回true。
!in_category(array(4,5,6))
如果当前分类不在ID为4、5或6的分类目录中时,返回true。
注意:使用上面的函数时,一定要注意拼写,“is”和“in”的区别很大。
另请参见is_archive()和分类目录模板。
标签存档页
is_tag()
是否为标签存档页面
is_tag(‘文章类型’)
是否为名称为「文章类型」的标签存档页面。
is_tag(array(‘sharp’,’mild’,’extreme’))
标签别名为“sharp”,“mild”或“extreme”时,返回true。
has_tag()
当前文章有标签时,返回true。必须在文章循环中使用。
has_tag(‘文章类型’)
当前文章的标签为“文章类型”时,返回true。
has_tag(array(‘sharp’,’mild’,’extreme’))
当前文章有别名为数组中的任意一个时,返回true.
另请参见is_archive()和标签模板。
分类法存档页
is_tax()
是否为分类法存档页面
is_tax(‘flavor’)
显示为名为flavor的分类法存档页面时,返回true。
is_tax(‘flavor’,’mild’)
显示Flavor为mild的分类法项目存档页面时。
is_tax(‘flavor’,array(‘sharp’,’mild’,’extreme’))
显示别名为“sharp”,“mild”或“extreme”的flavor分类法项目存档页面时,返回true。
has_term()
检查当前文章是否包含指定的分类法项目。第一个参数应该是空字符串。需要分类法项目别名/名称作为第二个参数。
has_term(‘green’,’color’)
当前文章有颜色为绿色的分类法项目。
has_term(array(‘green’,’orange’,’blue’),’color’)
当前文章有颜色为绿色、橙色、蓝色的分类法项目。
另请参见is_archive()。
注册分类标准
taxonomy_exists()
当某个分类法已通过register_taxonomy()注册时,返回true。以前的is_taxonomy()在3.0版中已弃用。
作者页面
is_author()
显示作者存档页面时,返回true。
is_author(‘4’)
显示ID为4的作者存档页面时,返回true。
is_author(‘Vivian’)
显示昵称为“Vivian”的作者的存档页面时。
is_author(’john-jones’)
显示nicename为“john-jones”的存档页面时,返回true。
is_author(array(4,’john-jones’,’Vivian’))
显示ID 4或user_nicename为“john-jones”或昵称为“Vivian”的作者存档页面时,返回true。
另请参见is_archive()和作者模板。
多作者网站
is_multi_author()
当多位作者发布网站文章时。适用于3.2版。
日期页面
is_date()
显示任何日期存档页面时,返回true。
is_year()
显示年度存档时,返回true。
is_month()
何时月度存档,返回true。
is_day()
显示每日存档时,返回true。
is_time()
当显示每小时,“分钟”或“每秒”存档时,返回true。
is_new_day()
确定循环中当前文章的发布日期是否与上一篇的不同。
任何档案页面
is_archive()
显示任何类型的存档页面时(如分类目录,标签,作者和日期存档),返回true
搜索结果页面
is_search()
显示搜索结果页面存档时,返回true。
404页面
is_404()
在“HTTP 404:Not Found”错误发生时,返回true。
单附件页面
is_attachment()
当前页面为文章或页面的附件时,返回true。附件是通过文章编辑器上传的图像或其他文件,可以显示在他们自己的“页面”或模板上。
单页,单个文章或附件
is_singular()
当以下任何一个函数返回true时:is_single(),is_page()或is_attachment(),该函数返回true。
is_singular(‘book’)
但是文章类型为‘book’的单页面时,返回true。
is_singular(array(‘newspaper’,‘book’))
显示文章类型为‘newspaper’或‘book’的单页面时,返回true。
订阅源
is_feed()
当前页面为订阅源页面时,返回true。该函数在主题开发时不常用,一般在WordPress内部或在插件开发时使用。
引用
is_trackback()
当请求的页面是WordPress的Trackback引擎时,返回true。该函数在主题开发时不常用,一般在WordPress内部或在插件开发时使用。
预览
is_preview()
在预览模式为查看文章或页面时,返回true。
有摘要
has_excerpt()
当前文章有摘要时,返回true。
has_excerpt()
当ID为42的文章有摘要时,返回true。
<?php
if(empty($post->post_excerpt)){
//此文章没摘要
}else{
//此文章要摘要
}
?>
其他用法
当我们需要隐藏自动摘要,只显示手动摘要时,可使用以下代码。
<?php
if(!has_excerpt()){
echo'';
}else{
the_excerpt();
}
?>
替换文本或代码的自动摘要。
<?php
if(!has_excerpt()){
//你的文字或代码
}
?>
是否已分配导航菜单
has_nav_menu()
注册的导航菜单位置是否已分配菜单
返回:已分配(true)或未分配(false)
在循环内
in_the_loop()
检查你是否“在文章循环内”。这个函数对于插件开发者很有用,当我们在循环中时,这个条件会返回true。
侧边栏是否已激活(有小工具)
is_active_sidebar()
检查指定侧边栏是否处于活动状态(侧边栏中有小工具)。如果使用侧栏(由名称,标识或编号标识)中有小工具,则返回true,否则false。
当前站点是否为网络的一部分(多站点)
is_multisite()
检查当前站点是否在WordPress MultiSite安装中。
主站点(多站点)
is_main_site()
确定站点是否为网络中的主站点。
网络管理员(多站点)
is_super_admin()
确定用户是否是网络(超级)管理员。
插件是否已激活
is_plugin_active()
检查插件是否已激活。
子主题
is_child_theme()
检查当前站点是否正在使用子主题。
主题是否支持一项功能
current_theme_supports()
检查主题是否支持某项功能。
代码示例
以下是条件函数的各种使用示例,演示我们可以如何使用这些条件标记。
文章详情
此示例演示了如何使用is_single()设置特定内容仅在查看单文章页面时显示:
if(is_single()){
echo'This is just one of many fabulous entries in the'.single_cat_title().'category!';
}
这是一个在循环中使用条件函数的实例,当我们正在查看首页或单文章页面时,显示文章的完整内容,其他情况显示摘要。
if(is_home()||is_single()){
the_content();
}else{
the_excerpt();
}
当我们需要在除了首页的其他页面显示某些内容时,可以使用如下代码。
<?php
if(!is_home()){
//Insert your markup...
}
?>
检查多个条件
我们可以使用PHP运算符在单个if语句中判断多个条件。当我们需要检查当前页面是否满足多个条件时,这种处理方法非常有用。
if(is_single()||is_page()){
//如果当前页面是单文章页面或页面详情时,显示此处的内容
}
if(is_archive()&&!is_category('nachos')){
//如果当前页面时存档页面,单不是‘nachos’分类时,显示此处的内容
}
if($query->is_main_query()&&is_post_type_archive('products')&&!is_admin()){
//如果当前页面有一个主查询,并且为‘products’文章类型存档页面,并且不在管理页面时,显示这里的内容not in the WordPress admin,then do something special
}
if(is_post_type_archive('movies')||is_tax('genre')||is_tax('actor')){
//如果时‘movies’文章类型的存档页面
//或者是‘genre’分类法的存档页面
//或者是分类法‘actor’的存档页面
}
基于日期的差异
如果有人按日期浏览我们的网站,让我们使用不同的颜色区分各个年份的帖子:
<?php
if(have_posts()):while(have_posts()):the_post();?>
<h2>
<a href=" the_permalink()?>"rel="bookmark">
<?php the_title();?>
</a>
</h2>
<small><?php the_time('F jS,Y')?>by<?php the_author()?></small>
<?php
if(is_date()){
if(date('Y')!=get_the_date('Y')){
//这是去年的文章,我们添加一个“oldentry”的类
//so let's style the content using the"oldentry"class
echo'<div>';
}else{
echo'<div>';
}
}else{
echo'<div>';
}
the_content('Read the rest of this entry»');
?>
</div>
可变边栏内容
下面的示例根据用户访问的页面显示不同的侧边栏。
<div>
<?php
if(is_home()){
//我们在首页,显示所有顶级分类的列表
wp_list_categories('optionall=0&sort_column=name&list=1&children=0');
}elseif(is_category()){
//我们在单页面,显示所有分类列表
wp_list_categories('optionall=1&sort_column=name&list=1&children=1&hierarchical=1')
}elseif(is_single()){
//我们在单文章页面,不显示任何内容
}elseif(is_page()){
//我们在页面中,接下来检查在哪一个页面
if(is_page('About')){
//关于我们页面
echo"这是关于我们页面!";
}elseif(is_page('contact')){
echo"这是联系我们页面。";
}else{
echo"其他页面";
}
}else{
echo"其他页面";
}
</div>
友好的404页面
创建一个友好的404页面可以让用户更方便的浏览网站,如在出现404错误时,提示用户返回首页或搜索。
if(is_404()){
ehco"当前页面未找到,请返回首页或搜索您需要的内容。";
}
在主题的footer.php文件中
有时在其他模板(如sidebar.php)中执行的查询可能会损坏某些条件标记。例如,在header.php中,条件标记可以正常工作,但在主题的footer.php中不起作用。解决这个问题的诀窍是在页脚中的条件测试之前放置wp_reset_query。例如:
<?php
wp_reset_query();
if(is_page('2')){
echo'This is page 2!';
}
?>
条件标签函数索引
comments_open
has_tag
has_term
in_category
is_404
is_admin
is_archive
is_attachment
is_author
is_category
is_child_theme
is_comments_popup
is_date
is_day
is_feed
is_front_page
is_home
is_month
is_multi_author
is_multisite
is_main_site
is_page
is_page_template
is_paged
is_preview
is_rtl
is_search
is_single
is_singular
is_sticky
is_super_admin
is_tag
is_tax
is_time
is_trackback
is_year
pings_open
函数参考
函数:comments_open()
函数:is_404()
函数:is_admin()
函数:is_admin_bar_showing()
函数:is_archive()
函数:is_attachment()
函数:is_author()
函数:is_category()
函数:is_comments_popup()
函数:is_date()
函数:is_day()
函数:is_feed()
函数:is_front_page()
函数:is_home()
函数:is_local_attachment()
函数:is_main_query
函数:is_multi_author
函数:is_month()
函数:is_new_day()
函数:is_page()
函数:is_page_template()
函数:is_paged()
函数:is_plugin_active()
函数:is_plugin_active_for_network()
函数:is_plugin_inactive()
函数:is_plugin_page()
函数:is_post_type_archive()
函数:is_preview()
函数:is_search()
函数:is_single()
函数:is_singular()
函数:is_sticky()
函数:is_tag()
函数:is_tax()
函数:is_taxonomy_hierarchical()
函数:is_time()
函数:is_trackback()
函数:is_year()
函数:in_category()
函数:in_the_loop()
函数:is_active_sidebar()
函数:is_active_widget()
函数:is_blog_installed()
函数:is_rtl()
函数:is_dynamic_sidebar()
函数:is_user_logged_in()
函数:has_excerpt()
函数:has_post_thumbnail()
函数:has_tag()
函数:pings_open()
函数:email exists()
函数:post_type_exists()
函数:taxonomy_exists()
函数:term_exists()
函数:username exists()
函数:wp_attachment_is_image()
函数:wp_script_is()
更多技术教程,请关注懒猫导航网