kn007的个人博客
♥ You are here: Home > 软件与网络 > php > WordPress 4.4的一些变更的修改

WordPress 4.4的一些变更的修改

by | 52 Comments

提醒:本文最后更新于 3027 天前,文中所描述的信息可能已发生改变,请仔细核实。

a21232aa6e3c32bc7a5300c15f139f95

人是朝前走的,软件也是。

这次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的一些变更的修改

donate
有所帮助?

Comments

52 Comments立即评论
  1. 沙了发... :lol:

    1. MOD回复

      @夜枫: 喵

  2. LV3回复

    4.4是最后一个尾巴了吧,5.0啥时候来 :mrgreen:

    1. MOD回复

      @aunsen: 太乐观了吧,Wordpress 3最终版本是3.9.2才更新到wordpress 4.0的,后续3.9系列应该还有小版本补丁。
      现在才4.4。除了3.8.2、3.8.3、3.9是几天一更,其他都是至少一个月才会更新一次。。。

  3. 辛苦折腾wp啊

    1. MOD回复

      @傅小黑: 这是之前折腾的总结。

  4. 技术牛。

    1. MOD回复

      @wu先生: 谬赞了

  5. paginate_comments_links 我研究了好几天, $wp_query 的所有属性无论是否声明 single/post_id, 都是null :???:

    1. MOD回复

      @牧风: 估计跟我最新一篇文章提到的问题有关连。

    2. MOD回复

      @牧风: 在主循环貌似又没问题,自己使用函数调用就不行了。 :x

    3. @kn007: 还没有本地挨个测函数, 不然翻页一直都是有问题的

    4. MOD回复

      @牧风: 我当时通过翻函数,看到问题可能,试了一下,发现问题就没再深究了,哪知道后续各种东西各种null,真是想扁人。
      后来又发现几个问题,让我更是无语。
      发现问题,放在wp,貌似这两次都算是第一时间。
      但wp官方从不回应,第一次的好歹能自己解决,第二次实在没办法,不让他缓存,会多出17000+次查询,真是让人怀疑,其实缓存是成功的,只是迅速被删掉了。
      最近没时间折腾,忙。你有什么发现,可以交流,或许能找到问题。

    5. MOD回复

      @牧风: 翻页暂时通过传total参数解决,要仔细排除到为什么主循环可以,要看的函数太多了

    6. @kn007: 我没有在本地架设,翻了一半,速度太慢了,等会本地找找问题

    7. MOD回复

      @牧风: 昨天才搭建了本地环境,不过是为了阉割某个插件。
      搞了个微信订阅号,发现发文章贼麻烦,暂时给了个接口,可以通过命令读博客文章。诶,然并卵的东西。
      我们要是住一起就可以轮流排了。。。 :razz:

    8. MOD回复

      @牧风: 现在第二个问题,我也还没细排。为什么看起来缓存失败却查询少,缓存拒绝反而要增加相同请求次数的查询。这个只能拿博客测了,有外部缓存及那么多评论。。。
      我一直有点怀疑哪里传进了非法变量。
      看到你也要开始排,突然有点动力,虽然你排的是第一个问题,两边到时我都看看。
      加油

    9. MOD回复

      @牧风: 真的想打人了。
      试了下居然在有主循环下(比如打开首页)的评论有缓存,打开评论管理页(edit-comments.php)是没有。

      但这缓存有点怪,用wp_cache_get居然能得到值,但Memcached::Get()得不到,我晕了。

    10. MOD回复

      @牧风: 改变wp_cache保存的组居然就工作了。但是改组的话,所有代码都要变动。。。擦

  6. 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(...);

    1. MOD回复

      @牧风: 看起来是有点蛋疼。

      评论缓存的问题,我在新帖上说了

      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也放进去,神经。最大的问题是我没发现这是在哪里定义的。。。

    2. MOD回复

      @牧风: wp自己都不用$in_comment_loop了,直接get_query_var( 'cpage' )。。。还是以前就是这样,这是哪个文件的哪一行?

    3. @kn007: get_query_var( 'cpage' ) 一直都有, 就是获取 $_GET['cpage'], 这段代码感觉有点蛋疼

    4. MOD回复

      @牧风: 嗯,我没看以前版本的代码。
      get cpage很正常。。。我只是不明白会有那么多东西return null,这么蛋疼。。

    5. @kn007: 之前的版本是任意地方都可以调用 $wp_query, 这个版本应该是个部分全局量, 不能随意滥用了, 这个版本在内存上看来花了很多功夫

    6. MOD回复

      @牧风: 内存反而用得不少。

      他把plugins、comment、counts为内部缓存组,comment那么多条,然后一列sql数据的结果,存在php,相当于把数据库按ID存放在php变量中。哪里可以这么干,这样我还要外部缓存干嘛。
      我改了个缓存组名字,mc一下就用了20多M。。。

    7. MOD回复

      @牧风: 之前版本能任意取比较好,现在count($comments)都是错的。以前好歹是全部,现在是一页多少条。。。 :cry:

    8. MOD回复

      @牧风: 看到了。
      ./wp-includes/comment-template.php:1933:

    9. @kn007: 不管传不传 $comments, 都会重新获取一遍 :o

    10. MOD回复

      @牧风: 看到了。

      comments_template和wp_list_comments。

      不知是哪个小婊砸写的。。。折磨人。。。

      暂时用我的狗屁办法解决吧,传个total。

      改变主程序代码太蛋疼。

  7. 评论缓存部分的还没有看, 自带restful 的方法还没用过

    1. MOD回复

      @牧风: php-7.0.2毛病更多,正在fix code。晚点看。

    2. @kn007: 还没升级, 7.0出来的还是有点仓促, 再等等

    3. MOD回复

      @牧风: 看到我PHP 7文章没。。。有个坑,临时用大内存解决。。。
      其他小坑。。。好在解决了。。。

      比wordpress好解决了,只想说
      Who let the dogs out...

    4. MOD回复

      @牧风:
      搞定后,内存有所下降,却仍然不小,但查询少了,算是有提高吧。

      之前: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了,成功缓存后,所有评论只能看到父评论,看不到子评论,摔盘子!卧槽了。

    5. @kn007: :arrow: :arrow: 谁让wordpress 这么多全局变量呢, 这是在折磨自己, 也是恶心别人

    6. MOD回复

      @牧风: 当我在wp论坛wtf时,对方来人了,把帖子关了,说我改了主文件就很难帮上忙了,妹的,不改能发现问题嘛。。
      之前怎么叽叽喳喳对方鸟都不鸟,wtf一出,马上就来了。
      懒得说了。
      wp太臃肿了,而且我只能说他的书写方式和逻辑不是我能懂的,嵌套多个函数不是问题,问题是很多函数该调用现有函数去获取某个值却不,都是各用各的方法,明明只要回调一下就好,又要自己从别的地方拿数据。。

    7. @kn007: 官方也觉得开销大, 现在开始缓存插件方法/自带方法, 感觉并无卵用啊 :mrgreen: :mrgreen:

    8. MOD回复

      @牧风: 越做越乱,感觉。只希望能尽快fix。主要是怪我英文不好。硬伤。

    9. @kn007: wordpress 是面向过程,新手容易上手呢

    10. MOD回复

      @牧风: 嗯嗯,而且利用好,功能强大。

      这些优点是否认不了的。

    11. MOD回复

      @牧风: 晕死,更新到4.4.1后,怎么wp_list_comments列出来的评论不对

    12. MOD回复

      @牧风: 重装了也不行、、 :???:

    13. @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, 这样翻页才是正确的 :cry: :cry:

    14. MOD回复

      @牧风: 必须改core么?
      我能爆粗口么。。。

    15. MOD回复

      @牧风: 哦,到家试了下。不用改core,但为何要在wp_list_comments后声明,没搞懂。。。 :x :x :x

    16. @kn007: wp_list_comments 如果is_singular=false, 传入的评论就可用, 但是paginate_comments_links,is_singular必须是true 才行

    17. MOD回复

      @牧风: 原来是这个问题。了解了。 :???:

    18. MOD回复

      @牧风: 是因为
      ./wp-includes/comment-template.php:1932
      的这里判断吗?
      if ( is_singular() && ( $r['page'] || $r['per_page'] ) ) {

    19. MOD回复

      @牧风: 谢谢你了。

    20. MOD回复

      @牧风: 抓到了。

      ./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' ) );

    21. MOD回复

      @牧风: 一会开试,看下能不能解决缓存问题。

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif