¿Cómo evitar el redireccionamiento a un máximo de 2147483647 para valores más grandes de la variable de consulta de la página?

4

Tengo un ID que es 10101000003163

Lo puse en mi href como "technical/10101000003163/"

pero WordPress me redirige a "technical/2147483647/"

¿Cómo puedo evitar que WordPress haga eso?

Mi regla de reescritura es

function rewrite_technical() {
  add_rewrite_rule('^technical/([0-9])/?', 'technical/?pid=$matches[1]', 'bottom');
}
add_action('init', 'rewrite_technical');
    
pregunta Roi 23.05.2016 - 07:26

1 respuesta

4

La parte de por qué

Si tenemos una página llamada technical e intentamos cargar:

example.tld/technical/99999999999999999999

entonces la parte 99999999999999999999 se trata como una variable de consulta page con el valor de 2147483647 .

El motivo es esta regla de reescritura para páginas:

deacuerdoconlapráctica Monkeyman Rewrite Analyzer por Jan Fabry.

Esta parte de la <% co_de> / p>

if ( isset($q['page']) ) {
    $q['page'] = trim($q['page'], '/');
    $q['page'] = absint($q['page']);
}

es responsable de la conversión de enteros, es decir,

absint( '99999999999999999999' ) =  2147483647

Esto es realmente el igual que :

abs( intval( '99999999999999999999' ) )  

También probé:

intval( 99999999999999999999 )

pero eso solo da 0

Revisé la documentación de PHP en WP_Query::get_posts() que dice:

  

El valor máximo depende del sistema. Los sistemas de 32 bits tienen un máximo.   rango entero enteros con signo de -2147483648 a 2147483647. Así, por ejemplo, en   dicho sistema, intval ('1000000000000') devolverá 2147483647. El   El valor entero con signo máximo para sistemas de 64 bits es   9223372036854775807.

     

Lo más probable es que las cadenas devuelvan 0, aunque esto depende de la   Caracteres más a la izquierda de la cadena. Las reglas comunes del casting de enteros.   aplicar.

Finalmente, el redireccionamiento canónico se activa y redirige a:

example.tld/technical/2147483647/

Tu regla de reescritura actual:

add_rewrite_rule(
    '^technical/([0-9])/?', 
    'technical/?pid=$matches[1]', 
    'bottom'
);

parece estar equivocado. Es por ejemplo falta la parte intval() y solo admite un solo dígito.

Solución

Prueba, por ejemplo. (sin probar) :

add_rewrite_rule(
    '^technical/([0-9]+)/?', 
    'index.php?pagename=technical&wpseid=$matches[1]', 
    'top' 
);

add_filter( 'query_vars', function( $qv )
{
    $qv[] = 'wpseid';
    return $qv;
} );

donde cambié index.php a pid para evitar posibles colisiones de nombres.

Ahora debería poder utilizar wpseid para recuperarlo sin modificar.

Tenga en cuenta que lo más probable es que pierda la posibilidad de paginación de contenido para esa página.

... o simplemente cambie a un sistema de 64 bits donde:

9223372036854775807 > 10101000003163

y solo usa una combinación de $wpseid = get_query_var( 'wpseid' ); y is_page( 'technical' ) , pero eso parece ser una solución desordenada, por lo que realmente no lo recomendaría ;-)

    
respondido por el birgire 23.05.2016 - 15:07

Lea otras preguntas en las etiquetas