专栏首页一丘一壑Genesis框架从入门到精通(7): 框架的过滤器

Genesis框架从入门到精通(7): 框架的过滤器

原文地址

Genesis Explained Framework Filters

Welcome once again to the Genesis Explained series. Remember, this series builds on previous articles, so if you didn’t read the first Filters article, go catch up. …

Designs By Nick the Geek

译文

欢迎再次来到Genesis从入门到精通系列教程。请注意,这是一个系列教程,建立在前面的文章基础上,所以如果你没看过前一篇过滤器的文章,去看看。所有文章都可以在Genesis Explained标签中找到。

在上一个教程中,我介绍了添加/删除过滤器的基础知识。就像我说的,当你需要对内容进行更改而不是添加新内容时,用过滤器比用动作更高效。诀窍就是到哪里去找过滤器。在Genesis 框架的内置动作这篇文章中,我介绍了可以在哪里找到大多数 Genesis 中使用的动作。其实大多数Genesis中的过滤器也都可以在相同的文件中找到。需要注意的,也有例外情况,有些是在 genesis/lib/classes/class-genesis-breadcrumb.php 文件中或 genesis/lib/functions/ 目录中。看这些文件的名字就应该能知道里面的内容了,都是关于Genesis函数的,具体将在下一个子系列中再讲。

现在让我们来看一些在 Genesis 中使用过滤器的具体例子。

替换字符串

首先,让我解释一下“字符串”的概念。在PHP中有几种不同的数据。我们姑且把它们分为字符串和数组。从技术上讲,这样说可能有点过于简单,但对于我们现在要涉及的内容来说,这已经足够了。如果你想深入了解,请查看PHP手册

在本文中,字符串即是一个文本或数值,包括html代码,因为html也是文本。

现在,我们基本了解了什么是字符串(以后会详细介绍),让我们看一个字符串的替换操作。如果有人在你的 WordPress 网站上进行搜索,但是并且没有相应的结果,则会显示“抱歉,没有符合您条件的帖子”。这样也没毛病,但如果我想说点别的怎么办?因为这是在循环内部运行的,所以我们应该查看的是 genesis/lib/structure/post.php (记住, loop.php的构建循环结构的文件,但循环中的实际输出内容是在 post.php 里创建的)。我们会找到:

add_action( 'genesis_loop_else', 'genesis_do_noposts' );
/**
 * Echo filterable content when there are no posts to show.
 *
 * The applied filter is `genesis_noposts_text`.
 *
 * @since 1.1.0
 */
function genesis_do_noposts() {

	printf( '%s', apply_filters( 'genesis_noposts_text', __( 'Sorry, no content matched your criteria.', 'genesis' ) ) );

}

如果你阅读了上一篇关于过滤器的文章,那么应该知道 apply_filters() 函数就是见证奇迹的的地方。上面的代码看起来好像有很多东西,但实际上只是打印字符串, __() 是用于把这个字符串翻译成其它语言的函数。如果你不需要翻译,就不需要使用 __(),只需输入你要显示的字符串即可,但为了以防万一,我们还是暂且保留 __()。需要记住的是,如果你需要让字符串可以被翻译的话,那你需要更改主题的语言文件。 你可能已经知道怎么写了,但是让我们一起看看,了解一下它是如何工作的。

add_filter( 'genesis_noposts_text', 'child_noposts_text' );
/**Changes the No Posts text for search pages */
function child_noposts_text( $text ) {
    if( ! is_search() )
        return $text;

    return '<span class="no-posts">' . __( 'Sorry, 啥也没找着.', 'genesis' ) . '</span>';
}

你会注意到我们没有写上优先级和参数的数量。使用默认值的话就不必添加。接下来你应该注意到,先判断它是不是搜索页面,如果不是就直接返回 $text。先把值返回可以确保后面不会忘记,但也可以在最后返回。然后,当返回搜索结果不存在时,搜索页面上出现的提示文字就是我们上面改的字符串。因为我在 php 里使用了 html 字符串,所以必须使用连接运算符(.)将它们放在一起。如果你的文字不需要翻译,可以不使用 __()只需这样写:

return '<span class="no-posts">Sorry, no posts were found for your search.</span>';

如果你不想添加额外的html,也可以不需要。比如:

add_filter( 'genesis_noposts_text', 'child_noposts_text' );
/**Changes the No Posts text for search pages */
function child_noposts_text( $text ) {
    if( ! is_search() )
        return $text;

    return  $text . " 啊啊啊啊啊";
}

更改字符串

更改字符串的操作会略有不同,需要保留原有字符串的某些部分并构建新内容,可能需要通过追加字符串或使用某些高级的方法,比如 str_replace()preg_replace() 。为了演示,我们将会弄的复杂一点

改变主题的页脚文字是最常见的需求之一。有一个方便的插件Genesis Simple Edits可以处理,但它不支持使用PHP。那么让我们看看是否可以使用过滤器。我们在 框架的内置动作文中见过Genesis处理页脚的文件在哪里,页脚应该位于 genesis/lib/structure/footer.php 文件,打开这个文件看看是不是有过滤器。在 genesis_do_footer()函数的末尾,你将找到这行代码:

echo apply_filters( 'genesis_footer_output', $output, $backtotop_text, $creds_text );

基于上一篇关于过滤器的文章,我们知道 $output 可以被更改或替换,但我们也可以使用 $backtotop_text$creds_text。这些参数的值可以编辑,或结合str_replace()函数使用,这就是我们在这里要做的。

add_filter( 'genesis_footer_output', 'child_footer_output', 10, 3);
/**Modifies the footer text */
function child_footer_output( $output, $backtotop_text, $creds_text ){

    $child_creds_text = 'Copyright 2007 - '. date( 'Y' ) .'<a href="https://designsbynickthegeek.com">Nick the Geek</a>';

    $output = str_replace( $creds_text, $child_creds_text, $output );

    return $output;
}

我在这里把事情复杂化了,其实我可以在“genesis_footer_creds_text”过滤器钩子上做一个简单的替换,但那样的话我就无法演示怎么使用 str_replace()来改变字符串值。有时这样也是一种最好的解决方案,重要的是要了解它是如何实现的。

第5行设置了我们将要添加的文本。我构建了一个字符串,其中包含版权的开始日期,以及当前年份作为结束日期。我发现很多人都想知道如何做到这一点,所以现在你知道怎么做了。页脚中原来的所有其他内容都会消失。请记住,任何包含纯文本的html都要放在单引号中,但php代码必须在引号外面。要构建字符串,请在字符串值之间使用连接符“.”。

第7行使用 str_replace()$output 中找到 $creds_text,并用 $new_creds_text替换它。

我确信你看到这里,应该能感受到这个简单的函数的方便之处了吧,当你有一个字符串,你想修改它其中的某部分的时候,你可以使用过滤器。

注:这里可以看一下怎么用动作来实现,做一个对比:

<?php
//* Do NOT include the opening php tag shown above. Copy the code shown below.

//* Customize the entire footer
remove_action( 'genesis_footer', 'genesis_do_footer' );
add_action( 'genesis_footer', 'sp_custom_footer' );
function sp_custom_footer() {
	?>
	<p>&copy; Copyright 2012 <a href="http://mydomain.com/">My Domain</a> &middot; All Rights Reserved &middot; Powered by <a href="http://wordpress.org/">WordPress</a> &middot; <a href="http://mydomain.com/wp-admin">Admin</a></p>
	<?php
}

还有很多内容,我将在下一篇文章中讲其他一些技术,特别是数组,一种复杂的字符串。

我相信你可以理解为什么我将过滤器称为一种“魔术”。开始时很难掌握,许多开发人员还是希望用动作来达到相同目的,但是通过一些练习,过滤器将成为你的首选方法。


参考资料

PHP的数组是指一个关键字和值的集合。数组在PHP开发中应用非常普遍,学好数组对于学好PHP非常重要。鉴于下一篇是关于数组的,对数组还不是不了解的朋友可以看看这个个教程 PHP进阶篇 中关于数组的介绍

WordPress主题的语言文件,也就是关于翻译的,可以参考这篇文章 三个步骤实现wordpress主题汉化(使用主题提供的pot文件)

原文中的代码可以参考这里:Github地址 这也是作者出版的书Genesis Explained: Your Step-By-Step Guide to Genesis 中的实例代码地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Genesis框架从入门到精通(1):什么是框架?

    WordPress主题框架Genesis的工作原理可能会让很多人感到困惑不解,这导致开发者在开始用Genesis框架时可能会一脸蒙逼,无所适从。

    丘壑
  • Genesis框架从入门到精通(11): 图像函数

    Genesis Explained Image Functions

    丘壑
  • Genesis框架从入门到精通(14): 布局函数

    正如我之前在Genesis Explained系列文章中所承诺的那样,今天将要填 genesis/lib/functions/layout.php 这个文件的坑...

    丘壑
  • linux命令之-more

    more (more) 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比,方便逐页阅读(file peru...

    用户5807183
  • 下一个猎杀目标 | 近期大量MySQL数据库遭勒索攻击

    随着MongoDB, ElasticSearch, Hadoop, CouchDB和Cassandra服务器的的沦陷,MySQL数据库成了攻击者的下一个猎杀目标...

    FB客服
  • Go组件学习:如何读取ini配置文件

    运行后即可读取到username的值,上文中的Section有什么作用呢?我们在配置文件中加入以下配置

    平也
  • 对"怎么才能入门"的小看法

    在经历了一个学期的专业课学习后,还是会有很多同学,不清楚这个专业是干什么的,这个专业怎么入门,甚至比起以前,自己对于计算机网络技术这个专业更加云里雾里,所以今天...

    Elapse
  • Linux/CentOS服务器安全配置通用指南

    Linux 是一个开放式系统,可以在网络上找到许多现成的程序和工具,这既方便了用户,也方便了黑客,因为他们也能很容易地找到程序和工具来潜入 Linux 系统,或...

    砸漏
  • poj 1088 滑雪

    题意:找出最长的递增道路,可以上下左右四个方向走 DP方程:step[ i ][ j ] = max{ step[ i-1][ j ],  step[ i ][...

    用户1624346
  • 揭开谍中谍的好戏,关键词:HW、RDP漏扫、红蓝对抗

    腾讯御见威胁情报中心监测到网上一款编译好的RDP漏洞(亦有安全专家命名为RDS漏洞)检测工具在流行,这款工具并非来自权威安全厂商或知名研究小组。为了让戏更足...

    ittongluren

扫码关注云+社区

领取腾讯云代金券