50个WordPress过滤钩子(21-30)

在本系列之前的两篇文章中,我们学习过了20个WordPress 的过滤钩子。在本文中,我们将继续学习其他类型的过滤钩子。

过滤搜索查询

在WordPress 站点中,搜索是非常重要的功能之一(某种意义上来说也是最基础功能)。有了posts_search过滤器,便可灵活使用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中的压缩导致的图片细微变形,如果你的网站客户眼光锐利(比如设计师),你就可以让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。

样例:让文本小工具支持简码

让人困扰的是默认情况下WordPress不允许在文本小工具中使用简码,幸好有了这个过滤钩子,让我们在小工具中也能支持简码的使用。

<?php
add_filter( 'widget_text', 'do_shortcode' );
?>

难道没有办法hook到一个函数上吗?其实有个名为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、mce_buttons_4。

排除列表中的某些分类

我们在网站中经常会有从分类列表中排除某些分类的需求,就像这个过滤钩子名字显示的那样,它可以帮我们轻松实现。

样例:排除插件所创建的分类

设想下你开发了个插件,需要创建两个分类:”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/ 
?>

这是个很有趣的特性,这个过滤钩子也可让其在后台隐藏,好玩吧。

修改下拉列表中的图片尺寸

如果打算在你的文章中插入图片,你需要事先确定图片的尺寸。下面的例子的过滤钩子允许我们添加自定义的图片尺寸(通过add_image_size()函数提前产生)到下拉选择列表中。

样例:让作者选择自定义的图片尺寸

假设你已经创建了一个名为“golden-ratio-thumb” 的自定义图片样式,你需要让你的编辑者在写文章时候能够选择上述图片尺寸,将其加入到<select>选项卡,按下列代码写就可以了

<?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>';
}
?>

经过修改后,Read more就变成了文章链接了,显得更有意义。

管理文章列表的栏目

在管理面板仪表盘的所有文章页面,你可以查看你所发表的文章——包括其他的如作者、分类、标签的额外信息。

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
  • categories
  • tags
  • comments
  • date

其他七个默认显示的栏目列(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;
}
?>

经过这样修改,用户信息表单看上去就更能与时俱进了。

第三部分总结

在本文中我们完成了50个过滤钩子的部分学习内容,希望你喜欢并能从中学到新知识。请留下您的建议意见,当然也别忘了把你觉得好的文章分享给你的好友哦,下个教程我们再见。

原文出自:http://code.tutsplus.com/tutorials/50-filters-of-wordpress-filters-21-30–cms-21298