内容简介:欢迎再次来到Genesis从入门到精通系列教程。请注意,这是一个系列教程,建立在前面的文章基础上,所以如果你没看过前一篇过滤器的文章,去看看。所有文章都可以在Genesis Explained标签中找到。
原文地址
Genesis Explained Framework Filters
译文
欢迎再次来到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>© Copyright 2012 <a href="http://mydomain.com/">My Domain</a> · All Rights Reserved · Powered by <a href="http://wordpress.org/">WordPress</a> · <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 中的实例代码地址
以上所述就是小编给大家介绍的《Genesis框架从入门到精通(7): 框架的过滤器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。