50个WordPress过滤钩子(31-40)

我们永远不能怪罪任何帮了倒忙的志愿者。他们是一心对你好,别让他们心凉。相信自已。不要妄加评判自已,也不会把自已交给别人评判,更不会贬低自已。
本文是《50个 WordPress 过滤钩子》专题的第 3 篇,共 7 篇:
  • 50个WordPress过滤钩子(21-30)
  • 50个WordPress过滤钩子(11-20)
  • 50个WordPress过滤钩子(31-40)
  • 50个WordPress过滤钩子(1-10)
  • 50个WordPress过滤钩子(介绍过滤钩子)
  • 50个WordPress过滤钩子(41-50)
  • 50个WordPress过滤钩子(总结)

在本系列前面几个章节中,我们已经学习了 30 个WordPress过滤钩子,下面我们继续通过样例来学习下面的10个过滤钩子。

过滤默认的相册样式

WordPress 一般用[ gallery]这个简码加载预定义的CSS。你也可以通过use_default_gallery_style过滤钩子实现自定义。

样例:禁用默认样式

如果你已经在主题样式文件style.css中定义了相册样式,但又不想使用它,此时便可以用下列的代码禁用。

1
2
3
4
5
<?php

add_filter( 'use_default_gallery_style', '__return_false' );

?>

<?php add_filter( 'use_default_gallery_style', '__return_false' ); ?>

OK,现在WordPress便不会在[ gallery]简码中自动添加<style>标签了。

过滤附件URLs

在此我们使用名为wp_get_attachment_url()的过滤钩子。

样例:避免出现“内容混合”的警示

如果你的网站使用的是ssl加密方式,wp_get_attachment_url()函数默认会返回http的url而非https,因此会给访客“内容混合”的警示消息。下面的代码会屏蔽此类消息显示:

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

add_filter( 'wp_get_attachment_url', 'wp_get_attachment_url_example' );

function wp_get_attachment_url_example( $url ) {
    $http  = site_url( false, 'http'  );
    $https = site_url( false, 'https' );

    if ( $_SERVER['HTTPS'] == 'on' )
        return str_replace( $http, $https, $url );
    else
        return $url;
}

// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_get_attachment_url

?>

<?php add_filter( 'wp_get_attachment_url', 'wp_get_attachment_url_example' ); function wp_get_attachment_url_example( $url ) { $http = site_url( false, 'http' ); $https = site_url( false, 'https' ); if ( $_SERVER['HTTPS'] == 'on' ) return str_replace( $http, $https, $url ); else return $url; } // Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_get_attachment_url ?>

设置邮件的默认内容类型

wp_mail()函数默认邮件内容使用普通的text/plain作为文本类型,通过这个wp_mail_content_type过滤钩子,你可对其做出某些修改。

样例:在WordPress的电子邮件内容中使用HTML类型

如果你想在邮件中使用HTML类型,可以使用下列代码来实现:

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

add_filter( 'wp_mail_content_type', 'wp_mail_content_type_example' );

function wp_mail_content_type_example( $content_type ) {
    return 'text/html';
}

?>

<?php add_filter( 'wp_mail_content_type', 'wp_mail_content_type_example' ); function wp_mail_content_type_example( $content_type ) { return 'text/html'; } ?>

保存评论者的ip地址

WordPress 在数据库中会保留每一个评论者的ip地址,如果你想修改,可以使用这个pre_comment_user_ip过滤钩子。

样例:保存评论者的真实ip地址

如果评论者是通过代理服务器提交的评论,WordPress将记录代理服务器的ip而非其真实IP。其实真正的IP可以在HTTP头部的X-Forwarded-For信息中找到。下列的代码能实现提取真实的IP并将其保存在数据库中。

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

add_filter( 'pre_comment_user_ip', 'pre_comment_user_ip_example' );

function pre_comment_user_ip_example() {
    $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
    if ( !empty( $_SERVER['X_FORWARDED_FOR'] ) ) {
        $X_FORWARDED_FOR = explode( ',', $_SERVER['X_FORWARDED_FOR'] );
        if ( !empty( $X_FORWARDED_FOR ) )
            $REMOTE_ADDR = trim( $X_FORWARDED_FOR[0] );
    } elseif( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        $HTTP_X_FORWARDED_FOR = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
        if ( !empty( $HTTP_X_FORWARDED_FOR ) )
            $REMOTE_ADDR = trim( $HTTP_X_FORWARDED_FOR[0] );
    }
    return preg_replace( '/[^0-9a-f:\., ]/si', '', $REMOTE_ADDR );
}

// Example source: https://codex.wordpress.org/Plugin_API/Filter_Reference/pre_comment_user_ip

?>

<?php add_filter( 'pre_comment_user_ip', 'pre_comment_user_ip_example' ); function pre_comment_user_ip_example() { $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; if ( !empty( $_SERVER['X_FORWARDED_FOR'] ) ) { $X_FORWARDED_FOR = explode( ',', $_SERVER['X_FORWARDED_FOR'] ); if ( !empty( $X_FORWARDED_FOR ) ) $REMOTE_ADDR = trim( $X_FORWARDED_FOR[0] ); } elseif( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { $HTTP_X_FORWARDED_FOR = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] ); if ( !empty( $HTTP_X_FORWARDED_FOR ) ) $REMOTE_ADDR = trim( $HTTP_X_FORWARDED_FOR[0] ); } return preg_replace( '/[^0-9a-f:\., ]/si', '', $REMOTE_ADDR ); } // Example source: https://codex.wordpress.org/Plugin_API/Filter_Reference/pre_comment_user_ip ?>

若你想了解更多的X-Forwarded-For HTTP头部信息知识,请访问维基百科http://en.wikipedia.org/wiki/X-Forwarded-For

修改文章的保存版本修订次数

你一定知道WordPress 中文章的“修订版本”的功能,若想修改版本修订次数,可以通过修改wp-config.php文件中的WP_POST_REVISIONS常量值来实现。

如果想修改其他文章类型的版本修订次数,则可以使用wp_revisions_to_keep过滤钩子。

样例:禁止某些特定文章类型使用“修订版本”功能

可以用$post变量来修改版本修订次数,在下面的代码中,自定义了指定文章类型为‘even’的版本修订次数,在应用中将其改为你自己的即可。

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

add_filter( 'wp_revisions_to_keep', 'wp_revisions_to_keep_example', 10, 2 );

function wp_revisions_to_keep_example( $num, $post ) {
    if ( 'event' == $post->post_type ) {
        return 0;
    }
    return $num;
}

// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_revisions_to_keep

?>

<?php add_filter( 'wp_revisions_to_keep', 'wp_revisions_to_keep_example', 10, 2 ); function wp_revisions_to_keep_example( $num, $post ) { if ( 'event' == $post->post_type ) { return 0; } return $num; } // Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_revisions_to_keep ?>

在过滤钩子中$post变量的具体用法可参考http://codex.wordpress.org/Class_Reference/WP_Post,若有了新的发现,别忘了留言与我们共同分享。

重写 简码

使用[ caption]简码可以简单地使用题注包裹图片,如果你想修改简码的显示输出,就可使用下列过滤钩子。

样例:用HTML5标记图像题注

HTML5 标准建议我们使用两个新的图片相关的标签:<figure> 或<figcaption> ,在下方的样例中,我们将重写标记:

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
26
27
28
29
30
31
32
33
34
35
36
<?php

add_filter( 'img_caption_shortcode', 'img_caption_shortcode_example', 10, 3 );

function img_caption_shortcode_example( $empty, $attr, $content ) {
    $attr = shortcode_atts( array(
        'id'      => '',
        'align'   => 'alignnone',
        'width'   => '',
        'caption' => ''
    ), $attr );

    if ( 1 > (int) $attr['width'] || empty( $attr['caption'] ) ) {
        return '';
    }

    if ( $attr['id'] ) {
        $attr['id'] = 'id="' . esc_attr( $attr['id'] ) . '" ';
    }

    $figure_atts    = $attr['id']
                    . ' class="caption ' . esc_attr( $attr['align'] )
                    . '" ' . 'style="max-width: ' . ( 10 + (int) $attr['width'] ) . 'px;"';

    $output  = '<figure ' . $figure_atts . '>';
    $output .= do_shortcode( $content );
    $output .= '<figcaption>' . $attr['caption'] . '</figcaption>';
    $output .= '</figure>';

    return $output;

}

// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/img_caption_shortcode

?>

<?php add_filter( 'img_caption_shortcode', 'img_caption_shortcode_example', 10, 3 ); function img_caption_shortcode_example( $empty, $attr, $content ) { $attr = shortcode_atts( array( 'id' => '', 'align' => 'alignnone', 'width' => '', 'caption' => '' ), $attr ); if ( 1 > (int) $attr['width'] || empty( $attr['caption'] ) ) { return ''; } if ( $attr['id'] ) { $attr['id'] = 'id="' . esc_attr( $attr['id'] ) . '" '; } $figure_atts = $attr['id'] . ' class="caption ' . esc_attr( $attr['align'] ) . '" ' . 'style="max-width: ' . ( 10 + (int) $attr['width'] ) . 'px;"'; $output = '<figure ' . $figure_atts . '>'; $output .= do_shortcode( $content ); $output .= '<figcaption>' . $attr['caption'] . '</figcaption>'; $output .= '</figure>'; return $output; } // Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/img_caption_shortcode ?>

如果你不想使用<figure>标签的IDs, 可以随意修改上述代码.

添加文章CSS类名

在WordPress 开发中常使用body_class这个过滤钩子,还有个名为post_class的过滤钩子(函数)可以让你在文章中添加自定义的CSS 类。

样例:在循环中为第一篇文章添加特殊类

为循环中的第一篇文章添加一个特殊的类是个不错的例子,我们来看看具体是怎么实现的。

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

add_filter( 'post_class', 'post_class_example' );

function post_class_example( $classes ) {
    global $wp_query;
    if ( 0 == $wp_query->current_post ) {
        $classes[] = 'first-post';
    }
    return $classes;
}

// Example source: http://www.billerickson.net/code/first-post-class/

?>

<?php add_filter( 'post_class', 'post_class_example' ); function post_class_example( $classes ) { global $wp_query; if ( 0 == $wp_query->current_post ) { $classes[] = 'first-post'; } return $classes; } // Example source: http://www.billerickson.net/code/first-post-class/ ?>

现在,就可以使用类 .first-post而不用担心因为使用 :first这个伪类而导致的不同浏览器兼容性问题了。

在附件中增加自定义字段

在WordPress 中,附件本质上类似于一种定制的、可扩展的文章类型,它们之间仅有细微区别。过滤钩子attachment_fields_to_edit可以让我们在上传或编辑附件的时候自定义一些操作。

样例:为上传的图片添加授权信息

例如有个摄影图片相关的博客,需要为博客中上传的每一张作为附件的图片添加授权许可信息。这里我们使用“actions”动作钩子,在附件中新增了一个“license”域输入框。

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
26
<?php

add_filter( 'attachment_fields_to_edit', 'attachment_fields_to_edit_example', 10, 2 );

function attachment_fields_to_edit_example( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'license', true );
    $form_fields['license'] = array(
        'value' => $field_value ? $field_value : '',
        'label' => __( 'License' ),
        'helps' => __( 'Specify the license type used for this image' )
    );
    return $form_fields;
}

add_action( 'edit_attachment', 'save_new_attachment_field' );

function save_new_attachment_field( $attachment_id ) {
    $license = $_REQUEST['attachments'][$attachment_id]['license'];
    if ( isset( $license ) ) {
        update_post_meta( $attachment_id, 'license', $license );
    }
}

// Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/attachment_fields_to_edit

?>

<?php add_filter( 'attachment_fields_to_edit', 'attachment_fields_to_edit_example', 10, 2 ); function attachment_fields_to_edit_example( $form_fields, $post ) { $field_value = get_post_meta( $post->ID, 'license', true ); $form_fields['license'] = array( 'value' => $field_value ? $field_value : '', 'label' => __( 'License' ), 'helps' => __( 'Specify the license type used for this image' ) ); return $form_fields; } add_action( 'edit_attachment', 'save_new_attachment_field' ); function save_new_attachment_field( $attachment_id ) { $license = $_REQUEST['attachments'][$attachment_id]['license']; if ( isset( $license ) ) { update_post_meta( $attachment_id, 'license', $license ); } } // Example source: http://codex.wordpress.org/Plugin_API/Filter_Reference/attachment_fields_to_edit ?>

就这样,不需修改核心代码,我们就可以扩展WordPress的核心函数功能了。

改变自动摘要的字数长度

WordPress摘要默认清除HTML格式并截取前面的55个单词,若想对其做些许变化,可使用过滤钩子excerpt_length。

样例:改变自动摘要的字数长度

若想做个Pinterest 风格的页面布局,空间又有限,摘要字数只能限制在15个字,则可在函数中返回字符数,然后hook到这个过滤钩子

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

add_filter( 'excerpt_length', 'excerpt_length_example' );

function excerpt_length_example( $words ) {
    return 15;
}

?>

<?php add_filter( 'excerpt_length', 'excerpt_length_example' ); function excerpt_length_example( $words ) { return 15; } ?>

很容易就实现了,是吧?

处理后台管理页面中的“批量操作”功能

在WordPress的后台管理页面中有类似文章、页面、用户、多媒体等栏目,你在选择完多个项目之后可进行一些批量操作。下面的过滤钩子可让我们对这个下拉菜单做些修改。

样例:禁用将文章移至回收站的批量操作

若你运营着一个新闻类的网站,对编辑人员意外将需要更新的文章移至回收站中感到很无奈,此时便可使用下方的代码来禁用批量移动文章到回收站的功能了。

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

add_filter( 'bulk_actions-edit-post', 'bulk_actions_edit_post_example' );

function bulk_actions_edit_post_example( $actions ) {
    unset( $actions['trash'] );
    return $actions;
}

?>

<?php add_filter( 'bulk_actions-edit-post', 'bulk_actions_edit_post_example' ); function bulk_actions_edit_post_example( $actions ) { unset( $actions['trash'] ); return $actions; } ?>

若你想了解更多过滤钩子中的类似$screenid的变量名称,可以参考官方“Admin Screen Reference @ Plugin API” 文档。

第四部分结语

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

原文出自:http://code.tutsplus.com/tutorials/50-filters-of-wordpress-filters-31-40--cms-21297

由 shanezx@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。

到此这篇关于50个WordPress过滤钩子(31-40)就介绍到这了。男人的青春表示一种肤浅,女人的青春标志一种价值。更多相关50个WordPress过滤钩子(31-40)内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!

您可能有感兴趣的文章
WordPress站点Gravatar头像前后台不显示的如何解决办法

WordPress主题需要支持https吗?WordPress站点如何如何实现https?

WordPress站点的页面/标签/分类URL地址如何添加.html?

WordPress站点更换了域名后数据库应该如何操作替换新旧域名?

WordPress安装在主机空间的什么目录里面?根目录在哪里?