WordPressvue中的钩子函数数问题,怎么解决

不得不说的WordPress
这几天WordPress频繁在更新,好像又没有什么重大的bug,上个月开始就不怎么再玩这个东西了,这次更新还更出个菜单的bug来。自定义评论表情也不能用了,还要搞一堆过滤钩子,替换原文件。
搞来搞去是个人都心烦了,而且这次更新好像是专门针对国人的,很多服务链接都被墙了。前台后台都“加载中...”,花了我不少时间去找原文件的问题来源函数。网上那些搞WP的效率很高,立马出了插件。
去年折腾了一年,早就腻了,手头上还有几个很不错的原创主题,包括现在自用的这个INLOSPEED都是功能非常强大的。以前很多WP建站技术文章还躺在那儿。
一是不想折腾,二又不得不忍受WP的臃肿。 老早就想换typecho,遂又要折腾花费一点时间。
所以最近看看能不能转为tp,另外要继续时不时玩玩wp就要开个子域,或者再买一个域名了。
毕竟主要还是写博客,追求速度和效率,进来就能看到想看的东西。
版权所有 & 2018
DESIGNED BY
本站公告 当前本站主题 YUAO 即将更新至1.1.8,详情点击!建站交流群:<link rel="shortcut icon" href="http://www.seo628.com/wp-content/themes/xstheme/images/favicon.png"
6种处理WordPress文章摘要的方法 | 小兽WordPress
WordPress的文章摘要系统效果很好,但它也感觉比它需要的更复杂。特别是在使用国外主题的过程中,往往不能很好的自动截断成为文章摘要。而其中主要问题(在WordPress中经常是这样)是WordPress摘要系统使用了许多具有接近完全相同的名称的函数。 这使得我们很难知道什么是什么,以及哪些功能可以帮助我们完成。因此,本文不是试图深入研究创建WordPress摘要本身所涉及的每一项功能,而是根据我认为是人们使用或修改文章摘要的共同目标,对WordPress摘要采取“操作方法”的方法。本文章将包含六个要求的相关详细说明:如何使用excerpt_length钩子更改WordPress摘要的长度(单词) &#8211; the_excerpt()和get_the_excerpt()使用的长度。如何使用excerpt_more钩子更改WordPress摘要末尾的[&#8230;]或“Read More”文本。如何使用get_the_excerpt钩子更改文章摘要的文本。如何使用wp_trim_excerpt钩子创建长度恰好为一段的摘录。如何使用wp_trim_excerpt钩子创建特定字符长度(而不是字长)的摘要。如何使用wp_trim_words()函数从任何字符串中获取任何长度的摘要。顺便说一句,接下来这些示例都是WordPress的主要编程语言PHP。 他们广泛使用WordPress的钩子系统,尤其是WordPress filters。通过下面的代码,你只需要把它们添加到你的主题的funtion.php文件里即可。无需修改主题其他文件。使用excerpt_length更改摘要长度function iesay_longer_excerpts( $length ) {
// Don't change anything inside /wp-admin/
if ( is_admin() ) {
// Set excerpt length to 140 words
return 140;
// "999" priority makes this run last of all the functions hooked to this filter, meaning it overrides them
add_filter( 'excerpt_length', 'iesay_longer_excerpts', 999 );使用excerpt_more更改摘要“阅读更多”文本function iesay_change_and_link_excerpt( $more ) {
if ( is_admin() ) {
// Change text, make it link, and return change
return '& &a href="' . get_the_permalink() . '"&More >>&/a&';
add_filter( 'excerpt_more', 'iesay_change_and_link_excerpt', 999 );使用get_the_excerpt更改文章摘要文本function iesay_make_excerpt_text_interesting( $excerpt ) {
if ( is_admin() ) {
$excerpt = str_replace( array('rain', 'wind', 'scanty flame of the lamps'), 'DINOSAURS', $excerpt );
add_filter( 'get_the_excerpt', 'iesay_make_excerpt_text_interesting', 999 );使用wp_trim_excerpt创建首个段落摘要function iesay_excerpt( $text ) {
if( is_admin() ) {
// Fetch the content with filters applied to get &p& tags
$content = apply_filters( 'the_content', get_the_content() );
// Stop after the first &/p& tag
$text = substr( $content, 0, strpos( $content, '&/p&' ) + 4 );
// Leave priority at default of 10 to allow further filtering
add_filter( 'wp_trim_excerpt', 'iesay_excerpt', 10, 1 );使用wp_trim_excerpt创建特定字符长度的摘录function iesay_twitter_length_excerpt( $text ) {
if( is_admin() ) {
// Fetch the post content directly
$text = get_the_content();
// Clear out shortcodes
$text = strip_shortcodes( $text );
// Get the first 140 characteres
$text = substr( $text, 0, 140 );
// Add a read more tag
$text .= '…';
// Leave priority at default of 10 to allow further filtering
add_filter( 'wp_trim_excerpt', 'iesay_twitter_length_excerpt', 10, 1 );使用wp_trim_words()从任意文本中获取任何长度摘要// We're creating $read_more, a string that we'll place after the excerpt
$read_more = '& &a class="read-more-link" href="' . get_the_permalink() . '"&Read Full Article&/a&';
// wpautop() auto-wraps text in paragraphs
echo wpautop(
// wp_trim_words() gets the first X words from a text string
wp_trim_words(
get_the_content(), // We'll use the post's content as our text string
55, // We want the first 55 words
$read_more // This is what comes after the first 55 words
);关于wp_trim_words()函数的注释wp_trim_words()是我们所看到的最基本的功能。它的实际行为是采用字符串 &#8211; 任何字符串 &#8211; 并从中返回第一个字,但是“Read More”字符串粘在最后。您可以直接调用此函数来生成自己的WordPress摘要,完全在WordPress的the_excerpts()系统之外。虽然上面的示例仍然使用文章内容(使用get_the_content()引入),但您可以使用wp_trim_words()来生成任何内容的摘要 &#8211; 文章标题,元描述,作者简介,您可以命名它 &#8211; 因为wp_trim_words()可以接受任何内容文本字符串作为其第一个参数。
下一篇: 上一篇: 相关文章 写给所有做网站的朋友的一封信现在就开始执行“1+N”营销推广和没有开始执行的人,一两天看不出任何区别; 一两个月看来差异也是微乎其微的;但在2-5年的长远时间来看的时候,你的高质 量询盘不断增加,你的互联网资产已经建立完成,对手已经很难匹敌,现在你看到这段文字的时候就是最好的开始,现在就是最好的时候,马上开始“1+N”体系的整体营销推广吧,我们和你一起,开创互联网营销大未来!
随机文章准备开启WordPress网站建设推广?我们相信高端漂亮的网站不应该是昂贵的,这就是wordpress对每个人都是免费的原因wordpress建站免费入门,并提供价格合理的wordpress建站套餐。现在的位置:
WordPress过滤钩子函数add_filter()、apply_filters()源码解析
WordPress过滤器(过滤钩子)
过滤器概念:它是一类函数,在WP执行和传递数据过程中,它可以实现在完成某一动作(如输出到浏览器或写入数据库等)之前对数据进行过滤再处理的目的。
过滤器原理:它主要利用一个全局变量$wp_filter,增加过滤函数时使用add_filter()函数给全局变量$wp_filter增加了一个数组元素,这个值存储了钩子名、对应函数及执行优先级等信息,在调用apply_filters()函数使用过滤器时,它通过循环查找出所有跟钩子关联的函数并将其依次作用于待处理的数据上,最后返回处理后的数据。
过滤器使用步骤:
由于PHP代码会经过Zend等引擎翻译,代码中步骤的先后顺序并不重要,所以以下步骤仅为便于理解钩子原理的伪步骤,不具有实际参考意义!
1、创建钩子(可省略):使用apply_filters()函数可以创建一个没有挂载函数的钩子,挂载函数可以通过add_filter()添加,最后再使用apply_filters()调用执行;
2、创建过滤函数:它需要有传入参数即待处理数据(一般为一个参数,也可多个参数),其他与创建普通函数没有任何区别,函数的作用一般用于对传入数据进行处理;
3、挂载函数:即使用add_filter()将函数挂载到指定钩子上;
4、执行过滤器:使用apply_filters()可以依次执行挂载在指定钩子上的所有函数以处理传入数据,最后返回处理后的数据;
过滤函数详解及源码分析:
1、add_filter($tag,$function_to_add,$priority = 10,$accepted_args = 1)
add_filter()作用:该函数用于给指定的过滤钩子$tag添加指定的挂载函数$function_to_add,同时它可以确定挂载函数执行优先级及其可接收参数个数;
add_filter()参数说明:
$tag为钩子名;
$function_to_add为挂载函数名;
可选参数$priority为该挂载函数执行的优先级,默认为10,该数字越小则越早执行,数字相同则按其添加到钩子上的顺序执行,越早添加越早执行;
可选参数$accepted_args确定挂载函数接收的参数个数,默认为1;
add_filter()源码分析:
function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
global $wp_filter, $merged_
# 用于声明全局变量$wp_filter和$merged_filters;
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
# 声明变量$idx并赋值,其值为调用_wp_filter_build_unique_id()函数所得唯一值,关于该函数的源码分析可见下文;
$wp_filter[$tag][$priority][$idx] = array('function' =& $function_to_add, 'accepted_args' =& $accepted_args);
# 为关联数组$wp_filter[$tag][$priority][$idx]赋值,其值为一个关联数组,该数组有两个值,一个为挂载函数名,另一个为该函数接收的参数个数;
unset( $merged_filters[ $tag ] );
# 标记该钩子上新增了函数,更改$wp_filter数组状态,具体作用见apply_filters()函数$merged_filters部分源码说明;
1234567891011
function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) {&&&&global $wp_filter, $merged_filters;&&&&# 用于声明全局变量$wp_filter和$merged_filters; &&&&$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);&&&&# 声明变量$idx并赋值,其值为调用_wp_filter_build_unique_id()函数所得唯一值,关于该函数的源码分析可见下文;&&&&$wp_filter[$tag][$priority][$idx] = array('function' =& $function_to_add, 'accepted_args' =& $accepted_args);&&&&# 为关联数组$wp_filter[$tag][$priority][$idx]赋值,其值为一个关联数组,该数组有两个值,一个为挂载函数名,另一个为该函数接收的参数个数;&&&&unset( $merged_filters[ $tag ] );&&&&# 标记该钩子上新增了函数,更改$wp_filter数组状态,具体作用见apply_filters()函数$merged_filters部分源码说明;&&&&return true;}
_wp_filter_build_unique_id()源码分析:
该函数可创建一个供存储和检索的唯一值。
function _wp_filter_build_unique_id($tag, $function, $priority) {
global $wp_
# 声明全局变量$wp_filter;
static $filter_id_count = 0;
# 声明静态变量$filter_id_count并赋初值为0;
if ( is_string($function) )
# 如果$function的值是字符串则返回该字符串;
if ( is_object($function) ) {
$function = array( $function, '' );
$function = (array) $
# 如果$function是一个对象则将其放入数组,否则将其强制转换为数组;
if (is_object($function[0])) {
if ( function_exists('spl_object_hash') ) {
return spl_object_hash($function[0]) . $function[1];
$obj_idx = get_class($function[0]).$function[1];
if ( !isset($function[0]-&wp_filter_id) ) {
if ( false === $priority )
$obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_
$function[0]-&wp_filter_id = $filter_id_
++$filter_id_
$obj_idx .= $function[0]-&wp_filter_
return $obj_
# 如果spl_object_hash()函数存在则根据该函数返回一个唯一哈希值,否则使用其他方法返回一个唯一值;
} else if ( is_string($function[0]) ) {
return $function[0].$function[1];
# 如果$function[0]是字符串则返回该字符串
123456789101112131415161718192021222324252627282930313233343536
function _wp_filter_build_unique_id($tag, $function, $priority) {&&&&global $wp_filter;&&&&# 声明全局变量$wp_filter;&&&&static $filter_id_count = 0;&&&&# 声明静态变量$filter_id_count并赋初值为0;&&&&if ( is_string($function) )&&&&&&&&return $function;&&&&# 如果$function的值是字符串则返回该字符串;&&&&if ( is_object($function) ) { $function = array( $function, '' ); } else { $function = (array) $function; }&&&&# 如果$function是一个对象则将其放入数组,否则将其强制转换为数组;&&&&if (is_object($function[0])) { if ( function_exists('spl_object_hash') ) { &&&&return spl_object_hash($function[0]) . $function[1]; &&&&} else {
$obj_idx = get_class($function[0]).$function[1];
&&&&if ( !isset($function[0]-&wp_filter_id) ) {
if ( false === $priority )
&&&&return false;
$obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_count;
$function[0]-&wp_filter_id = $filter_id_count;
++$filter_id_count;
&&&&} else {
$obj_idx .= $function[0]-&wp_filter_id;
&&&&return $obj_idx; &&&&}&&&&&&&&# 如果spl_object_hash()函数存在则根据该函数返回一个唯一哈希值,否则使用其他方法返回一个唯一值; } else if ( is_string($function[0]) ) {
return $function[0].$function[1];&&&&}&&&&# 如果$function[0]是字符串则返回该字符串}
2、apply_filters($tag, $value)
apply_filters()作用:该函数调用挂载在过滤钩子$tag上的所有挂载函数依然以$value为传入参数递归式处理数据,最后返回经所有挂载函数处理过的值;
apply_filters()参数说明:
$tag为钩子名;
$value为过滤钩子上挂载函数的传入参数;
apply_filters()源码分析:
function apply_filters($tag, $value) {
global $wp_filter, $merged_filters, $wp_current_
# 声明全局变量,其中$wp_filter存储了所有的过滤器、$merged_filters使用函数合并钩子、$wp_current_filter存储当前过滤器;
$args = array();
# 声明一个空数组$args;
if ( isset($wp_filter['all']) ) {
$wp_current_filter[] = $
$args = func_get_args();
_wp_call_all_hook($args);
# 本段代码分析较长,请见代码结束后“解析1”字样;
if ( !isset($wp_filter[$tag]) ) {
if ( isset($wp_filter['all']) )
array_pop($wp_current_filter);
# 如果当前钩子无挂载函数且存在名为all的钩子则将当前钩子名弹出钩子队列,取前一个钩子名为当前钩子,最后直接返回未经处理的数据;
if ( !isset($wp_filter['all']) )
$wp_current_filter[] = $
# 如果数组中键名不存在键名为all的元素,则当前钩子设置为$tag;
if ( !isset( $merged_filters[ $tag ] ) ) {
ksort($wp_filter[$tag]);
$merged_filters[ $tag ] =
# 本段代码分析较长,请见代码结束后“解析2”字样;
reset( $wp_filter[ $tag ] );
# 将$wp_filter[ $tag ]数组的指针归于第一个函数;
if ( empty($args) )
$args = func_get_args();
# 将$args变量赋值,其值为apply_filters()函数传入的待处理数据,可以为单值,也可为多值或一个数组;
foreach( (array) current($wp_filter[$tag]) as $the_ )
if ( !is_null($the_['function']) ){
$args[1] = $
$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
} while ( next($wp_filter[$tag]) !== false );
array_pop( $wp_current_filter );
# 本段代码分析较长,请见代码结束后“解析3”字样;
1234567891011121314151617181920212223242526272829303132333435363738394041
function apply_filters($tag, $value) {&&&&global $wp_filter, $merged_filters, $wp_current_filter;
# 声明全局变量,其中$wp_filter存储了所有的过滤器、$merged_filters使用函数合并钩子、$wp_current_filter存储当前过滤器;&&&&$args = array();&&&&# 声明一个空数组$args;&&&&if ( isset($wp_filter['all']) ) { $wp_current_filter[] = $tag; $args = func_get_args(); _wp_call_all_hook($args);&&&&}
# 本段代码分析较长,请见代码结束后“解析1”字样;&&&&if ( !isset($wp_filter[$tag]) ) { if ( isset($wp_filter['all']) ) &&&&array_pop($wp_current_filter); return $value;&&&&}
# 如果当前钩子无挂载函数且存在名为all的钩子则将当前钩子名弹出钩子队列,取前一个钩子名为当前钩子,最后直接返回未经处理的数据;&&&&if ( !isset($wp_filter['all']) ) $wp_current_filter[] = $tag;
# 如果数组中键名不存在键名为all的元素,则当前钩子设置为$tag;&&&&if ( !isset( $merged_filters[ $tag ] ) ) { ksort($wp_filter[$tag]); $merged_filters[ $tag ] = true;&&&&}
# 本段代码分析较长,请见代码结束后“解析2”字样; reset( $wp_filter[ $tag ] );
# 将$wp_filter[ $tag ]数组的指针归于第一个函数; if ( empty($args) )
$args = func_get_args();
# 将$args变量赋值,其值为apply_filters()函数传入的待处理数据,可以为单值,也可为多值或一个数组; do {
foreach( (array) current($wp_filter[$tag]) as $the_ )
if ( !is_null($the_['function']) ){
$args[1] = $value;
$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
} } while ( next($wp_filter[$tag]) !== false ); array_pop( $wp_current_filter ); return $value;}
# 本段代码分析较长,请见代码结束后“解析3”字样;
解析1:如果$wp_filter数组中有名为all的钩子则调用PHP函数func_get_args()来获取当前函数所有参数组成的数组,获取参数后通过_wp_call_all_hook()函数调用钩子名为all的所有filter,关于该函数的源码分析见下文;
解析2:这段代码主要用于对$wp_filter[$tag]根据键名(主要为函数优先级等数字)排序,以得到一个过滤函数(挂载函数)的执行先后顺序的排序,而$merged_filters变量主要用于判断是否需要重新对数组进行排序,若没有新增函数等,则if判断false不再重新排序,若新增了函数则由于
add_filter()函数中有代码unset( $merged_filters[ $tag ] ),所以isset()函数为判断为false而整个if则判断为true,然后执行重新排序函数。这样做可以节省服务器CPU资源,有利于程序优化。
解析3:这段代码就是该函数的精髓了,首先将当前钩子的值(包括过滤函数名和其参数个数)赋给数组$the_,然后通过循环将钩子上所有的过滤函数一个个执行,并且每个函数执行后得到的值会借助参数$args传递给下一个函数,直到所有函数执行完成,最后将这个钩子名弹出“当前钩子”队列并返回最后得到的值;其中,call_user_func_array(func,arg)为PHP函数,主要用于把参数值arg传递给函数func去执行;array_slice(args,star,length)也是PHP函数,主要用于返回数组args中从star开始的length个值,在本代码中,若apply_filters()函数仅接受一个参数值,就相当于把这一个值传给过滤函数,若有两个参数则,则会把这两个值都传给过滤函数;
_wp_call_all_hook()源码分析:
该函数调用名为all的钩子并执行挂载在其上的所有函数;
function _wp_call_all_hook($args) {
global $wp_
reset( $wp_filter['all'] );
foreach( (array) current($wp_filter['all']) as $the_ )
if ( !is_null($the_['function']) )
call_user_func_array($the_['function'], $args);
} while ( next($wp_filter['all']) !== false );
function _wp_call_all_hook($args) { global $wp_filter; reset( $wp_filter['all'] ); do {
foreach( (array) current($wp_filter['all']) as $the_ )
if ( !is_null($the_['function']) )
call_user_func_array($the_['function'], $args); } while ( next($wp_filter['all']) !== false );}
从apply_filter()源码可以看到当有名为all的钩子存在时,$args获取了当前钩子名和要处理的值,而本函数将这这些参数都放入名为all的钩子上挂载的函数进行处理。至于名为all的钩子是否存在,以及该钩子上挂载了什么函数,我就不知道了,通过打的断点来看,至少我使用WP博客这几年积累下来的数据中并没有名为all的钩子,该钩子也没有挂载函数。
>> 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!
>> 本文地址:
作者: 笨鸟
【上篇】【下篇】
查看来自外部的引用: 4WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它。
PS:本文只是简单的总结一下,更多用法还是要参考文中给出的函数。
钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter)。这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有。
动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等;过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 WordPress 再用这些值做一些事情,比如函数的返回值等。
wp_head 是一个很常用的动作钩子,在开发主题过程中,开发者都会在 head 标签里加上 wp_head() 函数,事实上,正是这个函数调用了 wp_head 钩子。
如果插件开发者想要在 head 标签里添加一句话,就可以使用 wp_head 钩子,下边是个简单的例子。
//在 head 标签添加一些内容
function Bing_add_head_tag(){
echo '添加内容';
add_action( 'wp_head', 'Bing_add_head_tag' );
添加代码后,查看前台的网页源代码,就能在 head 标签里看到我们添加的内容了。
上边是一个简单的例子,只是打印了一句话。利用这个钩子,我们还可以做一个遇到 404 页面给管理员发送一封邮件的插件,下边简单的写了一个。
//遇到 404 页面给管理员发送邮件
function Bing_404_page_mail(){
if( !is_404() )//如果不是 404 页面就退出函数
$to = get_option( 'admin_email' );//获取管理员地址
$subject = '遇到 404 页面啦!';//邮件标题
$message = '404 页面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//邮件内容
wp_mail( $to, $subject, $message );//发送邮件
add_action( 'wp_head', 'Bing_404_page_mail' );
更多关于 add_action() 函数的内容:
根据我的亲身经历,可能过滤器钩子会难理解些,尤其对不熟悉 PHP 的人来说。
过滤器钩子可以让你改一些东西的值,过滤器回调函数会接受一个参数,这就是当前的值。还记得那个用来调用文章内容的 the_content() 函数吧,这个函数就提供了一个 the_content 过滤器。
给 the_content 钩子添加一个函数,这个函数需要接收一个参数,这个参数就是当前的值。
//文章内容全部链接新窗口打开
function Bing_autoblank( $content ){//$content 变量就是文章内容,因为其它过滤器也要过滤,所以这个内容可能是经过其它函数过滤的
$content = str_replace( '&a', '&a target="_blank"', $content );//添加 target="_blank"
return $//必须要把过滤后的内容返回回去,否则值就丢了
add_filter( 'the_content', 'Bing_autoblank' );
更多关于 add_filter() 函数的内容:
WordPress 核心是怎么调用这些钩子的就不再这篇文章了,可以参考下边两篇文章。
动作钩子:
过滤器钩子:
事实上,在调用 add_action() 和 add_filter() 的时候,只是向 $wp_filter 全局变量添加了一个数组元素,还要说的就是动作和过滤器是公用的一个全局变量,也就是说,过滤器和动作是不能重名的。
当调用 do_action() 的时候,会查找 $wp_filter 全局变量中都有哪些添加到此动作的函数,循环执行即可。
apply_filters() 比 do_action() 多了一个步奏,就是每次调用函数时还要接收这个函数的返回值,最后把经过多次过滤的值返回出去,供使用。
Reference from :
阅读(...) 评论()

我要回帖

更多关于 vue钩子函数是什么 的文章

 

随机推荐