Como evitar o redirecionamento para max 2147483647 para valores maiores da variável de consulta da página?

4

Eu tenho um id que é 10101000003163

Eu configurei para meu href como "technical/10101000003163/"

mas o WordPress me redireciona para "technical/2147483647/"

Como posso impedir que o WordPress faça isso?

Minha regra de reescrita é

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

1 resposta

4

Por que parte

Se tivermos uma página chamada technical e tentarmos carregar:

example.tld/technical/99999999999999999999

a parte 99999999999999999999 é tratada como uma variável de consulta page com o valor de 2147483647 .

O motivo é essa regra de reescrita para páginas:

deacordocomoprático Analisador de reescrita do Monkeyman por Jan Fabry.

Esta parte do WP_Query::get_posts() :

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

é responsável pela conversão de números inteiros, ou seja,

absint( '99999999999999999999' ) =  2147483647

Este é, na verdade, o o mesmo que :

abs( intval( '99999999999999999999' ) )  

Eu testei também:

intval( 99999999999999999999 )

mas isso apenas dá 0.

Eu verifiquei a documentação do PHP em intval() que diz:

  

O valor máximo depende do sistema. Sistemas de 32 bits têm um máximo   intervalo inteiro assinado de -2147483648 a 2147483647. Assim, por exemplo, em   esse sistema, intval ('1000000000000') retornará 2147483647. O   valor inteiro assinado máximo para sistemas de 64 bits é   9223372036854775807.

     

As cadeias provavelmente retornarão 0, embora isso dependa do   caracteres mais à esquerda da string. As regras comuns de conversão de números inteiros   aplicar.

Finalmente, o redirecionamento canônico entra em ação e redireciona para:

example.tld/technical/2147483647/

Sua regra de reescrita atual:

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

parece estar errado. É por exemplo faltando a parte index.php e só suporta um único dígito.

Solução alternativa

Experimente, por exemplo (não testado) :

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

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

onde alterei pid para wpseid para evitar possíveis colisões de nomes.

Agora, você poderá usar $wpseid = get_query_var( 'wpseid' ); para recuperá-lo sem modificações.

Note que você provavelmente perderá a possibilidade de paginação de conteúdo para essa página.

... ou simplesmente mude para um sistema de 64 bits em que:

9223372036854775807 > 10101000003163

e use apenas uma combinação de is_page( 'technical' ) e get_query_var( 'page' ) , mas isso parece ser uma solução confusa, então eu realmente não recomendaria; -)

    
por birgire 23.05.2016 / 15:07