WordPress函数中不区分大小写的添加_重写规则

时间:2016-05-23 作者:Alex Gold

这件事让我头痛了一阵子。如果我有这样的add\\u rewrite\\u规则:

    $aNewRules = array(\'my-books/?$\'  => \'index.php?pagename=my-books\');
这工作正常;将要http://example.com/my-books/ 显示http://example.com/index.php?pagename=my-books.

然而,这是区分大小写的-转到“/我的书/”不会违反规则(因此显示404页)。

有没有一种简单的方法可以将其标记为不区分大小写?当然,我只做小写链接,但用户可以自己添加大写字母,我不想失去404页面的流量。

谢谢亚历克斯

2 个回复
SO网友:Eric Jorgensen

正如下面的答案所提到的,不可能将标志传递给add_rewrite_rule(); 但是,可以使用内联修改器。在您的示例中,您可以这样做:

$aNewRules = array(\'(?i)my-books/?$\' => \'index.php?pagename=my-books\');

(注意(?i) 在正则表达式中)。

这种方法的优点是,您的重写规则更干净,性能更高。

看见this page 有关详细信息,请参阅正则表达式修饰符。

SO网友:Joshua Ostrom

不是直接的。wordpress API正在使用preg\\u match/preg\\u replace,但没有公开flags参数。这就是你需要通过麻木不仁标志(i)的地方。

在此处查看其实现:https://github.com/WordPress/WordPress/blob/a8802232ecac8184cbe6e8dbe9c6a7bd0f5b7dee/wp-includes/class-wp-rewrite.php

可能最简单的解决方案就是使用一个小助手函数来为您执行此操作:

function anyCase($rules){
    $insensitive = array();
    foreach ($rules as $regex => $mapping) {
      $regex = preg_replace_callback(\'([A-Za-z])\', function($matches){
            return "[" . strtoupper($matches[1]) . strtolower($matches[1]) . "]";
      }, $regex);
      $insensitive[$regex] = $mapping;
    }
    return $insensitive;
  }
给定的

$rules = array(\'my-books/?$\'  => \'index.php?pagename=my-books\');
var_dump(anyCase($rules));
将输出数组(1){[“[Mm][Yy]-[Bb][Oo][Oo][Kk][Ss]/?$”]=>字符串(27)“index.php?pagename=my books”}

因此,您可以保持规则干净/简单:-)

如果您运行的是不支持闭包的旧PHP,您可以改为:

  function lowerOrUpper($matches){
    return "[" . strtoupper($matches[0]) . strtolower($matches[0]) . "]";
  }

  function anyCase($rules){
    $insensitive = array();
    foreach ($rules as $regex => $mapping) {
      $regex = preg_replace_callback(\'([A-Za-z])\', lowerOrUpper, $regex);
      $insensitive[$regex] = $mapping;
    }
    return $insensitive;
  }
干杯

相关推荐