一直想把一些自己手动添加的代码写成函数调用,这样比较方便,但曾经试过出错或者代码失效。前段时间到了 Bolo 那里评论时问了一下,他说可能函数缺少 Return。因为我从来没看过 PHP 教材和手册,加上 10 多年前学的编程方面的知识早已忘得一干二净了,所以什么 Return 啥的根本不知道。前 2 天实在是无聊到蛋疼,就去网络上搜了一下 PHP 手册,只看了函数一小部分,没看完就动手了,没想到竟然也能搞定 - - ,这里记录一下,老鸟就飘吧,菜鸟、菜菜鸟、菜菜菜菜鸟也不一定适合,反正喜欢折腾的就跟我折腾吧。
一、带头像的最新评论函数
1. 一般情况下的,或者说通用型
打开主题文件 Functions.php ,添加下面的代码:
function zsofa_recentcomments($commentsnum = 10, $extractlength = 16, $extractuser = '') { global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, SUBSTRING(comment_content,1,$extractlength) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != '$extractuser' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT $commentsnum"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $output .= "n<li>".get_avatar($comment->comment_author_email, 32)."<a href="" . get_comment_link( $comment->comment_ID ) . "" title="on " .$comment->post_title . "">" . strip_tags($comment->com_excerpt)."</a>...</li>"; } $output = convert_smilies($output); return $output; }
调用方法:
<h3>Recent Comments</h3> <ul class="recentcomments"> <?php if (function_exists('zsofa_recentcomments')) { echo zsofa_recentcomments(10,16,'zwwooooo'); } ?> </ul>
函数说明:zsofa_recentcomments(10,16,'zwwooooo') 里面的 10 是评论数量,16是每条评论文字个数,'zwwooooo' 是不显示其评论的用户名(一般用来不显示博主自己的评论)
因为有头像,所以要在 css 里面定义 .recentcomments,参考我的 css 自己折腾:
#sidebar .recentcomments img.avatar{width:16px;height:16px;float:left;position:relative;border:1px solid #dfdfdf;padding:2px;margin:0 5px 0 0;} #sidebar .recentcomments li{padding:4px 0;} #sidebar .recentcomments li img{width:20px;height:20px;}
(这里有个技巧,就是注意定义行高[line-height]的值,可以避免交叉行,当然还有其他方法。)
2. 我个人认为完美的函数(就是能显示“连接”开头的评论内容摘录)
同样把下面的代码贴到 Functions.php 主题文件里面:
if ( !function_exists('cut_str')) { function zsofa_cut_str($string, $sublen, $start = 0, $code = 'UTF-8') { if($code == 'UTF-8') { $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/"; preg_match_all($pa, $string, $t_string); if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; return join('', array_slice($t_string[0], $start, $sublen)); } else { $start = $start*2; $sublen = $sublen*2; $strlen = strlen($string); $tmpstr = ''; for($i=0; $i<$strlen; $i++) { if($i>=$start && $i<($start+$sublen)) { if(ord(substr($string, $i, 1))>129) $tmpstr.= substr($string, $i, 2); else $tmpstr.= substr($string, $i, 1); } if(ord(substr($string, $i, 1))>129) $i++; } if(strlen($tmpstr)<$strlen ) $tmpstr.= "..."; return $tmpstr; } } } function zsofa_recentcomments($commentsnum = 10, $extractlength = 16, $extractuser = '') { global $wpdb; $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url,comment_author_email, comment_content AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != '$extractuser' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT $commentsnum"; $comments = $wpdb->get_results($sql); foreach ($comments as $comment) { $output .= "n<li>".get_avatar($comment->comment_author_email, 32)."<a href="" . get_comment_link( $comment->comment_ID ) . "" title="on " .$comment->post_title . "">" . zsofa_cut_str(strip_tags($comment->com_excerpt),$extractlength) ."</a>...</li>"; } $output = convert_smilies($output); return $output; }
调用方法和 css 同上
如果你使用了 Willin 的简单头像缓存,参考这篇《带头像显示的最新评论代码 - 完善篇》的缓存代码自个折腾。
二、最活跃朋友(读者墙)
把下面的代码贴到主题文件 Functions.php 里面:
function zsofa_most_active_friends($friends_num = 10) { global $wpdb; $counts = $wpdb->get_results("SELECT COUNT(comment_author) AS cnt, comment_author, comment_author_url, comment_author_email FROM (SELECT * FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->posts.ID=$wpdb->comments.comment_post_ID) WHERE comment_date > date_sub( NOW(), INTERVAL 1 MONTH ) AND user_id='0' AND comment_author != 'zwwooooo' AND post_password='' AND comment_approved='1' AND comment_type='') AS tempcmt GROUP BY comment_author ORDER BY cnt DESC LIMIT $friends_num"); foreach ($counts as $count) { $c_url = $count->comment_author_url; if ($c_url == '') $c_url = get_bloginfo('url'); $mostactive .= '<li class="mostactive">' . '<a href="'. $c_url . '" title="' . $count->comment_author . ' ('. $count->cnt . 'comments">' . get_avatar($count->comment_author_email, 32) . '</a></li>'; } return $mostactive; }
调用方法:
<h3>Most Active Friends</h3> <ul class="ffox_most_active"> <?php if (function_exists('zsofa_most_active_friends')) { echo zsofa_most_active_friends(24);} ?> </ul>
函数说明:zsofa_most_active_friends(24) 里面的 24 是指显示的读者数量。
同样因为有图片,所以要定义 css:.ffox_most_active,参考我的如下:
#sidebar .ffox_most_active{overflow:hidden;} #sidebar .ffox_most_active li{list-style:none;float:left;line-height:0;} #sidebar .ffox_most_active img.avatar{width:28px;height:28px;border:1px solid #dfdfdf;padding:2px;margin:0 1px 0 0;}
如果你使用了 Willin 的简单头像缓存,参考这篇《WordPress 免插件读者墙 willin 版本》的缓存代码自个折腾。
三、热评文章(评论最多的文章)
把下面的代码贴到主题文件 Functions.php 里面:
function zsofa_hotposts($postsnum = 10, $extractpost_id = 0) { global $wpdb; $result = $wpdb->get_results("SELECT comment_count,ID,post_title FROM $wpdb->posts WHERE ID != '$extractpost_id' ORDER BY comment_count DESC LIMIT 0 , $postsnum"); foreach ($result as $post) { setup_postdata($post); $postid = $post->ID; $title = $post->post_title; $commentcount = $post->comment_count; if ($commentcount != 0) { $hotposts .= '<li><a href="' . get_permalink($postid) . '" title="' . $title . '">' . $title . '</a> (' . $commentcount . ')</li>'; } } return $hotposts; }
调用方法:
<h3>Hot Posts</h3> <ul> <?php if (function_exists('zsofa_hotposts')) { echo zsofa_hotposts(10, 0); } ?> </ul>
函数说明:zsofa_hotposts(10, 0) 里面的 10 是要显示热评文章的数量,0 是你不想加入热评的文章 ID(如你不想“留言板”加入热评,只要填入“留言板”对应的文章 ID 即可)
折腾完了,那么有兴趣的朋友折腾吧,原理我说不上来,反正 CP 能用就行了。
写完后自己看都觉得有点晕,没办法,技术不到家,不够傻瓜化,只能适合喜欢折腾的朋友和我自己了。
PS1:有些代码我是直接在写文章时改的,所以没测试,有什么问题请留言。
PS2:昨晚翎翎发烧了,39度,我 3 点多就起来给翎翎喝退烧药水,忙到 4 点多,我自己就突然肚子有点疼上厕所,上第 2 次才真正上完,在上厕所期间突然想到“现在这个主题样式”,本来打算睡醒再改,但上完厕所后就睡不着了,可能小孩发烧心里焦急吧,到 5:30 后量一下翎翎的体温,已经降到 38 度,心也比较定了。于是再回到床上准备睡觉,但还是睡不着,于是就开电脑开始改主题,改啊改就成现在这个样。
- 本文标题:把一些手动添加的代码写成函数了
- 本文链接:https://zww.me/archives/24836
- 发布时间:2010年01月25日 11:46
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
只能无语围观强人
@derek 测试评论提交速度
偶一直在尽量减少调用 - -
@泡面 哈哈,我为了方便,老是在折腾主题要这里塞代码那里塞代码,麻烦啊
恩~现在的这个主题很喜欢啊!非常不错!
我想问下,有关外链图标的问题,你能帮我解答下么?就是http://blog.xiao3.info/jquery-favicon.html 这里面提到的。多谢~
@xiao3 看了一下你的文章,应该可以加个排除图片后缀的代码,但我不知道怎么加,你查下jQuery手册,应该是选择器或者查找那边
好用学习了
如果拖小工具的呢~~
能不能该哪里就直接拖小工具就OK了..
@超人 只是个函数,不是插件,所以不能直接用小工具。
[...] This post was mentioned on Twitter by Carrie, zwwooooo and RssFeeds, Michael Davis. Michael Davis said: RT @zwwooooo: 把一些手动添加的代码写成函数了 http://goo.gl/fb/evR6 #wordpress #wp经验技巧 [...]
我怎么觉得你把你的主题改的越来越丑了啊~
@疾风 你深深地打击了我 不过我觉得这样很好,以前的感觉松散
@疾风
为了让你认清现状,我冒着什么危险,都要打击你啊 ~
@疾风 打击的好,但我坚持我的修改
这篇要收藏了,太实用了。
@welee 你不需要吧
哈哈,我折腾主题已经把大部分的代码都塞在Functions.php里了, ,现在我只保留了几个插件...
@edikud 哈哈,厉害啊,我只加了些简单的插件进functions.php
@zwwooooo 空间速度不快,我才这样做的, 我也不要太多功能.
@edikud 你那空间确实很慢,发个评论要半天
function cache_recent_comments(){
$cached = get_option('cache_recent_comments');
if($cached){
echo $cached;
}else{
$cached = cache_get_recent_comments();
//echo "Cache Updated";
echo $cached;
}
}
.............你的代码
update_option('cache_recent_comments', $output);
return $output;
-----
<?php cache_recent_comments(); ?>调用函数
上面的代码是利用wp的事件机制,设定为在新事件发生时,如新留言发布,或新文章发布等,在wp后台将这些变化更新到options表内。正常访问时,因为wp会预定所有options表内的数据,所以这些内容会自动被wp加载而不用再次产生数据读取,从而实现缓存机制。缓存处理减少数据读取...
@edikud 这样会不会使 options 表越来越大???因为不懂 wp 的数据表,曾经有一个插件使我的 options 表增加了几十万行记录接近10M大小(我的数据库才5M左右,突然变成16M)。
@zwwooooo 这个我没有注意啊,不过不会像你说的样子吧,因为wp本来就是会预定所有options表内的数据,我们只是在哪读取...再说最新评论也大不了哪里去!
@zwwooooo 我主页数据读取次数减少到16次.
@edikud 我用了php查询缓存插件,所以从4x次减到12次左右
@zwwooooo 我没有用缓存插件,内容多了再说吧!
还有这段必须:贴到 Functions.php 主题文件里面:
add_action('comment_post', 'cache_get_recent_comments');
add_action('edit_comment', 'cache_get_recent_comments');
@edikud 你这个代码只是针对最新评论吧,实在不懂啊,我是CP党
@zwwooooo 是的
来看看!php不懂!跳过~
@GEZ鸽子 我也不懂,直接CP吧
纯技术性文章,只能眼巴巴的灌水看着。。
@笨笨 如果需要的话可以直接CP
纯技术性的文章,只能看懂点皮毛,不过值得收藏~~!呵呵!
@hxyhbkj 不懂就直接CP
有些很实用,学习了。
@苏囧 直接CP用的,没啥值得学习
纯技术的东西,果然对我来说难度有点大。
要不博主从头指导下?
@Firm 我也不懂,只能 CP 中了解一些。
我学习了好长时间PHp,对PHP还是一片迷茫。
@批发QQ号码网站 呵呵,要系统学吧,我没这个心情了,只能玩儿
function一不小心就会Error~~我轻易不敢动它老人家
@阿修 注意代码格式就好了,那里都是,一不小心都会出问题的
这叫做代码重构,呵呵
@Timothy 哈哈,我不懂了,完全忘了
我就说你绝对是个人才撒!
@huangjun 只能算是CP党