50个WordPress过滤钩子(1-10)

在本系列的第一篇文章中,我们在WordPress的上下文中介绍了过滤钩子的定义。在这个教程,我们将开始学习所选的50个过滤钩子,并举例说明每个钩子是做什么的。

话不多说,下面我们就开始介绍第一批50个过滤钩子。

修改默认登录提示错误信息

当登录出现错误提示时,Wordpress泄露了太多信息,例如:“用户barisunver 输入密码错误”,这意味着黑客可以尝试使用不同的用户名去匹配密码,有了过滤钩子,你就可以禁用此类错误提示信息。

样例:解决泄露信息过多问题

以下代码将所有的错误登录提示信息重置为空字符串,防止黑客轻易尝试出我们的账号密码信息。

<?php
add_filter( 'login_errors', 'login_errors_example' );
function login_errors_example( $error ) {
    $error = '';
    return $error;
}
?>

评论完成后重定向到其他页面

在wordpress中,当你发表完评论后,会仍然停留在同个页面,这个是符合逻辑的。但通过过滤钩子,你可以在完成评论后自动重定向到其他页面。comment_post_redirect钩子就可以让我们实现这点。下面是本过滤钩子完美样例。

样例:评论成功后将用户重定向到订阅页面

评论通常都跟随在博客文章的下方,如果在评论完成后将其重定向到另一页面,其内容为:“感谢您的评论,您是否想订阅我的博客呢?”我们就有可能将评论者转化为订阅者,有了可爱的comment_post_redirect钩子过滤,这个任务就很容易可完成。

<?php
add_filter( 'comment_post_redirect', 'comment_post_redirect_example' );
function comment_post_redirect_example( $location ) {
    return '/thanks-for-your-comment/';
}
?>

请注意在wordpress在此处使用了wp_safe_redirect(),意味着必须使用本地页面或者允许的主机页面(见下文中的过滤钩子allowed_redirect_hosts)

使用wp_safe_redirect()函数允许外域重定向

wp_safe_redirect()函数默认只允许wordpress安装后的域名内重定向,不允许外域链接重定向,但通过wp_safe_redirect()这个函数,可以轻易添加外域(相当于添加域名白名单)

样例:允许外域重定向

<?php
add_filter( 'allowed_redirect_hosts', 'allowed_redirect_hosts_example' );
function allowed_redirect_hosts_example( $content ) {
    $content[] = 'forum.mywebsite.com';
    $content[] = 'welcome.mywebsite.com';
    $content[] = 'help.mywebsite.com';
    return $content;
}
// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/allowed_redirect_hosts
?>

给<body>标签增加自定义CSS类

body_class()函数功能强大,它在不同的页面情况下提供了不同的相应语义化的CSS 标签,使CSS 样式更为有效。使用同名的body_class过滤钩子,可以增加或者删除CSS 类。

样例:给文章页面的<body>标签增加以分类名命名的类名

如果你想为每个分类目录设定不同的风格,可以用过滤钩子body_class来实现,办法是在单个文章页面的body标签中增加分类名称样式,见以下代码:

<?php
add_filter( 'body_class', 'body_class_example' );
function body_class_example( $classes ) {
    if( is_single() ) {
        foreach( get_the_category( get_the_ID() ) as $category )
            $classes[] = 'cat-' . $category->category_nicename;
    }
    return $classes;
}
// Example source: https://codex.wordpress.org/Function_Reference/body_class#Add_Classes_By_Filters
?>

若有个分类目录叫“world”, 那么在该分类的页面下会在<body> 标签中发现 .cat-world这个类。

更改区域设置设置网站语言

WordPress为全球最佳内容管理系统,因为其支持多语言环境,locale过滤钩子可以让我们在某些情况下设置不同语言。

样例:使用URL参数设置网站的语言

如果你有一个多语言网站,切换网站语言最简单的解决办法就是通过URL参数来实现,见以下代码:

<?php
add_filter( 'locale', 'locale_example' );
function locale_example( $lang ) {
    if ( 'tr' == $_GET['language'] ) {
        return 'tr_TR';
    } else {
        return $lang;
    }
}
// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/locale
?>

当访问类似mywebsite.com/?language=tr参数网址时候,你的网站语言将切换为土耳其语(Turkish)。当然,并非指的文章的内容,但应该也算是个良好的开端。

过滤用户名的不安全字符

WordPress可以用sanitize_user()的函数处理用户名,可以使用同名的过滤钩子定制函数。

样例:只接受小写用户名

如果你不想让用户输入大写用户名(不管是“SHOUTINGBOY88” 还是“CrazyGirl92”),均可使用PHP的strtolower函数来hook 这个sanitize_user函数。

<?php
add_filter( 'sanitize_user', 'strtolower' );
// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/sanitize_user
?>

这个应该是本系列中最为简单的过滤钩子了。

过滤文章文本内容

这个不需作过多介绍了,the_content过滤器即可允许我们更改文章内容。

样例:移除包裹在<img>标签上的<p>标签

WordPress默认并不允许我们单独在一个段落中展示图片——它会自动添加一个<p>到图片中,这个问题一直困扰着我,如果你也有同样的困惑,可以使用以下的代码段去除这些标签。

<?php
add_filter( 'the_content', 'the_content_example' );
function the_content_example( $content ) {
    return preg_replace('/<p>\s*(<a .*>)?\s*(<img .* \/>)\s*(<\/a>)?\s*<\/p>/iU', '\1\2\3', $content);
}
// Example source: http://wpsnipp.com/index.php/functions-php/remove-p-tag-from-around-images-in-the_content/
?>

自定义WordPress 密码文章提示文字

对于那些设置了密码保护的文章,WordPress将以默认的密码提示文字替换文章内容。使用the_password_form过滤钩子,你就可以自定义上述提示信息。

样例:让密码提示信息更为简洁

若你的站点有很多的密码保护文章,而你又不想让其反复出现“This post is password protected(本文有密码保护)”烦人字样,可以使用下列代码段让其更为简洁和人性化。

<?php
add_filter( 'the_password_form', 'the_password_form_example' );
function the_password_form_example() {
    $output  = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">';
    $output .= '<span>' . __( "Enter the password:" ) . ' </span>';
    $output .= '<input name="post_password" type="password" size="20" />';
    $output .= '<input type="submit" name="Submit" value="' . esc_attr__( "Go" ) . '" />';
    $output .= '</form>';
    return $output;
}
// Example source: http://codex.wordpress.org/Using_Password_Protection#Password_Form_Text
?>

就这样,只需一行三两个字:一个密码输入框,一个提交按钮即可解决问题。

过滤the_terms()函数

如果你对the_terms()函数的输出不满意,或者只是做些简单改变,可以使用同名的过滤钩子the_terms

样例:用the_terms()函数去除html标签

几年前,我花了很多时间设法让其去除HTML标签(纯文本),最后却发现有如此简单的解决办法。见代码:

<?php
add_filter( 'the_terms', 'strip_tags' );
?>

当我发现可以仅用the_terms过滤钩子Hook到PHP函数即可解决时万分诧异。

修改发送的默认的Email 地址

当WordPress 程序发送邮件的时候,它会使用类似wordpress@yourwebsite.com的邮箱地址作为发件人。借助下面这个过滤钩子,你可以修改它并且自定义发件人的Email 地址。

样例:将你自己的邮箱设置为“发件人”邮箱地址

你可以使用下面代码样例,将你自己的邮箱设置为“发件人”邮箱地址:

<?php
add_filter( 'wp_mail_from', 'wp_mail_from_example' );
function wp_mail_from_example( $email ) {
    return 'my.email.address@mywebsite.com';
}
?>

此处可以和wp_mail_from_name配合使用:同样的逻辑,你只要自定义返回的参数的值,你就可以将其自定义为需要的用户名了。

总结

在本文中我们已经学习了50个过滤钩子中的10个,希望你喜欢并能从中学习到新知识。

希望看到大家的想法:你是如何看待这些过滤钩子的?请在评论中写下建议和看法吧。如果你喜欢这些文章,也别忘了将他们分享给你的好友,下个教程再见。

原文出自:http://code.tutsplus.com/tutorials/50-filters-of-wordpress-the-first-10-filters–cms-21295