介绍50个 WordPress 动作挂钩(31-40)

如果你是刚加入我们,我们正在介绍 WordPress 可用动作挂钩中的 50 个,在上一篇文章中,我们介绍了 21-30 个,下面我们将继续学习其他挂钩。

如果你还没有看过之前的文章,我建议返回去阅读“概览介绍”这篇文章,然后阅读之后的文章,这样你才能跟上我们的节奏。

闲言少叙,让我们继续吧!

控制默认的JavaScript代码

WordPress在它的核心中提供了很多我们可以加载的脚本。wp_default_scriptsaction允许我们干预默认的JavaScript文件加载。

从WordPress站点中移除“jQuery Migrate”

如果你在使用jQuery,而且确认你的代码对1.9以及更高版本的jQuery是兼容的,那么你就不需要jQuery Migrate插件来支持jQuery中被废弃的代码。这里有如何取消这个插件的例子:

<?php
add_action( 'wp_default_scripts', 'wp_default_scripts_example' );
function wp_default_scripts_example( &$scripts ) {
    if ( ! is_admin() ) {
        $scripts->remove( 'jquery' );
        $scripts->add( 'jquery', false, array( 'jquery-core' ) );
    }
}
// Example Source: http://aahacreative.com/2013/08/05/remove-jquery-migrate-wordpress-36/
?>

如果你在使用jQuery,而且确认你的代码对1.9以及更高版本的jQuery是兼容的,那么你就不需要jQuery Migrate插件来支持jQuery中被废弃的代码。这里有如何取消这个插件的例子:

你的前端中的<head>标签

这个动作(action)是在wp_head()函数中触发的,因此你可以在你的前端代码的<head>元素中插入一些内容。

在你的站点中使用Open Graph

Open Graph是一个非常重要的协议,它用来帮助一些例如Facebook,Google和Twitter等大型网站来解析你的网页。你可以定义特色图片,标题,概述等等,如果你给这个协议提供了相关信息,这样可以有助于那些网站来为你的网页构建结构性、合理性的数据。

让我们来看看如何使用这个协议并且把Open Graph相关的元数据插入到页面的<head>元素中:

<?php
add_action( 'wp_head', 'wp_head_example' );
function wp_head_example() {
    global $post;
    // default image
    $site_logo = get_stylesheet_directory_uri() . '/images/logo.png';
    // homepage
    if ( is_home() ) {
        echo '<meta property="og:type" content="website" />';
        echo '<meta property="og:url" content="' . get_bloginfo( 'url' ) . '" />';
        echo '<meta property="og:title" content="' . esc_attr( get_bloginfo( 'name' ) ) . '" />';
        echo '<meta property="og:image" content="' . $site_logo . '" />';
        echo '<meta property="og:description" content="' . esc_attr( get_bloginfo( 'description' ) ) . '" />';
    }
    // single post or page
    elseif ( is_singular() ) {
        echo '<meta property="og:type" content="article" />';
        echo '<meta property="og:url" content="' . get_permalink() . '" />';
        echo '<meta property="og:title" content="' . esc_attr( get_the_title() ) . '" />';
        if ( has_post_thumbnail( $post->ID ) ) {
            $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'large' );
            echo '<meta property="og:image" content="' . esc_attr( $image[0] ) . '" />';
        } else
            echo '<meta property="og:image" content="' . $site_logo . '" />';
        echo '<meta property="og:description" content="' . esc_attr( get_the_excerpt() ) . '" />';
    }
}
// Example Source: http://wpdevsnippets.com/set-opengraph-meta-tags-fix-facebook-share/
?>

初始化主题

每当一个WordPress页面加载了主题文件后,就会触发after_setup_theme这个动作(action)。它将会在每次页面请求时调用,你可以将和主题相关的函数挂载到这个动作(action)上。

设定特定主题下的WordPress特色

这里有几种为主题启用WordPress特色的方法,例如文章格式或者特色图片,但是正确的方式应该是为这些功能创建一个函数,并且挂载这个函数到after_setup_theme动作(action)上。

<?php
add_action( 'after_setup_theme', 'after_setup_theme_example' );
function after_setup_theme_example() {
    add_editor_style();
    add_theme_support( 'post-formats', array( 'video', 'gallery' ) );
    add_theme_support( 'post-thumbnails' );
}
?>

看到了吧,现在我们的主题可以使用特色图片,我们发表视频或者画廊,并且我们的“可视化编辑器”可以拥有自己的样式文件使得更像前端。

在多媒体列表中添加自定义列

manage_media_custom_column这个动作(action)帮助我们添加自定义列到多媒体库中的已上传文件列表中。

在一个列中显示每个上传文件的ID

我真的很讨厌查找特色图片ID这个过程——需要从中一个文章的画廊中排除。幸运地是,我找到了这段代码可以在多媒体库中的已上传文件列表中显示出ID:

<?php
add_filter( 'manage_media_columns', 'manage_media_columns_example' );
add_action( 'manage_media_custom_column', 'manage_media_custom_column_example', 10, 2 );
function manage_media_columns_example( $columns ) {
    $columns[ 'wps_post_attachments_id' ] = __( 'ID', 'theme-name' );
    return $columns;
}
function manage_media_custom_column_example( $column_name, $attachment_id ){
    if ( 'wps_post_attachments_id' === $column_name ) {
        echo $attachment_id;
    }
}
// Example Source: http://wpsnipp.com/index.php/functions-php/media-library-admin-columns-with-attachment-id/
?>

希望你喜欢它!

评论状态的变化

每当一个评论的状态发生变化(批准、驳回、垃圾、或者放入回收站),一个名为transition_comment_status的动作就会被触发。之后,另一个带参数的动作将会被调用:comment_(old_status)_to_(new_status)。让我们看一下第二个动作的工作原理吧。

当评论被批准后给评论者发送邮件

假如你希望评论在被批准之后才能发表,但是你也需要在评论被发表后通知你的访问者。你可以把下面的代码作为一个插件实现邮件通知他们这个消息:

<?php
add_action( 'comment_unapproved_to_approved', 'comment_unapproved_to_approved_example' ); 
function comment_unapproved_to_approved_example( $comment ) {
    $commenter_email = $comment->comment_author_email;
    $commenter_name  = $comment->comment_author;
    $post_url = get_comment_link( $comment );
    $subject = "Your comment is up!";
    $message = "Hello $commenter_name,\n\nYour comment has been approved!You can view it below:\n\n$post_url\n\nThank you for sharing your ideas with us!";
    wp_mail( $commenter_email, $subject, $message );
}
?>

现在当他们的评论被批准后评论者会被通知。他们可能从邮件里打开你的文章以查看评论内容,并且还可能阅读其他内容。这个非常好的(简单的)方法可以获得回头客!

处理页面模板的加载

WordPress使用我们称之为“页面模板”来显示不同类型的页面,例如:一篇文章页面,首页,一个404错误页面,搜索结果显示页面,归档页面等等。template_redirect这个动作会在WordPress决定使用哪个模板时被触发。

当只有一个搜索结果时重定向到文章的地址

想要节省你的访问者的一次点击?下面的代码会让你通过一个特别的方法来实现:如果搜索结果只有一篇文章的话就直接给用户显示那篇文章页面而不是原来的搜索结果。

如果你要问我的话,这确实是个小把戏:

<?php
add_action( 'template_redirect', 'template_redirect_example' );
function template_redirect_example() {
    if ( is_search() ) {
        global $wp_query;
        if ( 1 == $wp_query->post_count && 1 == $wp_query->max_num_pages ) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
            exit;
        }
    }
}
// Example Source: http://www.elegantthemes.com/blog/tips-tricks/eight-useful-code-snippets-for-wordpress
?>

现在,如果有人搜索“guacamole”这个关键字,而且只有一篇文章提到了guacamole,访问者将会自动地重定向到这篇文章。

很酷,是吧?

处理WordPress的订阅(Feeds)

订阅是WordPress最古老的一个特色,而且还一直在使用着。通过do_feed(或者其他相关的动作)你可以控制订阅是被如何处理的。

移除WordPress所有的订阅

移除订阅链接使得对大多数人是不可用的,但是如果一个访问者知道你使用的是WordPress并且知道WordPress的订阅机制,他们可以试着在你的网址后面添加/feed/并且搜索订阅信息。怎么样才能真正地禁止订阅呢?下面的代码片段将会帮助你彻底禁止订阅:

<?php
add_action( 'do_feed',      'do_feed_example', 1 );
add_action( 'do_feed_atom', 'do_feed_example', 1 );
add_action( 'do_feed_rdf',  'do_feed_example', 1 );
add_action( 'do_feed_rss2', 'do_feed_example', 1 );
add_action( 'do_feed_rss',  'do_feed_example', 1 );
function do_feed_example() {
    wp_die( __( '<h1>Feed not available, please visit our <a href="' . get_bloginfo( 'url' ) . '">Home Page</a>!</h1>' ) );
}
// Example Source: http://wpdevsnippets.com/disable-rss-feed/
?>

很简单,对吗?

修改工具栏

工具栏(更正式的应该叫做管理员工具栏)是在3.1版本的WordPress中被引入的,而且这一点受到的褒贬不一——有人希望能彻底移除它,另一些人却无法离开它。不管怎么样,admin_bar_menu这个动作是往工具栏中添加子项目的主要钩子函数。

总是对所有用户显示工具栏

如果不会对你的网站设计风格造成很坏的影响的话工具栏可能是迟早都会有用处的——你可以使用内建的搜索框,并且增加例如登录或者联系链接的子菜单。

下面的代码演示了不管用户是否已经登录都会显示工具栏:

<?php
add_action( 'admin_bar_menu', 'admin_bar_menu_example' );
add_filter( 'show_admin_bar', '__return_true' , 1000 );
function admin_bar_menu_example( $wp_admin_bar ) {
    if ( ! is_user_logged_in() ) {
        $wp_admin_bar->add_menu( array( 'title' => __( 'Log In' ), 'href' => wp_login_url() ) );
        $wp_admin_bar->add_menu( array( 'title' => __( 'Contact' ), 'href' => 'http://www.mywebsite.com/contact/' ) );
    }
}
// Example source: http://blog.ftwr.co.uk/archives/2011/01/05/always-show-admin-bar/
?>

看到了吧,是不是很简单?现在你的访问者可以在默认的搜索框旁边看到“登录”和“联系”链接。

控制默认的“分类”小工具

你可以使用wp_list_categories()函数显示分类列表。而且这个动作(和函数同名)可以帮助我们自定义输出内容。

移除分类链接的标题属性

如果你不需要在小组件中显示分类链接的标题属性,你可以在你的工程中使用下面的代码移除它们:

<?php
add_action( 'wp_list_categories', 'wp_list_categories_example' );
function wp_list_categories_example() {
    return preg_replace( '` title="(.+)"`', '', $output );    
}
// Example Source: http://wpsnipp.com/index.php/cat/remove-title-attribute-from-wp_list_categories/
?>

在搜索触发之前处理搜索表单

为了使用内建的搜索特性,你需要使用get_search_form()函数。如果你希望在这个函数输出前显示一些内容的话,你可以使用pre_get_search_form()这个函数。

在搜索表单之前添加信息

如果说你有一个数以百计或者数以千计的访问量的商业博客。为了通知你的访问者他们可以输入条形码来获得他们想要的产品,你可以使用下面的代码来在搜索框前添加这些信息。

<?php
add_action( 'pre_get_search_form', 'pre_get_search_form_example' );
function pre_get_search_form_example( $form ) {
    echo '<div class="search-info">Enter your barcode number below to access the item you want.</div>';
}
?>

注意,你可以使用例子中的template_redirect动作来实现当访问者输入一个条形码之后自动地跳转到产品展示页面。

小结

我们已经完成了50个动作介绍的第四部分。我希望你能喜欢并且从中学到了新的知识。练习一下你看到的内容,我们在下一篇文章中再见。

同时我也想要听到你的想法。在下面写下你对这些动作的的想法。如果你喜欢这篇文章,别忘了分享它!

原文出自:http://code.tutsplus.com/tutorials/fifty-actions-of-wordpress-50-examples-31-to-40–cms-21581