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): 框架的过滤器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Python源码剖析

Python源码剖析

陈儒 / 电子工业出版社 / 2008-6 / 69.80元

作为主流的动态语言,Python不仅简单易学、移植性好,而且拥有强大丰富的库的支持。此外,Python强大的可扩展性,让开发人员既可以非常容易地利用C/C++编写Python的扩展模块,还能将Python嵌入到C/C++程序中,为自己的系统添加动态扩展和动态编程的能力。. 为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Pyth......一起来看看 《Python源码剖析》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具