WordPress注册激活邮件、密码修改邮件在QQ邮箱乱码无法打开的解决方法

最近发现WordPress的一个存在了很久的BUG,在一些WordPress站注册账号时,点击激活邮件的链接总是提示“您的密码重设链接无效,请在下方请求新链接”,把链接复制到浏览器地址栏中依然提示错误:

Wordpress注册激活邮件、密码修改邮件在QQ邮箱乱码无法打开的解决方法

这里主要有两个BUG,一是邮件URL中的“&”被解析成了“&amp;”,导致复制整条URL也会提示错误;另一个BUG是WordPress在URL添加了一个“<>”,其中的“>”会被一些邮件服务商(比如国内通用的QQ邮件)解析成URL的一部分,导致你的超链接由http://xxx.com变成了http://xxx.com>,这样肯定是打不开的。

Wordpress注册激活邮件、密码修改邮件在QQ邮箱乱码无法打开的解决方法

若是站点仅仅为内部人员开放注册,这些BUG倒也无关紧要,如果站点是开放注册,这样的用户体验显然太差,本来WordPress的注册流程就不太符合中国用户的使用习惯,再加上这种bug,你是想让用户骂娘吗?

解决方法也比较简单,方法一是直接去改系统文件 /wp-includes/pluggable.php,涉事代码约在1896行(不同WP版本行数可能稍有差异)也可以Ctrl+F下面的代码直接定位:

/* translators: %s: user login */
$message = sprintf(__('Username: %s'), $user-&gt;user_login) . "\r\n\r\n";
$message .= __('To set your password, visit the following address:') . "\r\n\r\n";
$message .= '&lt;' . network_site_url("wp-login.php?action=rp&amp;key=$key&amp;login=" . rawurlencode($user-&gt;user_login), 'login') . "&gt;\r\n\r\n";

把最后一行的“>”删掉,然后把“wp-login.php?action=rp&key=$key&login=“改成“wp-login.php?key=$key&action=rp&login=”就可以了,懂PHP的同学仔细看一下就能明白,都是一些字符串解析的小问题。

不过此方法会直接修改WP核心文件,我们可以自己写一个函数勾到相关的钩子上,把这些系统设置给覆盖掉,由于本人技术比较菜所以直接Google了一段代码如下:

// 函数+过滤器 修复wordpress注册邮件无法打开的BUG
// 参考https://wordpress.stackexchange.com/questions/296308/custom-welcome-email-wordpress
// 2018-9-19
function edit_user_notification_email( $wp_new_user_notification_email, $user, $user_email ) {
global $wpdb, $wp_hasher;
$key = wp_generate_password( 20, false );
/** This action is documented in wp-login.php */
do_action( 'retrieve_password_key', $user-&gt;user_login, $key );
// Now insert the key, hashed, into the DB.
if ( empty( $wp_hasher ) ) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash( 8, true );
}
$hashed = time() . ':' . $wp_hasher-&gt;HashPassword( $key );
$wpdb-&gt;update( $wpdb-&gt;users, array( 'user_activation_key' =&gt; $hashed ), array( 'user_login' =&gt; $user-&gt;user_login ) );
$switched_locale = switch_to_locale( get_user_locale( $user ) );
// send message
$message .= sprintf('您正在%s注册新账号,您的用户名为:',get_bloginfo('name')) .$user-&gt;display_name. "\r\n\r\n";
$message .= '请点击下方链接设置您的密码:' . "\r\n\r\n";
$message .= network_site_url("wp-login.php?key=$key&amp;action=rp&amp;login=" . rawurlencode($user-&gt;user_login), 'login') . "\r\n\r\n\r\n";
$message .= '如果您在注册过程中遇到困难,请邮件联系 xxx@xxx.com' . "\r\n\r\n";
$wp_new_user_notification_email['message'] = $message;
return $wp_new_user_notification_email;
}
add_filter( 'wp_new_user_notification_email' , 'edit_user_notification_email', 10, 3 );

把这段代码添加到function.php即可解决,相关的邮件话术也可以自定义。

除此之外,当用户通过“忘记密码”找回密码时也会遭遇此BUG,相关解决方法可以参考WordPress大学的相关文章:https://www.wpdaxue.com/lost-password-error-invalidkey.html

5年前的文章了,WordPress官方一直没解决这个BUG,真是让人醉了。

WAMP环境使用Mariadb无法安装WordPress的问题

WAMP可以切换mysql和mariadb,如果你把数据库建到mariadb,会在wordpress安装界面遇到信息明明正确(数据库名、数据库地址等)但却无法安装的情况。

原因是mysql和mariadb的端口号不同,mysql的端口号默认为3306,在数据库地址填写localhost会自动映射到localhost:3306,而mariadb的端口号默认为3307。所以,如果你使用mariadb建立数据库,只需要在数据库地址处填写localhost:3307就可以了。

关于资讯类网站目录结构设计与URL格式的一些思考

现在已经8012年了,SEO领域好像还是没什么长进,很多理论套用几年前的那些都还是通用。

一般的资讯平台的目录结构通常还是由聚合页、频道页、文章页三大类构成。

聚合页通常指首页(如www.sina.com.cn),一些大型网站还包括一些子频道的首页(如news.qq.com),就是一个链接,似乎没什么好讲的。对中小型网站,如果内容不充足,子频道能用二级目录就别用二级域名,二级目录对域名的权重提升更大。

频道页通常是一个简单的信息流页面,也可能是一个比较复杂的聚合页。如果网站的频道页比较多,应该事先对网站目录进行规划,防止以后目录变动对搜索引擎收录产生影响。

频道页URL有两种比较常见的格式:

第一个如www.example.com/子频道名称/各种ID,这种格式比较适合频道页数量极大的网站,比如tag比较多、作者比较多等等。优点是层级目录比较浅,URL短,对搜索引擎友好。缺点是URL中无法明确体现各个子频道、孙频道的隶属关系,搜索引擎通常只能通过链接提交、内链等方式索引各个页面。建议使用这种页面结构的网站做好新频道页的链接提交,并且在层级较高的目录做一些网站地图为搜索引擎导航。

第二个如www.example.com/子频道/孙频道/重孙频道(强迫症专属,如果网站还做面包屑的话,目录结构会非常漂亮)这种格式一定程度上可以引导搜索引擎通过URL索引各个频道页(取决于你网站的权重),缺点是URL可能过长,目录层级可能过深,维护成本较大。由于现在很多网站都会主动向搜索引擎提交新页面,其实也没必要非得设计成这个样子。

关于翻页,频道页目前有传统翻页和ajax翻页两种方案。

ajax翻页就是使用ajax在页面上直接请求翻页内容,无限加载内容,不会进行任何路由。优点是比较炫酷,通常用户体验也很好(不需重新加载页面,载入速度更快),缺点是某些场景的用户体验比较差,比如某个频道有几万条内容,如果用户想一次性翻到最后,那基本上是不可能了。另外,ajax翻页对SEO的影响有限,因为翻页页面对搜索引擎的意义不是很大,搜索引擎通常不会收录。

传统翻页就是那种在URL中能直接体现出第1页、第2页的方式了,优缺点与ajax翻页互补。至于URL设计,由于翻页页面反正对搜索引擎也没啥意义,没必要刻意纠结设计成什么样子,www.example.com/子频道/p2、www.example.com/子频道/page/2、还是www.example.com/子频道/?page=2,看个人喜好。

关于文章页URL,目前业内都普遍设计成 www.example.com/文章ID或www.example.com/文章名 的格式了,优点是URL比较短,缺点是某些时候URL会跟其他页面重复。有些人推荐加.html,其实在搜索引擎友好方面已经无所谓了,加.html倒是可以避免URL重复,毕竟www.example.com/1.html和www.example.com/1/(index.html)可是两个完全不同的页面。

如果网站目录比较复杂,设计成 www.example.com/post/文章ID 其实也无所谓,www.example.com/post/ 可以当做最新文章、文章归档之类的页面,即防止跟其他目录撞URL,又可以为搜索引擎导航。

传统一点的URL格式例如 www.example.com/频道名/文章ID,这种格式在以前比较常见,层级明确,面包屑漂亮,通常适合那种内容不多、内容与频道能够对应明确的网站。但对于目前内容爆炸,一篇文章能对应一百个tags的时代而言,这种目录结构的可扩展性显然太差了。

不论设计成什么样,如果搜索引擎已经对文章页进行了大量收录,不到万不得已不建议改变URL结构。即便做好301,对搜索引擎的影响也会很大,切勿作死。

其实抛开以上内容,搜索引擎对网站的权重衡量依然取决于内容质量,虽然内容质量也是通过算法计算出来的,不过算法不也是按照人的感情设计出来的?网站内容的原创度高、对访客有价值、内容能形成社会影响力,这样的网站才会受到搜索引擎的青睐,而SEO只是实现这一目标的途径。就好像做饭,内容是米,SEO是锅,如果没有米,锅再高级也是没有用的。

新媒体时代,做内容一小时,发内容一整天

最近搞了个游戏新媒体账号,才发现现在做内容分发真麻烦。以前是“写稿一分钟,找图一小时”,现在变成“写稿一分钟,找图一小时,发文章能发一整天”,从微信到头条,从知乎到微博,同一篇文章各个平台都得发一遍,碰上个大厂可以直接转存图片的还好,否则就得文字+图片传上去一点一点重新排版,真特么烦

回想Blog时代的时候还没这么多麻烦,那时候也没有这么多搞内容分发的超级平台,大家的流量很多都靠口碑积累,虽然门户的推荐也是能带量的,但也没有现在平台给你加个权,就动辄几万几十万带量的规模啊。

移动互联网时代就是这么可怕,手机取代PC和纸媒变成了阅读终端,而且垄断级别远胜上一轮PC取代纸媒的那个年代。

不过从另一个角度思考,曾经Blog的时代——自媒体野蛮生长的时代,内容变现也是一个天方夜谭啊?阮一峰在Blog上搞付费阅读也不是很久以前的事。不像现在自媒体、新媒体可以通过影响力变现,变现途径终归是有的,实在不行还可以认爸爸、吹泡沫。

分析那么多原因似乎也没用,市场风口出现了,新媒体产业就这样自然而然兴起了,分析再多也都是马后炮。

究竟什么是“互联网思维”?

以前我党总是在讲一个词“互联网+”,总觉得挺傻的,每次听到都特恶心。

最近又觉得“互联网+”还是很有道理滴,我党的领袖们肚子里还是有干货滴(当然,互联网+并不能覆盖所有类型的互联网产品)大概是硅谷精神活不下去了,Geek精神经历了“风口”、又经历了“用户体验”,终于撑不住承认自己没钱是loser了。

最近总在想今日头条出现之前,无觅不是也搞了一个个性订阅的网页端社区嘛,虽然只活了几个月;再之前还有抓虾、鲜果RSS,虽然都是历史的眼泪。

“互联网思维”这几个字原本是一群硅谷Geek和向往硅谷精神的人搞出来的,后来却被一群卖弄嘴皮和脸皮的自称“产品经理”的老板们抢走了,PM们风风光光了好几年。如今大浪淘沙,到头来有没有互联网精神,那还得看“需求到底能不能实现”,毕竟嘴巴能讲出用户体验这四个字,但嘴巴能拱出负载均衡吗?

冷笑话

有人好奇我这么喜欢鼓捣编程,为啥没去做码农?其实原因有好多嘛,当初站在人生十字路口的时候,其实还是有机会去吃程序饭的,不过那时候觉得程序员这个群体似乎太难相处了:有些理工男格调真是好低啊,有些Geek又过分自命清高了些,总之就是完全走在两种极端的奇葩群体嘛……于是最终选择走上了产品的慢慢不归途。

不过懂事之后才发现,做产品,依然还要跟码农打交道哒~

如何关闭央视影音的弹窗广告?

每次打开央视影音windows客户端,央视影音都会在后台留一个常驻进程,这个进程即便你推出央视影音主程序也不会关闭,会不断向你推送右下角弹窗广告。

个人目前找到一个比较简单、不需要依赖任何第三方软件的解决办法,打开央视影音的安装文件夹,找到CBoxService.exe文件,改一下它的文件名,随便改成什么都可以比如CBoxService1.exe,之后央视影音就不会弹广告了。

需要注意的是,每次升级,CBoxService.exe文件又会被程序重新生成,如果按照此方法再去改一次就可以了。

(适用版本v4.4以下)

wordpress自定义默认头像


// 自定义默认头像

add_filter( 'avatar_defaults', 'zzjbzlz_avatar' );

function zzjbzlz_avatar ($avatar_defaults) {
$myavatar = get_bloginfo('template_directory') . '/img/zzjbzlz_avatar.gif';
// OR --> $myavatar = "http://zzjb.leiling.org/wp-content/uploads/2017/05/default_avatar.gif";
$avatar_defaults[$myavatar] = "重装机兵资料站";
return $avatar_defaults;
}