• WordPress主题开发( 十一)之—— 条件标签函数(下)


    今天咱们继续介绍条件标签函数
    关于"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 分割为多个页面的文章或页面的第n页上。有时候这会很有用,例如,如果您希望仅在分割为多个页面的文章的第一页上显示元数据。

    例1

      $paged = $wp_query->get('page');
      if (!$paged || $paged < 2) {
        // 这不是一个有分页的页面,或是有分页页面中的第一页
       } else {
        // 这是一个有分页的页面
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例2

        $paged = get_query_var('page') ? get_query_var('page') : false;
        if ($paged == false)  {
        // 这不是一个有分页的页面,或是有分页页面中的第一页
        }  else  {
        // 这是一个有分页的页面
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试子页面
    WordPress没有is_subpage()函数,但是我们可以使用其他方式来测试当前页面是否为另外一个页面的子页面:

    代码片段1

    
       global $post; // 如果在文章循环外部使用,加上此代码
       if (is_page() && $post->post_parent) {
         // 这是一个子页面
       } else {
         // 这不是一个子页面
       }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们可以使用代码片段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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果我们需要经常测试子页面,建议使用Snippet 2中的函数,而不是像Snippet 1那样每次需要测试时复制。

    要测试页面的父级页面是否是特定页面,例如“About”(页面ID为2),我们可以使用Snippet 3中的测试。这些测试可以检查我们是否正在查看指定页面或其子页面。这对于为网站不同部分设置特定的内容非常重要,如,我们可以为不同的页面、子页面设置不同的标题和Banner。

    代码段3

    
    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'; // 在其他页面中时
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    将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。

     
       if (empty($post->post_excerpt)) {
        // 此文章没摘要
       } else {
        // 此文章要摘要
      }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其他用法
    当我们需要隐藏自动摘要,只显示手动摘要时,可使用以下代码。

    
      if (!has_excerpt()) {
          echo '';
      } else {
          the_excerpt();
      }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    替换文本或代码的自动摘要。

    
    if (!has_excerpt()) {
        // 你的文字或代码
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    是否已分配导航菜单
    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!';
    }
    
    • 1
    • 2
    • 3

    这是一个在循环中使用条件函数的实例,当我们正在查看首页或单文章页面时,显示文章的完整内容,其他情况显示摘要。

    if (is_home() || is_single()) {
       the_content();
    } else {
       the_excerpt();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当我们需要在除了首页的其他页面显示某些内容时,可以使用如下代码。

     
    if (!is_home()) {
     // Insert your markup ...
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    检查多个条件
    我们可以使用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’的存档页面
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    基于日期的差异
    如果有人按日期浏览我们的网站,让我们使用不同的颜色区分各个年份的帖子:

    
    if (have_posts()) : while (have_posts()) : the_post(); ?>
    <h2 id="post-">
        <a href="" 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 '
    '; } else { echo '
    '; } } else { echo '
    '; } 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

    可变边栏内容
    下面的示例根据用户访问的页面显示不同的侧边栏。

    <div id="sidebar">
    <?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>
    
    • 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

    友好的404页面
    创建一个友好的404页面可以让用户更方便的浏览网站,如在出现404错误时,提示用户返回首页或搜索。

    if (is_404()) {
      ehco "当前页面未找到,请返回首页或搜索您需要的内容。";
    }
    
    • 1
    • 2
    • 3

    在主题的footer.php文件中
    有时在其他模板(如sidebar.php)中执行的查询可能会损坏某些条件标记。例如,在header.php中,条件标记可以正常工作,但在主题的footer.php中不起作用。解决这个问题的诀窍是在页脚中的条件测试之前放置wp_reset_query。例如:

    
    wp_reset_query();
     if (is_page('2')) {
      echo 'This is page 2!';
     }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    条件标签函数索引
    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_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_main_query
    is_main_site
    is_new_day
    is_post_type_archive
    is_post_type_hierarchical
    is_single
    is_singular
    is_ssl
    is_super_admin
    is_taxonomy
    is_user_logged_in
    wp_attachment_is
    wp_attachment_is_image
    wp_attachment_is_audio
    wp_attachment_is_video
    wp_attachment_is
    wp_attachment_is_image
    wp_attachment_is_audio
    wp_attachment_is_video
    wp_get_post_terms
    wp_get_post_terms
    wp_get_sidebars_widgets
    wp_is_mobile
    wp_is_post_revision
    wp_is_post_autosave
    wp_is_stream
    wp_is_theme
    wp_list_categories
    wp_list_pages
    wp_script_is
    wp_script_is
    wp_style_is
    wp_style_is
    wp_text_diff
    wp_style_is
    wp_style_is

  • 相关阅读:
    自动化测试面试经历
    STM32控制数码管从0显示到99
    Vue 简易版无限加载组件实现原理
    MySQL之函数
    【Python零基础入门篇 · 14】:匿名函数lambda、内置函数一【print()、set()、list()、tuple()、abs()、sum()】
    CobaltStrike 流量隐藏
    MySQL学习问题记录
    《操作系统导论》读书笔记1——CPU虚拟化,进程
    SpringBoot项目添加2FA双因素身份认证
    Learn Prompt- Midjourney案例:网页设计
  • 原文地址:https://blog.csdn.net/weixin_38912950/article/details/133380626