想在主页的文章列表中,为每一篇文章配置一张缩略图,之前修改twentyten主题的时候尝试过类似的实现,只是某天一个不小心“rm -rf wordpress”,连主题带所有图片都被删得一干二净。只记得是一个较为复杂的判断语句,先判断有没有缩略图,再判断文章有没有附图,如果两者都不存在,那么套一张默认的图片。
尝试了typecho的主题制作之后,又重新把目光投向了wordpress,新的自定义主题实现了一个简陋的后台,允许自定义一些参数,同时考虑把缩略图的判断放在文章被提交之后,每当一篇文章被保存,就自动生成一个自定义字段,仍旧是主循环中那套逻辑,只是提前完成并保存为一个固定的字段,以避免在主循环中执行复杂的逻辑语句。
function my_post_meta($post_id,$post){
ob_start();
ob_end_clean();
preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
update_post_meta($post_id,'test',$matches[0][0]);
}
add_action( 'save_post', 'my_post_meta');
但执行上述语句的时候却遇到了问题,当仅提供一个参数$post_id的时候,程序运行正常,同时提供两个参数的时候,点击文章更新,系统出现致命错误导致页面无法访问,博主一度以为自己用的版本有bug。
add_action语法
仔细查看了一下add_action语句的说明,发现原来是自己的语句没有先完整,遇到具有多个参数的情况,需要指定接收的参数个数,即“$accepted_args”:
<?php
add_action( $tag, $function_to_add, $priority, $accepted_args );
?>
add_action的参数
$tag
(字符串)(必填)$function_to_add 所挂载的动作(action)的名称。(在Plugin API/Action Reference 上查看动作hook列表)。也可以是一个主题或插件文件内部的一个动作,或者特定的标签“all”,这个函数将被所有的钩子(hooks)调用。
默认值:None
$function_to_add
(回调)(必填)你希望挂载的函数的名称。注:在 PHP“回调”类型文档中 所罗列的字符串格式化的语法均可用。
默认值:None
$priority
(整数)(可选)用于指定与特定的动作相关联的函数的执行顺序。数字越小,执行越早,具有相同优先级的函数在它们被添加到动作的顺序执行。
默认值:10
$accepted_args
(整数)(可选)挂钩函数所接受的参数数量。在 WordPress1.5.1 及以后的版本中,挂钩函数可以是调用do_action() 或 apply_filters()时设置的参数。例如,comment_id_not_found动作将传递任何函数,若该函数将所请求的评论编号连接到该动作。
默认值:1
最终解决方案
明白了症结所在,解决的过程反而异常的简单,将add_action后续的两个参数补充完整,程序就可以正常运行了。
function my_post_meta($post_id,$post){
ob_start();
ob_end_clean();
preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
update_post_meta($post_id,'test',$matches[0][0]);
}
add_action( 'save_post', 'my_post_meta',10,2 );