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是锅,如果没有米,锅再高级也是没有用的。

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

每次打开央视影音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;
}

wordpress评论函数

调用评论

comment_form()常用在comments.php中,调用整个评论区

<?php comment_form($args, $post_id); ?>

$args:comment_form() 的输出配置参数,为一个关联数组,配置项非常丰富,下面我们会详细说明。
$post_id:文章id,默认为空,即当前id
$args的默认配置:

$defaults = array(
	'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
	'comment_field'        => '

<label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea>

',
	'must_log_in'          => '

' .  sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

',
	'logged_in_as'         => '

' . sprintf( __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

',
	'comment_notes_before' => '

' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '

',
	'comment_notes_after'  => '

' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '

',
	'id_form'              => 'commentform',
	'id_submit'            => 'submit',
	'title_reply'          => __( 'Leave a Reply' ),
	'title_reply_to'       => __( 'Leave a Reply to %s' ),
	'cancel_reply_link'    => __( 'Cancel reply' ),
	'label_submit'         => __( 'Post Comment' ),
);

如果需要修改表单,需要在function.php中使用过滤器comment_form_default_fields

删除表单字段

如果我们想要删除网址字段,只需要打开主题的 functions.php 文件,添加以下代码:

add_filter(‘comment_form_default_fields’, ‘mytheme_remove_url’);

function mytheme_remove_url($arg) {
$arg[‘url’] = ”;
return $arg;
}

保存后刷新页面,你就会看到“url”输入框已经不存在了。

新增表单字段

假设我们要添加一个 QQ 字段,同样在主题的 functions.php 添加下面的代码即可:

add_filter('comment_form_default_fields', 'my_fields');

function my_fields($fields) {
	$fields['qq'] = '

' . '<label for="qq">'.__('QQ').'</label> ' .
	'<input id="qq" name="qq" type="text" value="' . esc_attr( $commenter['comment_qq'] ) . '" size="30" />

';
	return $fields;
}

刷新页面,即可看到新增的表单。

替换默认表单字段

代码和上面的例子差不多,如果你设置的字段为(author、email、url)其中之一,即 $fields[‘author’]、$fields[’email’]、$fields[‘url’] ,就可以替换默认的字段的输出内容。

默认的这三个字段如下:

add_filter('comment_form_default_fields', 'mytheme_remove_url');

function my_fields($fields) {
	$fields =  array(
		'author' => '

' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
		'<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' />

',
		'email'  => '

<label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
		'<input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' />

',
		'url'    => '

<label for="url">' . __( 'Website' ) . '</label>' .
		'<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" />

',
		);
}

需要注意的是,wordpress原生只支持author、email、url,如果新增或修改前台表单,还需要对评论审核后台、数据库等做对应改造。

参考:https://www.wpdaxue.com/wordpress-comment_form.html

解决git在Windows下的乱码问题

在命令行下输入以下命令:

git config --global core.quotepath false # 显示 status 编码
git config --global gui.encoding utf-8 # 图形界面编码
git config --global i18n.commit.encoding utf-8 # 提交信息编码
git config --global i18n.logoutputencoding utf-8 # 输出 log 编码
export LESSCHARSET=utf-8

最后一条命令是因为 git log 默认使用 less 分页,所以需要 bash 对 less 命令进行 utf-8 编码

以上命令等效于:

在 etc\gitconfig 中添加

[core]
quotepath = false
[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = utf-8

在etc\profile 中添加

export LESSCHARSET=utf-8

参考:解决git在Windows下的乱码问题