add_rewrite_rules insensibles a mayúsculas en las funciones de Wordpress

4

Estuve golpeando mi cabeza contra la pared en esto por un tiempo. Si tengo un add_rewrite_rules así:

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

Esto funciona correctamente; yendo a enlace muestra enlace .

Sin embargo, esto distingue entre mayúsculas y minúsculas: ir a "/ My-bOoKs /" no dispara la regla (y por lo tanto muestra la página 404 en su lugar).

¿Hay una manera fácil de marcarlo como no sensible a mayúsculas y minúsculas? Solo hago enlaces con minúsculas, claro, pero los usuarios pueden agregar un capital por su cuenta y no me gustaría perder el tráfico a una página 404.

Gracias! Alex

    
pregunta Alex Gold 23.05.2016 - 23:22

2 respuestas

0

Como lo menciona la respuesta a continuación, no es posible pasar una marca a add_rewrite_rule() ; sin embargo, es posible utilizar un modificador en línea. En tu ejemplo, harías esto:

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

(observe el (?i) en la expresión regular).

La ventaja de este enfoque es que las reglas de reescritura son mucho más limpias y más eficaces.

Consulte esta página sobre modificadores de expresiones regulares para obtener más información.

    
respondido por el Eric Jorgensen 10.08.2018 - 17:33
-1

No directamente. La API de wordpress está usando preg_match / preg_replace pero no está exponiendo el parámetro flags. Eso es lo que necesitarías para pasar la bandera insensible (i).

Ver su implementación aquí: enlace

Probablemente, la solución más simple es utilizar una pequeña función auxiliar para hacer esto por usted:

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;
  }

Dado

$rules = array('my-books/?$'  => 'index.php?pagename=my-books');
var_dump(anyCase($rules));

Saldrá     array (1) {["[Mm] [Yy] - [Bb] [Oo] [Oo] [Kk] [Ss] /? $"] = > cadena (27) "index.php? pagename = mis libros"}

Para que puedas mantener tus reglas limpias / simples :-)

Si está ejecutando un PHP antiguo que no admite cierres, puede simplemente hacer esto:

  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;
  }

Saludos

    
respondido por el Joshua Ostrom 25.03.2017 - 20:16

Lea otras preguntas en las etiquetas