首页 > 技术随笔, 疑难杂症 > 解决WordPress使用客户端发布文章时HTML标签被过滤掉(吃标签)的问题

解决WordPress使用客户端发布文章时HTML标签被过滤掉(吃标签)的问题

技术随笔, 疑难杂症

问题描述

在000webhost虚拟主机上部署好了Wordpress系统之后,就打算使用Live Writer离线工具来写博了。但是发布一篇测试文章后却看到,网页上显示的文章内容乱七八糟的,一大堆什么p呀strong之类的本不应该出现在文章中的html标签名,Html的尖括号全都给吃了。图片啥的也没有正常显示。

问题原因

Google了老半天,才发现这原来是libxml2这个库的bug造成的,这个bug会导致html标签中使用的尖括号和&符号都被直接剔除掉。所以发布上去的文章没能正确解析HTML标签,只留下了一大堆的p和strong等等的Html标签名。还有以下原因会造成Live Writer发布文章的时候吃标签的问题:

  • 当你使用xmlrpc形式的API从离线客户端发布文章时,<>&这几个符号都会被剔除掉
  • 导入博客时,Url缺失
  • RSS输出时和客户端发布文章一个情况

解决办法

关于这个bug,网上很多的解决方案都是说要把libxml2从原来的2.7.2版本降级到2.6.32版本。但是无奈,本人使用的是免费的虚拟主机空间,人家主机提供商才不会管你这件事呢。所以只能另辟蹊径了。又Google了N久(唉,对Google的依赖太大了),找到了一个老外写的解决方案。按照上面的方法去试了一下,结果发现果然行得通。

WordPress中用到和libxml2相关的php代码文件如下:

/wp-admin/import/blogger.php
/wp-admin/link-parse-opml.php
/wp-includes/atomlib.php
/wp-includes/class-IXR.php

在这几个文件中找到xml_parse函数的调用,在此之前加入如下代码:

//xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch
if(LIBXML_DOTTED_VERSION == '2.7.0' ||
    LIBXML_DOTTED_VERSION == '2.7.1' ||
    LIBXML_DOTTED_VERSION == '2.7.2' ||
    LIBXML_DOTTED_VERSION == '2.7.3'
){
    $xml =str_replace("&lt;","&#60;",$xml);
    $xml =str_replace("&gt;","&#62;",$xml);
    $xml =str_replace("&amp;","&#38;",$xml);
}
//end Fix
xml_parse($parser, $xml);

这里需要注意的是上面的红色标注的部分,需要替换成xml_parse函数中使用的实际的变量。

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. 大融
    | #1

    这法子不行,还是安装
    LibXML2 Fix吧

    • Kevin Yang
      | #2

      你试过了不行吗?之所以要用这个办法,就是出于无法修改虚拟主机的情况下。

  2. 大融
    | #3

    我按照上面的做法做了一遍,发现没用,后来安装了LibXML2 Fix插件,OK。

    • Kevin Yang
      | #4

      你有修改$xml为实际的变量吗?那4个文件全都修改过了?
      我就是这么干的,就成功了。不过既然你可以安装东西的话,那当然不需要这么做了。

  3. | #5

    安装了LibXML2 Fix, 看插件介绍说,真正的解决办法是安装 PHP 5.2.9+ 和 libxml2 2.7.3+ 。就可以解决这个问题。
    感谢博主,感谢各位~

  1. 暂时没有trackbacks.