自去年年末开始玩蚂蚁森林,到今天终于种成一棵梭梭树,在蚂蚁森林好友间相互偷取能量,重燃了当初的偷菜游戏的热情。目前共有20位支付宝好友开通了蚂蚁森林,认真玩的不到10位,除了自己支付宝消费,平时很难收取到足够的能量,因此树长的及其缓慢,好在最近我发现了诀窍,自己每天能够生产出 2000g 的能量,才有了小树的疯狂生长。

由蚂蚁森林得到的一些思考

刚一接就觉得蚂蚁森林虽是一个公益项目,但丝毫不妨碍它作为一款休闲小游戏的呈现,以手机支付宝的巨大用户体量,发展手机小游戏绝对很有想象空间,也许蚂蚁森林本质上便是阿里发展手机游戏的一次尝试,要搞游戏,事实上支付宝很可能已经开始这么干了。这些年阿里在支付相关领域已经布局的差不多了,是时候在手机游戏领域寻求突破了(其它人都这么干了)。

通过游戏阿里可以赚钱,本身作为支付工具,对鼓励用户在游戏中消费具有先天优势;同时,还可以增强用户黏性、提升活跃度,加强用户间互动,从而建立支付宝梦寐以求的关系链。当前的问题可能是阿里缺少拿得出手的游戏产品,不管怎样,阿里迟早要踏足(手机)游戏领域。

坐车打发时间,胡乱写了以上这些,不知我的预言会不会成真。

本周上班没什么活,对博客外挂做了些许改动。

改进搜索结果显示

之前搜索结果默认最多显示100个字符长度,有个缺陷即便长度不够100,也会在最后加上省略号,改进之后只有长度超过100才会显示省略号。

<?php
$get_content = (strtolower($source) === "content") ? get_the_content() : get_the_excerpt();
echo mb_substr(get_the_excerpt(),0,100,"utf8");
if (strlen($get_content) > 100) {
        echo "...";
    }
?>

logo 做成字体图标,增加回到顶部功能

把小乌贼调整了一下,利用 icomoon 做成字体图标,这样无图模式也能看到小乌贼了。

同时,给小乌贼加了 go to top 功能,方便浏览时快速回到网页顶部。

临近放假事情不算多,利用空余时间陆陆续续对博客做了一些调整。

评论回复邮件通知延迟发送

无意发现了ze3kr 的评论回复邮件通知代码含有执行计划任务的代码,抄过来加到在用的评论回复邮件通知插件上,这个网站的评论回复邮件通知依赖 Comment Email Reply 插件,不知从 WordPress 的哪个版本开始这个插件已经不能在这个博客正常工作了,顺便一起改了一下,下面是现在在用的完整代码:

<?php
/**
* Plugin Name: Comment Email Reply
* Plugin URI:  http://kilozwo.de/wordpress-comment-email-reply-plugin
* Description: Simply notifies comment-author via email if someone replies to his comment. Zero Configuration. Available in English and German. More languages welcome.
* Version:     1.0.5(dev)
* Author:      Jan Eichhorn
* Author URI:  http://kilozwo.de
* License:     GPLv2
*/

add_filter('wp_mail_content_type', function($contentType) { return 'text/html'; });
function cer_comment_notification($comment_id) {
    $comment_object = get_comment($comment_id);
    if ($comment_object->comment_approved == 1 && $comment_object->comment_parent > 0) {
        $comment_parent = get_comment($comment_object->comment_parent);

        $mailcontent =
            '<html>
            <head>
            <style>
                #mgy{margin:0;padding:0;font-size:16px;font-size:1rem;line-height:1.8;color:#444}
                #mgy .a{width:100%}
                #mgy .b{width:520px;margin:0 auto;padding:20px}
                #mgy .c{clear:both}
                #mgy .d,#mgy .n{margin:0 0 24px}
                #mgy .e{border-top:1px solid #DDD}
                #mgy .f{margin-bottom:10px}
                #mgy .g{margin:0 5px 0 0}
                #mgy .h{width:100px;height:32px;line-height:32px;padding:2px;border-radius:30px;color:#FFF;background:#52C69C;box-shadow:1px 1px 0 #DDD}
                #mgy .h:hover{background:#57AD68}
                #mgy .j{margin:0 6px;border-bottom:1px dotted;text-decoration:none}
                #mgy .k{text-align:center;text-decoration:none}
                #mgy .l{display:block}
                #mgy .m{color:#57AD68}
                #mgy .o{margin:5px 0}
                #mgy .p{color:#5A5A5A}
                #mgy .q{background:#F0F0F0;border-radius:4px;padding:8px;line-height:1.5rem;line-height:24px}
                #mgy .s{color:#2458A1}
                @media screen and (max-width:720px) {
                    #mgy{font-size:18px;font-size:1.125rem;line-height:2}
                    #mgy .b{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
                }
            </style>
            </head>
            <body>
            <div id="mgy">
            <div class="a"><div class="b"><div class="o"><span class="g">'
            .$comment_parent->comment_author.
            ':</span>你好</div>'.
            '<div class="f"><span class="g s">'.$comment_object->comment_author.'</span>在'.
            '<a class="j" href="'.get_permalink($comment_parent->comment_post_ID).'">'.get_the_title($comment_parent->comment_post_ID).'</a>中 <span class="f">对你发表的评论:</span></div>'.
            '<div class="f q">'. esc_html($comment_parent->comment_content) .'</div>'.
            '<div class="f">作了如下回复:</div><div class="d s q">'
            . esc_html($comment_object->comment_content) .
            '</div>'.
            '<a class="d h k l" href="'.get_comment_link( $comment_parent->comment_ID ).'">继续回复</a>'.
            '<div class="f">感谢对<a class="j m" href="//muguayuan.com">木瓜园</a>的支持,谢谢!</div>'.'<div class="e"><span class="p">MALI<span class="m">YA</span>NA</span></div></div></div></div>
            </body></html>';
        $email = $comment_parent->comment_author_email;
        $title ='来自 ['.get_option('blogname') . '] 的评论回复';
        wp_mail($email, $title, $mailcontent);
    }
}
add_action('comment_mail_notify','cer_comment_notification');

function comment_mail_notify_schedule($comment_id) {
    wp_schedule_single_event( time()+300, 'comment_mail_notify', array($comment_id));
}
add_action('wp_insert_comment','comment_mail_notify_schedule',99,2);

function cer_comment_status_changed($comment_id, $comment_status) {
    $comment_object = get_comment($comment_id);
    if ($comment_status == 'approve') {
        cer_comment_notification($comment_object->comment_ID, $comment_object);
    }
}
# Fire Email when comments gets approved later.
add_action('wp_set_comment_status','cer_comment_status_changed',99,2);
?>

更改防垃圾评论机制

卸载了 Akismet 插件,给评论功能加了两个小机关,配合起来效果不错,只是对人工垃圾评论无能为力。

外观上的一些调整

  • 过年了,要有气氛,临时改了个有春节喜庆氛围的配色;
  • 无限滚动改了新的加载动画,这是个 css3 动画,只要目的是改善手机无图模式下的浏览体验,也就是说这个主题要逐渐停止对 IE 老旧浏览器的支持了。

今天手机被孩子拿着开 Garageband 打鼓,对着屏幕敲敲打打,忽然怎么也敲不响了,孩子觉得奇怪问为什么敲不响了。检查手机屏幕完好无损,只是失灵了,表现为屏幕触摸失灵。

屏幕失灵具体表现

  1. 无论怎么按 Home 键始终无反应,来电屏幕会亮,铃声振动也正常,能够触摸屏幕接通电话,仅仅是能接电话,其它操作统统失灵;
  2. 电源键有效,可以通过按电源键正常点亮或熄灭屏幕,但触摸屏幕仍处于失灵状态;
  3. 电源键+Home 并不能重启手机;
  4. 登录 iCloud 可以定位到手机,同时也可通过查找我的 iPhone 功能让手机响铃和振动,屏幕弹出的对话框时,能且只能点掉“好”这个按钮。

搜索 iPhone 7 Plus 屏幕失灵 这组关键字,发现有人遇到同样的情况,看来应该不是个例。

如何解决

解决办法其实很简单,以往 iPhone 是通过同时按住电源键+Home键强行重启的,只不过到了 iPhone 7/iPhone 7 Plus 这一代做了调整,不再支持电源键+Home键强行重启了,而是更换为音量-+电源键了,所以解决办法很简单,只需要同时按住音量-+电源键便会自动重启,即下图中的调低音量睡眠/唤醒按钮,重启后问题解决。

同时按住音量-+电源键重启,好熟悉的组合呀,这不是 Android 机的惯例么,不禁要让人多想了,怎么回事?细细一想也不能怪库克:作为首要技术更新,iPhone 7 和 iPhone 7 Plus 这一代的 Home 键不是实体键,是()不下去的(Taptic Engine 成功欺骗了每个人),想到一个成语:殊途同归!

上次介绍的方法可以有效阻止通过 wp-comment-post.php 提交的常规垃圾评论,却防不了通过 trackback 发送的垃圾评论。

WordPress 的评论类型comment_type共有三种:

  1. 表示是通过 wp-comment-post.php 提交的常规评论;
  2. trackback 通过 wp-trackback.php 提交,wp-trackback.php 只被 trackback 服务调用,查看 nginx 日志会发现 trackback 来的垃圾评论是直接在目标页面地址后面加上“/trackback” POST 过来的;
  3. pingback 通过 xmlrpc.php 提交,xmlrpc.php 除了被 pingback 调用之外,通过 WordPress APP 访问博客时也需要调用它。

普通方法

这样就好办了,暴力一点的做法可以通过 nginx 配置文件直接禁止对 wp-trackback.php 文件的访问,但 xmlrpc.php 不能随便禁止,因为有其它服务要用到它,下面有个更好的办法可以避免这个问题。

更好的办法

更好的做法是在评论被写入 comment 表前判断评论类型,放过常规评论(阻止常规垃圾评论请见本文开头处的链接,除非人工提交或专门针对规则开发针对性的程序,理论上不会有漏网之鱼),单独对 trackback 和 pingback 类型做处理,得到下面的代码,放入主题的 function.php 文件即可:

if ( ! is_user_logged_in()) {
//block trackback spam comments
function trackback_check($commentdata) {
    extract($commentdata);
    $post_object = get_post($comment->comment_post_ID);
    if ($comment_type == 'trackback') { // if trackbacks ( || $comment_type == 'pingback')
        wp_die('Trackbacks were disabled!');
    }
    return $commentdata;
}
add_filter('preprocess_comment', 'trackback_check', 1);

上面代码只阻止未登陆用户的 trackback,pingback 以及博客内部的 trackback 则可正常工作,如要同时阻止 pingback,只需把|| $comment_type == 'pingback'加到$comment_type == 'trackback'后面,这样一来即不影响类似 WordPress APP 这种需要调用 xmlrpc.php 来正常工作的服务,又能屏蔽外部的 pingback 了。

改动一下上述代码可将 trackback 垃圾评论的详细内容推送到邮箱,基本上 trackback 来的全是垃圾评论,几乎不存在误杀。

trackback 垃圾评论详情