前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Genesis框架从入门到精通(7): 框架的过滤器

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

作者头像
丘壑
发布2019-03-13 10:22:44
8260
发布2019-03-13 10:22:44
举报
文章被收录于专栏:一丘一壑一丘一壑

原文地址

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 里创建的)。我们会找到:

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

代码语言:javascript
复制
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 字符串,所以必须使用连接运算符(.)将它们放在一起。如果你的文字不需要翻译,可以不使用 __()只需这样写:

代码语言:javascript
复制
return '<span class="no-posts">Sorry, no posts were found for your search.</span>';

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

代码语言:javascript
复制
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()函数的末尾,你将找到这行代码:

代码语言:javascript
复制
echo apply_filters( 'genesis_footer_output', $output, $backtotop_text, $creds_text );

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

代码语言:javascript
复制
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替换它。

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

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

代码语言:javascript
复制
<?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 中的实例代码地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文地址
  • 译文
  • 替换字符串
  • 更改字符串
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档