本文为系列第四篇,原文:50 Filters of WordPress: Filters 21-30 原文地址
在过去的两篇文章中,我们总共介绍了20个WordPress 的过滤器。在本文中,我们将接触其他类型的过滤器,一如既往,有例子予以加深理解。
本系列文章翻译自tutsplus,原作者为Barış Ünver,翻译人:Jeff,转载请注明原始来源及翻译人,谢谢!
本文若有修正,不会更新于本页,只会更新到Github项目地址上。
让我们开始吧!
过滤搜索查询
在一个WordPress 站点中,搜索是最常用到的功能。借助这个过滤器,你可以非常灵活地处理SQL 查询。
在搜索结果中包含密码保护文章
让我们假设这么个场景:你将你客户的信息写在文章中,且文章全部都是设置了密码保护。然后你将密码告诉了你的客户。
如果你的客户需要搜索相关关键词而非一篇篇文章手动寻找,那么你可以用下面的代码使得在搜索结果中包含密码保护文章。
<?php add_filter( 'posts_search', 'posts_search_example' ); function posts_search_example( $search ) { global $wpdb; if( !is_user_logged_in() ) { $pattern = " AND ({$wpdb->prefix}posts.post_password = '')"; $search = str_replace( $pattern, '', $search ); } return $search; } // Example source: http://wpsnipp.com/index.php/functions-php/include-password-protected-posts-in-search-results/ ?> |
如果你的网站的客户是注册用户,那么你不必用上面的代码:只要他们登录了就能搜索密码保护文章的数据——当然,他们依然不能看到全文除非输入密码。
设置上传图片的压缩率
默认的,WordPress 会对上传到多媒体的图片进行压缩,通过wp_editor_set_quality
这个过滤器,你可以修改压缩率或者禁止这个压缩功能。
例子:禁止WordPress 压缩图片
<?php add_filter( 'wp_editor_set_quality', 'wp_editor_set_quality_example' ); function wp_editor_set_quality_example( $quality ) { return 100; } ?> |
过滤文本小工具
WordPress 默认的小工具都有相关的过滤器。比如文本小工具的就是widget_text
。
让文本小工具支持短代码
<?php add_filter( 'widget_text', 'do_shortcode' ); ?> |
过滤feed 中的文本内容
正如过滤文章的文本内容是通过the_content
函数,你可以过滤feed的文本内容,相关函数是the_content_feed
。
例子:在feed中插入特色图像
在feed中插入特色图像应该有不少人有这个需求,下面就给出这个例子代码:
<?php add_filter( 'the_content_feed', 'the_content_feed_example' ); function the_content_feed_example( $content ) { $featured_image = ''; $featured_image = get_the_post_thumbnail( get_the_ID(), 'thumbnail', array( 'style' => 'float:left;margin-right:.75em;' ) ); $content = get_the_excerpt() . ' <a href="'. get_permalink() .'">' . __( 'Read More' ) . '</a>'; if( '' != $featured_image ) $content = '<div>' . $featured_image . $content . '<br style="clear:both;" /></div>'; return $content; } ?> |
如果你想特色图像的布局是在右侧,那么你需要将代码中的float:left;margin-right:.75em;
改为float:right;margin-left:.75em;
。
修改可视化编辑器的按钮
WordPress 中默认的编辑器叫TinyMCE,通过这个mce_buttons
过滤器,我们可以改变编辑器中第一栏的布局:
移除可视化编辑器中不想要的按钮
<?php add_filter( 'mce_buttons', 'mce_buttons_example' ); function mce_buttons_example( $buttons ) { $remove_array = array( 'strikethrough', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'wp_more', 'wp_adv' ); // full list (WP version 3.9) // 'bold', 'italic', 'strikethrough', 'bullist', 'numlist', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker', 'fullscreen', 'wp_adv' foreach( $remove_array as $remove ) { if ( ( $key = array_search( $remove, $buttons ) ) !== false ) unset( $buttons[ $key ] ); } return $buttons; } ?> |
正如我所说,上面的mce_buttons
过滤器是处理第一栏的,如果你想对第二栏或第三栏的按钮进行自定义,那么久过滤相关函数吧:mce_buttons_2
或mce_buttons_3
。
排除列表中的某些分类
例子:排除插件创建的分类
想象下你开发了个插件需要创建两个分类:"Favorited-MyPlugin" 和 "Hated-MyPlugin"。如果你要在列表中排除这两个分类,你可以用下面的代码:
<?php add_filter( 'list_terms_exclusions', 'list_terms_exclusions_example', 10, 2 ); function list_terms_exclusions_example( $exclusions, $args ) { // IDs of terms to be excluded $exclude = "42,132"; $exterms = wp_parse_id_list( $exclude ); foreach ( $exterms as $exterm ) { if ( empty( $exclusions ) ) $exclusions = ' AND ( t.term_id <> ' . intval( $exterm ) . ' '; else $exclusions .= ' AND t.term_id <> ' . intval( $exterm ) . ' '; } if ( !empty( $exclusions ) ) $exclusions .= ')'; return $exclusions; } // Example source: http://shailan.com/2598/how-to-exclude-categories-and-tags-from-your-widgets/ ?> |
修改下拉列表的图片尺寸
如果你打算插入张图片在你的文章中,你需要提前确定图片的尺寸。下面的例子的过滤器允许我们添加自定义的图片尺寸(通过函数提前产生)到可选择的下拉列表中。
例子:让读者选择自定义的图片尺寸
假设你已经创建了一个自定义图片样式命名为“golden-ratio-thumb”,你需要让你的编辑员在写文章时候能够选择你的图片样式,那么你需要这么做:
<?php add_filter( 'image_size_names_choose', 'image_size_names_choose_example' ); function image_size_names_choose_example( $sizes ) { return array_merge( $sizes, array( 'golden-ratio-thumb' => __( 'Golden Ratio Thumbnail' ) ) ); } // Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/image_size_names_choose ?> |
修改摘要中的more标签
WordPress 默认的在首页输出的摘要会截取55 个单词,余下的会用[...]
代替之。幸运的是,excerpt_more
这个过滤器让我们可以轻易修改之。
例子:在摘要后添加链接
<?php add_filter( 'excerpt_more', 'excerpt_more_example' ); function excerpt_more_example( $text ) { global $post; return '... <a class="read-more-link" href="' . get_permalink( $post->ID ) . '">Read more</a>'; } ?> |
管理文章列表的栏目
在仪表盘的所有文章页面,你可以查看你当前发表的文章——包括其他诸如作者、分类、标签的额外信息。manage_posts_columns
函数允许我们通过动作机制隐藏或增加文章。
移除作者栏目
如果你是你的WordPress 网站的唯一一个作者,那就没必要显示作者这个栏目啦,下面的函数可以干掉之:
<?php add_filter( 'manage_posts_columns', 'manage_posts_columns_example' ); function manage_posts_columns_example( $columns ) { unset( $columns['author'] ); return $columns; } ?> |
其他几个栏目的名称分别是:cb (the checkboxes)、title、author、categoriestags、comments、date
如果你的是自定义文章类型,可以使用类似manage_$post_type_posts_columns
的函数,$post_type
为你的文章类型id。
编辑用户联系信息相关表单
你想在用户信息那个页面删除或添加部分表单吗?借助下面的user_contactmethods
过滤器就可以做到。
添加新的社交网络账号
这个功能需求应该很大——你可以看看WordPress居然还在用着AIM、Jabber这两个通讯方式。下面的代码可以实现删除之病添加新的几个:
<?php add_filter( 'user_contactmethods', 'user_contactmethods_example' ); function user_contactmethods_example( $contactmethods ) { unset( $contactmethods['yim'] ); unset( $contactmethods['aim'] ); unset( $contactmethods['jabber'] ); $contactmethods['facebook'] = 'Facebook'; $contactmethods['twitter'] = 'Twitter'; $contactmethods['gplus'] = 'Google+'; $contactmethods['linkedin'] = 'LinkedIn'; $contactmethods['instagram'] = 'Instagram'; return $contactmethods; } ?> |
总结
ye~又搞定一篇了,翻译得好累!