Tengo un sitio de WordPress alojado en un servicio de aplicaciones de Azure (no una máquina virtual dedicada) y necesito que las personas accedan a la página principal a través de una URL como: http://www.example.com/?tracking.id=12345

Sin embargo, WordPress está reescribiendo la URL reemplazando el punto en tracking.id con un guión bajo: http://www.example.com/?tracking_id=12345

¿Cómo puedo evitar que WordPress haga esto?

1
Kcoder 29 ene. 2016 a las 07:25

3 respuestas

La mejor respuesta

Lo interesante es que esto solo sucede en la página de inicio, las variables de consulta permanecen intactas en todos los demás lugares. es posible que pueda averiguar qué está pasando si echa un vistazo a wp-includes/canonical.php (allí también se encuentra el filtro redirect_canonical)

function prevent_underscores( $redirect_url, $requested_url ) {

    if( isset( $_GET['tracking_id'] ) ) {
        return $requested_url;
    }   
    return $redirect_url;   
}

add_filter( 'redirect_canonical', 'prevent_underscores', 10, 2 );
1
vidja 30 ene. 2016 a las 08:08

@vidja está muy cerca y definitivamente va por buen camino con redirect_canonical.

Investigué un poco más este problema para descubrir que se trata de una combinación de problemas entre PHP y esta lógica de redireccionamiento en WordPress. Si echa un vistazo al php global $_GET directamente, encontrará que es donde los parámetros de la cadena de consulta se analizan "incorrectamente". Por ejemplo:

// For a url like: /some/path/?tracking.id=123
var_dump($_GET);
// array(1) { ["tracking_id"]=> string(3) "123" }

Si continúa investigando el código redirect_canonical, eventualmente encontrará que el culpable es una pila de llamadas a funciones, terminando con el método parse_str de php:

// https://developer.wordpress.org/reference/functions/_remove_qs_args_if_not_in_url/
_remove_qs_args_if_not_in_url()
// https://developer.wordpress.org/reference/functions/remove_query_arg/
remove_query_arg()
// https://developer.wordpress.org/reference/functions/add_query_arg/
add_query_arg()
// https://developer.wordpress.org/reference/functions/wp_parse_str/
wp_parse_str()
// https://www.php.net/manual/en/function.parse-str.php
parse_str()

Probar parse_str directamente le da el mismo resultado que mirar $ _GET:

$arr = [];
parse_str('tracking.id=123', $arr);
var_dump( $arr );
// array(1) { ["tracking_id"]=> string(3) "123" }

Todo esto para decir que hay una forma un poco mejor de configurar su propio filtro para obtener un resultado más sólido. Por ejemplo, la forma en que @vidja escribió su filtro resultaría en que las páginas no se redirigieran correctamente cuando usted quisiera (y como resultado, WordPress mostraría una página 404 no encontrada). Supongamos que tiene una página con una barra de /sample-page e intentó visitar su sitio a través de una URL como: /sampl?tracking.id=123. Wordpress querría redirigir eso a /sample-page/?tracking_id=123, pero el código de @ vidja devolvería la URL original (mala) ya que tracking_id está configurado en $ _GET. Entonces, una mejor manera de manejar esto, en mi opinión, sería reemplazar el parámetro de cadena de consulta específico que le interesa dentro de la URL de redireccionamiento, de esa manera Wordpress puede hacer lo necesario para redirigir las páginas como mejor le parezca, pero también puede mantener tu tracking.id correctamente. Así es como se vería:

add_filter( 'redirect_canonical', function ( $redirect_url, $requested_url ) {
  return preg_replace( '/tracking_id=/', 'tracking.id=', $redirect_url );
}, 10, 2 );

Incluso podría hacer algo como lo siguiente si tuviera varios parámetros de cadena de consulta con puntos que necesita mantener:

add_filter( 'redirect_canonical', function ( $redirect_url, $requested_url ) {
  $query_params = [
    'tracking_id' => 'tracking.id',
    'foo_bar' => 'foo.bar',
  ];

  foreach ( $query_params as $search => $replace ) {
    $redirect_url = preg_replace( '/'.$search.'=/', $replace.'=', $redirect_url );
  }

  return $redirect_url;
}, 10, 2 );
0
andersryanc 6 ago. 2020 a las 20:01

Puede verificar si ha elegido y configurado el permalinks_type en la pestaña de configuración de su sitio de WordPress. Puede consultar https://codex.wordpress.org/Using_Permalinks para obtener más detalles.

Además, puede aprovechar la tercera parte del complemento de Wordpress; consulte https://wordpress.org/plugins/custom -vínculos permanentes /.

0
Gary Liu - MSFT 29 ene. 2016 a las 09:16