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

栏目: PHP · 发布时间: 5年前

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

原文地址

Genesis Explained Framework Filters

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 . " 啊啊啊啊啊";
}
Genesis框架从入门到精通(7): 框架的过滤器

更改字符串

更改字符串的操作会略有不同,需要保留原有字符串的某些部分并构建新内容,可能需要通过追加字符串或使用某些高级的方法,比如 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): 框架的过滤器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

小群效应

小群效应

徐志斌 / 中信出版集团 / 2017-11 / 58.00元

互联网经济时代,新零售、网红经济、知识经济多受益于社群。用户的获取、留存及订单转化直接决定了一个社群的存亡。无论是“做”群还是“用”群,每个人都需要迭代常识:了解用户行为习惯,了解社群运行规律。 《社交红利》《即时引爆》作者徐志斌历时两年,挖掘腾讯、百度、豆瓣的一手后台数据,从上百个产品中深度解读社群行为,通过大量生动案例总结出利用社交网络和海量用户进行沟通的方法论。 本书将告诉你: ......一起来看看 《小群效应》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器