Custom permalinks插件允许用户随意定制每一篇文章或者页面的固定链接,适用于文章/页面的固定链接格式种类繁多的情况。不过在使用中也遇到了问题,记录一下。

问题一: 404错误

使用Custom Permalinks时经常遇到404错误,经过搜索和研究发现是Revisions引起的问题,这一点可以通过访问Tools->Custom Permalinks来确认。当某个页面有revisions时,这里会出现两条或多条一样的记录,这时访问这个页面就会出现404错误,解决的方法是删除这个页面的revisions。如果不嫌麻烦,可以安装WP Clean Up插件删除revisions,但不解决根本问题。

如果要彻底解决,就需要修改一下插件的代码。打开custom-permalinks.php文件,找到第164行,更改一下sql语句,增加

" post_type NOT IN ('revision') AND ".

完整sql语句如下

$sql = "SELECT $wpdb->posts.ID, $wpdb->postmeta.meta_value, $wpdb->posts.post_type FROM $wpdb->posts  ".
        "LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE ".
        " post_type NOT IN ('revision') AND ".
        "  meta_key = 'custom_permalink' AND ".
        "  meta_value != '' AND ".
        "  ( LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash)."'), LENGTH(meta_value)) OR ".
        "    LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash."/")."'), LENGTH(meta_value)) ) ".
        "ORDER BY LENGTH(meta_value) DESC LIMIT 1";

代码来自:404 Error – potentially caused by revisions

问题二:与.html on pages插件冲突

.html on pages插件虽然很久没更新了,但最新版WordPress依然可以用,用途是给page加个.html后缀。发生冲突的条件如下:

  1. 网站用静态页作为首页,在Settings->Reading中将Posts page设为一个页面,假设页面的url是http://example.com/blog/
  2. 在Settings->Permalink将固定链接格式设为blog/%postname%/
  3. 当用红色标出的部分相同时,错误就会发生

错误:访问任何post、category及其他archive页面,都会显示blog index页面。

解决方法:禁用.html on pages,加.html的工作用custom permalink完成

看起来似乎是用了两个功能雷同的插件导致冲突,又尝试了一下发现即使没有.html on pages,这个错误还是可能出现,例如:

  1. 创建一个名为Blog的页面,默认固定链接会是http://example.com/blog/,更改固定链接为http://example.com/myblog/,这时custom permalinks插件就会创建名为custom_permalink的custom field,在screen options启用custom field就能看到。
  2. 将该页面设置为Posts page
  3. 将固定链接格式更改为myblog/%postname%/

这时访问任何post、category及其他archive页面都会显示http://example.com/myblog/的内容

产生这个错误是custom permalink的判断机制问题(即第一节中提到的那段sql语句)。我的情况是,只要禁用.html on pages插件,改用custom permalinks完成增加.html后缀的功能,就能避免这个错误(因为blog页面会使用默认的地址,不需要custom permalinks干预)。

3条留言

  1. sola亲,后台用户中不是有为用户分别了权限吗?比如管理员、作者等,如果我后台有50个管理员,我像显示所有的管理员头像,该怎么显示呢?

评论功能已关闭