介绍50个 WordPress 动作挂钩(11-20)

就让心静静地置于时光的一隅,用一片花香的暖,守候心灵的风景,正如世间每一种长久的缘都要悉心来呵护。经年后,那久久留存在心底的目光,是微细的心,是相知的暖。一梦许是无痕,一梦花又盛开。年复一年,碾过昔日的足迹,我的灵魂睡在那些温暖的文字里,与感恩和快乐相依,或喜或泣,皆是生活的一脉馨香。 "
本文是《50个 WordPress 动作挂钩》专题的第 4 篇,共 7 篇:
  • 介绍50个 WordPress 动作挂钩
  • 介绍50个 WordPress 动作挂钩(1-10)
  • 介绍50个 WordPress 动作挂钩(21-30)
  • 介绍50个 WordPress 动作挂钩(11-20)
  • 介绍50个 WordPress 动作挂钩(31-40)
  • 介绍50个 WordPress 动作挂钩(41-50)
  • 介绍50个 WordPress 动作挂钩(总结)

在该系列的上一个部分,我们已经介绍了10个动作挂钩,在本篇好代码教程中,我们继续通过例子来学习下来的10个挂钩。

处理默认 WordPress 样式

WordPress 有很多CSS文件,可以在后台和前台调用。通过 wp_default_styles 挂钩,我们可以修改 WordPress 的默认样式。

从 WordPress 后台移除 ie.css

如果只有你自己使用网站后台,而且不会使用IE浏览器,那就没必要加载修正IE所用的CSS文件,对吗?那你可以使用下面的代码来移除 ie.css:

1
2
3
4
5
6
7
8
9
<?php

add_action( 'wp_default_styles', 'wp_default_styles_example' );

function wp_default_styles_example( $wp_styles ) {
    $wp_styles->remove( 'ie' );
}

?>

<?php add_action( 'wp_default_styles', 'wp_default_styles_example' ); function wp_default_styles_example( $wp_styles ) { $wp_styles->remove( 'ie' ); } ?>

事实上,我甚至认为 WordPress 可以不需要这个文件了,毕竟 ie.css 是为了修复 IE7和以下版本,据我所知,现在IE7的份额已经跌至 1% 以下了。

处理 get_footer() 函数

如果你要用到 get_footer() 函数,你不必进一步研究,直接可以通过 get_footer 挂钩来处理。

在页脚添加 JavaScript

比方说,你有一些 jQuery 代码需要添加到页脚,你可以使用下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

add_action( 'get_footer', 'get_footer_example' );

function get_footer_example( $name ) {
    if ( 'new' == $name ) { ?>
        <script>
            (function( $ ) {
                //put all your jQuery goodness in here.
            })( jQuery );
        </script>
    <?php
    }
}

// Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/get_footer

?>

<?php add_action( 'get_footer', 'get_footer_example' ); function get_footer_example( $name ) { if ( 'new' == $name ) { ?> <script> (function( $ ) { //put all your jQuery goodness in here. })( jQuery ); </script> <?php } } // Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/get_footer ?>

上面我们使用了一些JavaScript代码在这个例子中,但你几乎可以在页脚中运行任何代码。

初始化管理面板

这个方便的小功能,在每次访问后台管理页面的时候被触发,所以它有很多不同的用途。只要是有创意!

禁止非管理员访问管理面板

假设你不希望订阅者访问管理面板,你网站也没有任何投稿者、作者和编辑,要想重定向所有非管理员到网站首页,你可以使用下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

add_action( 'admin_init', 'admin_init_example', 1 );

function admin_init_example() {
    if ( ! current_user_can( 'manage_options' ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
        wp_redirect( site_url() ); 
        exit;
    }
}

// Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init

?>

<?php add_action( 'admin_init', 'admin_init_example', 1 ); function admin_init_example() { if ( ! current_user_can( 'manage_options' ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) { wp_redirect( site_url() ); exit; } } // Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init ?>

如有需要,你可以修改重定向地址,仅仅删除 site_url() 然后在单引号填写其他网址即可(比如 'http://www.google.com/')

走进验证进程

这个挂钩的介绍文档中只有简单的一句:“用来在用户登录的时候进行验证”。

允许邮箱地址作为用户名进行登录

WordPress 默认不允许使用用户的邮箱进行登录 —— 你不得不记住你的用户名。如果你的用户总是会忘记他们的用户名,那你可以使用下面的代码,然后告诉你的用户也可以使用邮箱登录网站哦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

add_action( 'wp_authenticate', 'wp_authenticate_example' );

function wp_authenticate_example( $username ) {
    $user = get_user_by( 'email', $username );
    if ( ! empty( $user->user_login ) ) {
        $username = $user->user_login;
    }
    return $username;
}

// Example Source: http://bavotasan.com/2011/log-in-to-wordpress-using-an-email-address/

?>

<?php add_action( 'wp_authenticate', 'wp_authenticate_example' ); function wp_authenticate_example( $username ) { $user = get_user_by( 'email', $username ); if ( ! empty( $user->user_login ) ) { $username = $user->user_login; } return $username; } // Example Source: http://bavotasan.com/2011/log-in-to-wordpress-using-an-email-address/ ?>

关联文章:让WordPress支持用户名或邮箱登录

玩转登录表单

login_form 挂钩允许我们操控经典的WordPress 登录表单。

在登录表单显示警告信息

在上面的例子中,我们展示了如何让你的用户使用他们的邮箱登录网站,如果你不喜欢这样修改,你可以告诉他们,不能使用他们的邮箱地址登录网站:

1
2
3
4
5
6
7
8
9
<?php

add_action( 'login_form', 'login_form_example' );

function login_form_example() {
    echo '<p><strong>Remember:</strong> You must enter your username, not your email address!</p>';
}

?>

<?php add_action( 'login_form', 'login_form_example' ); function login_form_example() { echo '<p><strong>Remember:</strong> You must enter your username, not your email address!</p>'; } ?>

当然, 你还可以设置为其他信息,比如“如果你在一台公用电脑上登录,不要点击‘记住我’!”或者其他任何信息,包括HTML代码。

处理管理菜单项

就想定义说的一样“在基础的管理菜单结构到位之后运行”,admin_menu 挂钩让我们可以从WordPress管理菜单中删除菜单项(包括子菜单项),或者添加新菜单项(包括子菜单项)到管理菜单中。

去除不该被客户看到的菜单项

这是一个对开发者来说非常熟悉的场景:客户需要访问一个特定插件的设置界面,但是他们不应该去修改WordPress自身设置页面的任何设置。

简而言之,有些页面是客户必须访问的,而有些是不应该访问的。下面的例子就可以帮助我们从管理菜单中移除菜单项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

if ( ! current_user_can( 'manage_options' ) ) {
    add_action( 'admin_menu', 'admin_menu_example' );
}

function admin_menu_example() {
  remove_menu_page( 'index.php' );                  //Dashboard
  remove_menu_page( 'edit.php' );                   //Posts
  remove_menu_page( 'upload.php' );                 //Media
  remove_menu_page( 'edit.php?post_type=page' );    //Pages
  remove_menu_page( 'edit-comments.php' );          //Comments
  remove_menu_page( 'themes.php' );                 //Appearance
  remove_menu_page( 'plugins.php' );                //Plugins
  remove_menu_page( 'users.php' );                  //Users
  remove_menu_page( 'tools.php' );                  //Tools
  remove_menu_page( 'options-general.php' );        //Settings

}

// Example Source: http://wpsnippy.com/remove-top-level-wordpress-dashboard-menu/

?>

<?php if ( ! current_user_can( 'manage_options' ) ) { add_action( 'admin_menu', 'admin_menu_example' ); } function admin_menu_example() { remove_menu_page( 'index.php' ); //Dashboard remove_menu_page( 'edit.php' ); //Posts remove_menu_page( 'upload.php' ); //Media remove_menu_page( 'edit.php?post_type=page' ); //Pages remove_menu_page( 'edit-comments.php' ); //Comments remove_menu_page( 'themes.php' ); //Appearance remove_menu_page( 'plugins.php' ); //Plugins remove_menu_page( 'users.php' ); //Users remove_menu_page( 'tools.php' ); //Tools remove_menu_page( 'options-general.php' ); //Settings } // Example Source: http://wpsnippy.com/remove-top-level-wordpress-dashboard-menu/ ?>

记得根据自己的实际需要,注销或删除以上的某些代码行。

和 wp() 函数一起工作

一起来看下文档对于这个挂钩的介绍:

该挂钩在查询分析和文章加载之后,并且模板执行之前,在 WordPress 主函数 wp() 内执行。当你需要访问文章数据但是又不能使用模板来输出时,这个挂钩就非常有用。

简而言之,它在查询加载之后触发。

快速添加 WordPress 定时任务

虽然定时任务(cron jobs)通常被挂载到 plugin activation hook,但我们也是可以使用 wp 这个挂钩来挂载定时任务的。让我们看下官方文档中的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

add_action( 'wp', 'prefix_setup_schedule' );

/**
 * On an early action hook, check if the hook is scheduled - if not, schedule it.
 */
function prefix_setup_schedule() {
    if ( ! wp_next_scheduled( 'prefix_hourly_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'prefix_hourly_event');
    }
}

add_action( 'prefix_hourly_event', 'prefix_do_this_hourly' );

/**
 * On the scheduled action hook, run a function.
 */
function prefix_do_this_hourly() {
    // do something every hour
}

// Example Source: http://codex.wordpress.org/Function_Reference/wp_schedule_event

?>

<?php add_action( 'wp', 'prefix_setup_schedule' ); /** * On an early action hook, check if the hook is scheduled - if not, schedule it. */ function prefix_setup_schedule() { if ( ! wp_next_scheduled( 'prefix_hourly_event' ) ) { wp_schedule_event( time(), 'hourly', 'prefix_hourly_event'); } } add_action( 'prefix_hourly_event', 'prefix_do_this_hourly' ); /** * On the scheduled action hook, run a function. */ function prefix_do_this_hourly() { // do something every hour } // Example Source: http://codex.wordpress.org/Function_Reference/wp_schedule_event ?>

注意:这里还有另外一个挂钩 prefix_hourly_event,它是在同样的代码片段中自动创建的,作为 wp_schedule_event() 函数的第三个参数。

控制管理面板页面的 <head>

有各种挂钩(动作和过滤)在他们的名字上就包含了“参数”。admin_head-(page_name) 就是其中之一,它会在定义了参数的这个特定管理页面的<head> 中调用。

更改仪表盘的列数

我使用一个 22吋 的显示器,自从 WordPress 3.8 以后,我被迫使用4列仪表盘,这让我非常烦恼。我不能确定为什么我不能像之前那样设置列数,好在我发现了下面这个代码可以解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

add_action( 'admin_head-index.php', 'admin_head_index_php_example' );

function admin_head_index_php_example() {
    add_screen_option(
        'layout_columns',
        array(
            'max'     => 3,
            'default' => 3
        )
    );
}

// Example Source: http://wpsnippy.com/bring-back-dashboard-screen-layout-options-wordpress-3-8/

?>

<?php add_action( 'admin_head-index.php', 'admin_head_index_php_example' ); function admin_head_index_php_example() { add_screen_option( 'layout_columns', array( 'max' => 3, 'default' => 3 ) ); } // Example Source: http://wpsnippy.com/bring-back-dashboard-screen-layout-options-wordpress-3-8/ ?>

现在我可以像过去那样根据屏幕宽度来更改列数。虽然我还是没办法在笔记本上设置超过2列,但我认为我可以这样将就使用。

在工具条渲染前定制它

WordPress 的工具条,就是之前的管理栏,是一个伟大和有用的导航元素,可以在后台和前台帮助我们。wp_before_admin_bar_render 挂钩可以帮助我们在它渲染前进行交互操作。

添加一个新项目到工具条

如果你想要添加一个快捷链接让客户可以联系到你,你可以使用下面的代码添加一个链接到工具条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

add_action( 'wp_before_admin_bar_render', 'wp_before_admin_bar_render_example' ); 

function wp_before_admin_bar_render_example() {
    global $wp_admin_bar;
    $wp_admin_bar->add_node( array(
        'id'    => 'contact-designer',
        'title' => 'Contact Designer',
        'href'  => 'http://barisunver.com.tr/contact/',
        'meta'  => array( 'target' => '_blank' )
    ) );
}

?>

<?php add_action( 'wp_before_admin_bar_render', 'wp_before_admin_bar_render_example' ); function wp_before_admin_bar_render_example() { global $wp_admin_bar; $wp_admin_bar->add_node( array( 'id' => 'contact-designer', 'title' => 'Contact Designer', 'href' => 'http://barisunver.com.tr/contact/', 'meta' => array( 'target' => '_blank' ) ) ); } ?>

很简单,不是吗?你可以多次使用 add_node() 函数添加更多链接哦。

处理个人资料更新

profile_update 挂钩让我们获取和处理用户数据后更新到数据库中。

通知用户个人资料更新

假设你想要在用户每次更新了个人资料时通知他。通过下面的钩子和小函数,你可以做到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

add_action( 'profile_update', 'profile_update_example' );

function profile_update_example( $user_id ) {
    $site_url = get_bloginfo( 'name' );
    $user_info = get_userdata( $user_id );
    $user_name = $user_info->display_name;
    $user_email = $user_info->user_email;
    $subject = "Profile updated";
    $message = "Hello $user_name,\n\nYour profile has been updated! Please contact us if you're not the one who changed your profile.\n\nThank you for visiting $site_name.";
    wp_mail( $user_email, $subject, $message );
}

// Example Source: http://wpsnipp.com/index.php/functions-php/send-email-notification-when-profile-updates/

?>

<?php add_action( 'profile_update', 'profile_update_example' ); function profile_update_example( $user_id ) { $site_url = get_bloginfo( 'name' ); $user_info = get_userdata( $user_id ); $user_name = $user_info->display_name; $user_email = $user_info->user_email; $subject = "Profile updated"; $message = "Hello $user_name,\n\nYour profile has been updated! Please contact us if you're not the one who changed your profile.\n\nThank you for visiting $site_name."; wp_mail( $user_email, $subject, $message ); } // Example Source: http://wpsnipp.com/index.php/functions-php/send-email-notification-when-profile-updates/ ?>

在我看来,这是一个简单但有效的安全措施。但是它不是一直有效的,因为如果一个潜在的黑客更改用户的电子邮件地址,电子邮件将被发送到新的电子邮件地址。

小结

我们已经介绍完了 50 个动作挂钩的第二部分,希望你们喜欢和从中学到新东西。下节课再见!

我也希望能听听你们的想法,对于这些挂钩,你们有什么想说的?在下面评论告诉我,如果你喜欢这篇文章,不要忘记分享哦!

  • 原文出自:http://code.tutsplus.com/tutorials/fifty-actions-of-wordpress-50-examples-11-to-20--cms-21579
  • 由 稻草人@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。

以上就是介绍50个 WordPress 动作挂钩(11-20)。立下人生志向,活出人生精彩;铺好这天沙石,走出明天大道。更多关于介绍50个 WordPress 动作挂钩(11-20)请关注haodaima.com其它相关文章!

标签: WordPress