• 2009-05-03

    使用i_am_not_spam WordPress插件

    Views: 32593 | 9 Comments

    虽然akismet识别垃圾评论的准确率很高, 但对于我来说, 每天看到垃圾评论队列里有那么多垃圾评论, 还是很不爽. 眼不见为净. 于是自己写了个Wordpress插件, 直接丢弃垃圾评论.

    WordPress只有comment_post, 但没有pre_comment_post事件, 在评论被保存之前触发. 我只好自己加上了. 所以修改了wp-comments-post.php文件.

    // 就是这一行, ideawu.net
    do_action('pre_comment_post', $commentdata);
    
    $comment_id = wp_new_comment( $commentdata );
    
    $comment = get_comment($comment_id);
    

    插件很简单, 就是利用comment_post事件加入一个隐藏字段, 该字段的值通过客户端JavaScript代码来设置. 提交后和服务器端的值比较, 如果不相同, 说明用户未开启JavaScript, 被认为是垃圾评论. 评论机器人一般不会支持JavaScript.

    有需要的朋友给我留言, 我发给你. 欢迎有心的朋友按第一条评论的格式回复进行测试!

    Posted by ideawu at 2009-05-03 20:54:28 Tags: ,
  • 2009-03-12

    WordPress分页代码

    Views: 23419 | 2 Comments

    将下面的函数放到你的主题的 functions.php 文件中:

    function theme_echo_pagenavi(){
        global $wp_query;
        global $request, $posts_per_page, $wpdb, $paged;
        $maxButtonCount = 9; //显示的最多链接数目
    
        $current_page = $paged;
    
        $current_page = $paged;
        if(empty($current_page)) {
            $current_page = 1;
        }
    
        $numposts = $wp_query->found_posts;
        $max_page = $wp_query->max_num_pages;
    
        $start = max(1, $current_page - intval($maxButtonCount/2));
        $end = min($start + $maxButtonCount - 1, $max_page);
        $start = max(1, $end - $maxButtonCount + 1);
    
        if($current_page <= 1){
            echo "<span>|<</span>";
            echo "<span><<</span>";
        }else{
            echo '<a href="'.get_pagenum_link().'"><span>|<</span></a>';
            echo '<a href="'.get_pagenum_link($current_page-1).'"><span><<</span></a>';
        }
        for($i=$start; $i<=$end; $i++){
            if($i == $current_page) {
                echo "<span class=\"page_num on\">$i</span>";
            } else {
                echo '<a href="'.get_pagenum_link($i).'"><span class="page_num">'.$i.'</span></a>';
            }
        }
        if($current_page >= $max_page){
            echo "<span>>></span>";
            echo "<span>>|</span> ";
        }else{
            echo '<a href="'.get_pagenum_link($current_page+1).'"><span>>></span></a>';
            echo '<a href="'.get_pagenum_link($max_page).'"><span>>|</span></a>';
        }
    
        echo " {$current_page}/{$max_page}页, {$numposts}条记录.";
    }
    

    在主题的 index.php 文件中这样引用:

    <?php theme_echo_pagenavi(); ?>
    
    Posted by ideawu at 2009-03-12 14:47:01 Tags:
  • 2008-10-27

    3行代码的分页算法(求起始页和结束页)

    Views: 24908 | 1 Comment

    涉及到分页时, 除非只显示上一页/下一页, 否则需要计算起始页和结束页. 看过很多代码都是用大量的if-else来实现, 代码量大, 又不简洁. 现在提供一种只需要3行代码的算法.

    一个好的分页算法, 应该具有下面的优点:

    1. 当前页码应该尽量在正中间.
    2. 如果"首页"和"尾页"不可用(当前处于第一页或最后一页), 不要隐藏这两组文字, 以免链接按钮位置变动.
    3. 算法简单.

    下面的算法具有前面1和3两个优点.

    PHP:

    // $curr_index, 当前页码.
    // $link_count, 链接数量.
    // $page_count, 当前的数据的总页数.
    // $start, 显示时的起始页码.
    // $end, 显示时的终止页码.
    $start = max(1, $curr_index - intval($link_count/2));
    $end = min($start + $link_count - 1, $page_count);
    $start = max(1, $end - $link_count + 1);
    

    JavaScript:

    start = Math.max(1, curr_index - parseInt(link_count/2));
    end = Math.min(page_count, start + link_count - 1);
    start = Math.max(1, end - link_count + 1);
    
    Posted by ideawu at 2008-10-27 18:38:08
  • 2008-10-24

    史上最强大的PHP MySQL操作类

    Views: 35547 | 7 Comments

    史上最强大的PHP的MySQL操作类, 即使PDO, ActiveRecord, ORM, 框架, Framework... 都不如这个强大和好用. 有了它, 你就不会再需要任何MySQL封装了 - 除了PHP内置的mysql_xxx函数.

    这个类已经在多个大型项目中得到广泛应用, 经过生产环境至少2年的检验.

    Continue reading »

    Posted by ideawu at 2008-10-24 19:09:26
  • 2008-07-03

    Prado 中解决 Ajax 中文乱码问题

    Views: 15093 | Comments Off

    在 Prado 中使用 Ajax, 如果你的 page 文件和 php 文件使用的不是 UTF-8 编码, 会遇到中文乱码问题. 原因是 Prado 的 Ajax 模块在交换数据时使用 JSON 格式的文本, 而且限制要转换为 JSON 格式的源文本必须是 ASCII 或者 UTF-8 编码的(见 Web.JavaScripts.TJSON 的 encode 方法的注释).

    TJSON.encode 方法尝试把源文本转换为 UTF-8 编码:

    if (($g=Prado::getApplication()->getGlobalization(false))!==null && 
    	strtoupper($enc=$g->getCharset())!='UTF-8'){
    		$var=iconv($enc, 'UTF-8', $var);
    }
    

    但是, 默认情况下 application 对象的 _globalization 字段没有初始化, getGlobalization(false) 返回 null, 所以, 你需要设置 application._globalization 字段. 在入口文件 index.php 中的 $application->run() 之前添加如下语句:

    $g = $application->getGlobalization();
    $g->Charset = "gb2312";
    

    不带参数的 getGlobalization() 方法会先检查 application._globalization 是否为空, 如果为空则先创建一个再返回. 如果你的程序使用其它的编码, 只需要替换 "gb2312" 即可. 或者, 你也可以在 application.xml 文件中定义, 在 modules 节点下添加:

    <module id="globalization" class="System.I18N.TGlobalization" charset="gb2312">
    </module>
    
    Posted by ideawu at 2008-07-03 20:26:03
  • 2008-06-10

    最近需要解决的PHP问题

    Views: 13038 | No Comments

    我的PHP已经用得很熟练了, 因为我可以用PHP开发几乎所有的Web应用, 并且感到愉快. 但是, 一个恼火的问题是, 我离不开PHP手册. 一个原因是我的思维惰性, 另一个原因是PHP的函数的参数设计太混乱了.

    所以, 我最近必须把主要的函数牢牢地记下来, 如 str_replace, str_pos, explode, join等.

    Posted by ideawu at 2008-06-10 11:22:43
|<<<2345678910>>>| 7/10 Pages, 55 Results.