提醒:本文最后更新于 3210 天前,文中所描述的信息可能已发生改变,请仔细核实。
人是朝前走的,软件也是。
这次Wordpress 4.4再度更新了不少东西,但很多东西对我们来说完全无用,或没有必要。
当然还有一些使用上的问题,也是令人哭笑不得。
很多人发QQ给我,问及上次《博客更新至WordPress 4.4》文章说的几个问题,该如何解决。
想想还是把代码放上来,顺带简单描述一下问题。
第一个问题:AJAX评论翻页后,页码导航消失。
答:这个问题,主要是超出WP主循环后,得不到评论总页数为多少所致。
找到你的AJAX加载评论页面的PHP函数,找到类似代码:
paginate_comments_links('current=' . $pageid . $baseLink . '&prev_text=上一页&next_text=下一页');
修改为
$totalPage = '&total='.get_comment_pages_count($comments); paginate_comments_links('current=' . $pageid . $totalPage . $baseLink . '&prev_text=上一页&next_text=下一页');
如此便解决了。
第二个问题:升级到新版本后,楼层号出错,统计的数量也不对。
答:这个问题,其实应该说是两个问题才对。
1.对于楼层号出错的,主要是因为$in_comment_loop的判断有问题,新版本使用wp_list_comments函数后,传递的$in_comment_loop都是空,我们需要将评论回调函数中的判断修改一下即可。大概在评论回调函数找到类似代码如下:
$page = ( !empty($in_comment_loop) ) ? get_query_var('cpage') : get_page_of_comment( $comment->comment_ID, $args );
修改为
$page = ( get_query_var('cpage') ) ? get_query_var('cpage') : get_page_of_comment( $comment->comment_ID, $args );
即可,评论回调函数的名称,可以通过找到你使用的wp_list_comments函数中的callback参数看到。如:
wp_list_comments('type=comment&callback=lopercomment&max_depth=10000');
那么必有lopercomment这个评论回调函数。
当然楼层号还出错,那就只能再检查一下回调函数,看哪里错了。各家写法不一,无法一一列举。
2.对于统计数量不对,其原因主要是WP改变了统计方式,以前是输出全部评论数,现在只输出了设置规定的数量(仪表盘=>设置=>讨论)。
而我们大多数代码偷了个懒,只是单纯的count评论循环的评论数,当WP改变方式后,就错误了。
因为各家代码不同,写法不同,而且可能主题需要修改多个文件,我就大概讲下,找到类似于:
count($comments);
或者
count($comments_by_type['comment']);
等一些计数方法,将其改为
get_comments(array('status' => 'approve', 'post_id'=> $post->ID, 'count' => true));
当然你可以用
get_comments_number($post->ID);
但是都要清除一些其他计数。一般主题都有带。
如果你想统计Traceback或Pingback的数量,不建议使用:
count($comments_by_type['pings']);
而是用
get_comments(array('status' => 'approve', 'post_id'=> $post->ID, 'type'=> 'pings', 'count' => true));
来获得计数。
说句实在话,更喜欢通过sql来得到计数。。。方便。。。或许回头应该整合下,写个函数。
第三个问题,图片已经在设置做了不裁剪,但新版本,在上传媒体附件时,还是会自动生成。
答:这个是因为WP新版本,添加了图片自适应(响应式),以兼容各种设备。
如果是跟我一样没做自适应的,就没必要去特意裁剪图片去减小图片大小,浪费。通过:
add_filter( 'max_srcset_image_width', create_function( '', 'return 1;' ) );
可以禁用这一特性。
那些已经做了响应式主题,可以考虑使用这一特性,毕竟在手机端,会自动裁剪为合适大小,以减小图片大小,加快加载,减少流量。当然,实际用起来怎么样,我也不知道。。。
第四个问题,新版本加载了几个头和js。
答:新版本可以自动识别所有带oEmbed(URL)特性的,可以在文章内嵌入其他WP网站。具体体现比如,你在编辑器写了对方博客的链接,如果其博客有声明支持oEmbed(URL),那么会自动转换成带样式的链接(有标题、摘要、评论数、分享按钮)。
这一特性怎么说呢,基本用不上。
禁用这一特性可以使用插件Disable Embeds,他会禁用掉js的加载及自动转换。
至于wp-json Link这个头,是给REST API用的,通过:
remove_action( 'wp_head', 'rest_output_link_wp_head' );
来去掉。如果实在是不想用REST API,还可以通过:
add_filter('rest_enabled', '_return_false'); add_filter('rest_jsonp_enabled', '_return_false'); remove_action('template_redirect', 'rest_output_link_header');
来禁用。
第五个问题,新版本,上传媒体附件,发表文章后,图片没有灯箱效果。
答:新版本,确实在默认配置,去掉了自动链接到附件这一特性(新版本,“链接到”的默认值是无),这使得附件链接不会自动链接到媒体文件。也导致灯箱判断不到a标签(只有img标签),而无法工作。
通过添加:
update_option('image_default_link_type', 'file' );
可以解决,只要执行一次就好。。。用完就删掉这段代码。
偷懒的话,你可以访问http://你的博客地址/wp-admin/options.php(比如我是https://kn007.net/wp-admin/options.php),进入全部设置,找到image_default_link_type这一项,设置为file,记得保存设置。可以修改的值为none、file、post、custom,分别代表为无、媒体文件、文章页面、自定义。
第六个问题,新版本,评论时候,评论表单在评论框下面,而不是之前的在上面。
答:WP做出这个改变,可能是为了方便填过表单朋友,可以提前看到评论框。但一般我们大部分主题,对评论过填过表单的,都会自动收缩表单。而且最重要的是习惯被改变了,感觉不好。
恢复的话很简单,添加如下代码就行了。
function recover_comment_fields($comment_fields){ $comment = array_shift($comment_fields); $comment_fields = array_merge($comment_fields ,array('comment' => $comment)); return $comment_fields; } add_filter('comment_form_fields','recover_comment_fields');
此问题来自大发。
第七个问题,更新至4.4.1后,评论翻页又异常了,翻页后读取出来的评论,变成全局评论,也没有了翻页。
答:只想弃用WP了,越搞越废。这个问题的解决办法是由我们的牧风同学研究WP核心代码后得出的。
找到你的AJAX评论翻页代码,找到
$wp_query->is_singular = true;
把它放于wp_list_comments之后即可解决,我晕。
因为只有当is_singular=false,wp_list_comments传入的评论才可用,但是后面的paginate_comments_links又必须is_singular=true 才行,所以你懂的。。。。。。
再这样更新下去,是不是每次都要学习一次WP核心代码。。。
其他问题,暂时没人问,我也没发现。。。有的话会补充进来。
可以提,但尽量自行解决。
祝元旦快乐。
转载请注明转自:kn007的个人博客的《WordPress 4.4的一些变更的修改》
沙了发...
@夜枫: 喵
4.4是最后一个尾巴了吧,5.0啥时候来
@aunsen: 太乐观了吧,Wordpress 3最终版本是3.9.2才更新到wordpress 4.0的,后续3.9系列应该还有小版本补丁。
现在才4.4。除了3.8.2、3.8.3、3.9是几天一更,其他都是至少一个月才会更新一次。。。
辛苦折腾wp啊
@傅小黑: 这是之前折腾的总结。
技术牛。
@wu先生: 谬赞了
paginate_comments_links 我研究了好几天, $wp_query 的所有属性无论是否声明 single/post_id, 都是null
@牧风: 估计跟我最新一篇文章提到的问题有关连。
@牧风: 在主循环貌似又没问题,自己使用函数调用就不行了。
@kn007: 还没有本地挨个测函数, 不然翻页一直都是有问题的
@牧风: 我当时通过翻函数,看到问题可能,试了一下,发现问题就没再深究了,哪知道后续各种东西各种null,真是想扁人。
后来又发现几个问题,让我更是无语。
发现问题,放在wp,貌似这两次都算是第一时间。
但wp官方从不回应,第一次的好歹能自己解决,第二次实在没办法,不让他缓存,会多出17000+次查询,真是让人怀疑,其实缓存是成功的,只是迅速被删掉了。
最近没时间折腾,忙。你有什么发现,可以交流,或许能找到问题。
@牧风: 翻页暂时通过传total参数解决,要仔细排除到为什么主循环可以,要看的函数太多了
@kn007: 我没有在本地架设,翻了一半,速度太慢了,等会本地找找问题
@牧风: 昨天才搭建了本地环境,不过是为了阉割某个插件。
搞了个微信订阅号,发现发文章贼麻烦,暂时给了个接口,可以通过命令读博客文章。诶,然并卵的东西。
我们要是住一起就可以轮流排了。。。
@牧风: 现在第二个问题,我也还没细排。为什么看起来缓存失败却查询少,缓存拒绝反而要增加相同请求次数的查询。这个只能拿博客测了,有外部缓存及那么多评论。。。
我一直有点怀疑哪里传进了非法变量。
看到你也要开始排,突然有点动力,虽然你排的是第一个问题,两边到时我都看看。
加油
@牧风: 真的想打人了。
试了下居然在有主循环下(比如打开首页)的评论有缓存,打开评论管理页(edit-comments.php)是没有。
但这缓存有点怪,用wp_cache_get居然能得到值,但Memcached::Get()得不到,我晕了。
@牧风: 改变wp_cache保存的组居然就工作了。但是改组的话,所有代码都要变动。。。擦
wp_list_comments 加了这么一段:
if ( is_singular() && ( $r['page'] || $r['per_page'] ) ) {
$current_cpage = get_query_var( 'cpage' );
if ( ! $current_cpage ) {
$current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;
}
$current_per_page = get_query_var( 'comments_per_page' );
if ( $r['page'] != $current_cpage || $r['per_page'] != $current_per_page ) {
//var_dump(get_queried_object_id());
$comments = get_comments( array(
'post_id' => get_queried_object_id(),
'orderby' => 'comment_date_gmt',
'order' => 'ASC',
'status' => 'all',
) );
}
}
现在这一整个代码,就变得这么蛋疼了:
$wp_query->comments = $comments;
$wp_query->comment_count = count($wp_query->comments);
wp_list_comments(...)
$wp_query->is_singular = true;
paginate_comments_links(...);
@牧风: 看起来是有点蛋疼。
评论缓存的问题,我在新帖上说了
https://kn007.net/topics/updating-to-wordpress-4-4-1/
我用wp_cache_set('test', 'test', 'comment')居然能wp_cache_get('test', 'comment'),但看不到该值存在于外部存储,看来只能查下哪里用了add_to_internal_cache了,太坑爹了。
最后list define,发现Wordpress定义了plugins、comment、counts为内部缓存,说白就是php缓存。真是服了,干嘛不把comment_meta也放进去,神经。最大的问题是我没发现这是在哪里定义的。。。
@牧风: wp自己都不用$in_comment_loop了,直接get_query_var( 'cpage' )。。。还是以前就是这样,这是哪个文件的哪一行?
@kn007: get_query_var( 'cpage' ) 一直都有, 就是获取 $_GET['cpage'], 这段代码感觉有点蛋疼
@牧风: 嗯,我没看以前版本的代码。
get cpage很正常。。。我只是不明白会有那么多东西return null,这么蛋疼。。
@kn007: 之前的版本是任意地方都可以调用 $wp_query, 这个版本应该是个部分全局量, 不能随意滥用了, 这个版本在内存上看来花了很多功夫
@牧风: 内存反而用得不少。
他把plugins、comment、counts为内部缓存组,comment那么多条,然后一列sql数据的结果,存在php,相当于把数据库按ID存放在php变量中。哪里可以这么干,这样我还要外部缓存干嘛。
我改了个缓存组名字,mc一下就用了20多M。。。
@牧风: 之前版本能任意取比较好,现在count($comments)都是错的。以前好歹是全部,现在是一页多少条。。。
@牧风: 看到了。
./wp-includes/comment-template.php:1933:
@kn007: 不管传不传 $comments, 都会重新获取一遍
@牧风: 看到了。
comments_template和wp_list_comments。
不知是哪个小婊砸写的。。。折磨人。。。
暂时用我的狗屁办法解决吧,传个total。
改变主程序代码太蛋疼。
评论缓存部分的还没有看, 自带restful 的方法还没用过
@牧风: php-7.0.2毛病更多,正在fix code。晚点看。
@kn007: 还没升级, 7.0出来的还是有点仓促, 再等等
@牧风: 看到我PHP 7文章没。。。有个坑,临时用大内存解决。。。
其他小坑。。。好在解决了。。。
比wordpress好解决了,只想说
Who let the dogs out...
@牧风:
搞定后,内存有所下降,却仍然不小,但查询少了,算是有提高吧。
之前:Had 23 queries in 0.1978 seconds, page to load in 7.930 seconds, using 66.65MB memory.
之后:Had 12 queries in 0.0158 seconds, page to load in 7.716 seconds, using 52.34MB memory.
但你以为这就是胜利了么?太小瞧Wordpress了,成功缓存后,所有评论只能看到父评论,看不到子评论,摔盘子!卧槽了。
@kn007: 谁让wordpress 这么多全局变量呢, 这是在折磨自己, 也是恶心别人
@牧风: 当我在wp论坛wtf时,对方来人了,把帖子关了,说我改了主文件就很难帮上忙了,妹的,不改能发现问题嘛。。
之前怎么叽叽喳喳对方鸟都不鸟,wtf一出,马上就来了。
懒得说了。
wp太臃肿了,而且我只能说他的书写方式和逻辑不是我能懂的,嵌套多个函数不是问题,问题是很多函数该调用现有函数去获取某个值却不,都是各用各的方法,明明只要回调一下就好,又要自己从别的地方拿数据。。
@kn007: 官方也觉得开销大, 现在开始缓存插件方法/自带方法, 感觉并无卵用啊
@牧风: 越做越乱,感觉。只希望能尽快fix。主要是怪我英文不好。硬伤。
@kn007: wordpress 是面向过程,新手容易上手呢
@牧风: 嗯嗯,而且利用好,功能强大。
这些优点是否认不了的。
@牧风: 晕死,更新到4.4.1后,怎么wp_list_comments列出来的评论不对
@牧风: 重装了也不行、、
@kn007: 因为 ./wp-includes/comment-template.php:1933 这里的改动, 所以我之前解决办法是::
$wp_query->comments = $comments;
$wp_query->comment_count = count($wp_query->comments);
wp_list_comments(...)
$wp_query->is_singular = true;
paginate_comments_links(...);
在wp_list_comments 之后, 设置 $wp_query->is_singular = true, 这样翻页才是正确的
@牧风: 必须改core么?
我能爆粗口么。。。
@牧风: 哦,到家试了下。不用改core,但为何要在wp_list_comments后声明,没搞懂。。。
@kn007: wp_list_comments 如果is_singular=false, 传入的评论就可用, 但是paginate_comments_links,is_singular必须是true 才行
@牧风: 原来是这个问题。了解了。
@牧风: 是因为
./wp-includes/comment-template.php:1932
的这里判断吗?
if ( is_singular() && ( $r['page'] || $r['per_page'] ) ) {
@牧风: 谢谢你了。
@牧风: 抓到了。
./wp-includes/ms-blogs.php:659: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
./wp-includes/ms-blogs.php:730: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
./wp-includes/load.php:477: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
@牧风: 一会开试,看下能不能解决缓存问题。