web-dev-qa-db-fra.com

Comment empêcher la redirection au maximum 2147483647 pour des valeurs plus grandes de la variable de requête de page?

J'ai un identifiant qui est 10101000003163

Je l'ai mis à mon href comme "technical/10101000003163/"

mais WordPress me redirige vers "technical/2147483647/"

Comment puis-je empêcher WordPress de le faire?

Ma règle de réécriture est

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

La partie pourquoi

Si nous avons une page appelée technical et essayons de charger:

example.tld/technical/99999999999999999999

alors la partie 99999999999999999999 est traitée comme une variable de requête page avec la valeur 2147483647.

La raison en est cette règle de réécriture pour les pages:

rewrite rules

selon le très pratique Monkeyman Rewrite Analyzer de Jan Fabry.

Cette partie de la WP_Query::get_posts():

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

est responsable de la conversion d’entier, c.-à-d.

absint( '99999999999999999999' ) =  2147483647

C'est en fait le identique à :

abs( intval( '99999999999999999999' ) )  

J'ai aussi testé:

intval( 99999999999999999999 )

mais cela donne juste 0.

J'ai vérifié la documentation de PHP sur intval() qui dit:

La valeur maximale dépend du système. Les systèmes 32 bits ont une plage d'entiers signés maximale comprise entre -2147483648 et 2147483647. Ainsi, par exemple, sur un tel système, intval ('1000000000000') renverra 2147483647. La valeur entière signée maximale pour les systèmes 64 bits est 9223372036854775807.

Les chaînes retourneront probablement 0 bien que cela dépende des caractères les plus à gauche de la chaîne. Les règles communes de la conversion de nombre entier s'appliquent.

Enfin, la redirection canonique entre en action et redirige vers:

example.tld/technical/2147483647/

Votre règle de réécriture actuelle:

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

semble être faux. C'est par exemple manque la partie index.php et ne prend en charge qu'un seul chiffre.

Workaround

Essayez par exemple (non testé):

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

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

où j'ai changé pid en wpseid afin d'éviter d'éventuelles collisions de noms.

Vous devriez maintenant pouvoir utiliser $wpseid = get_query_var( 'wpseid' ); pour le récupérer sans modification.

Notez que vous perdrez très probablement la possibilité de pagination du contenu pour cette page.

... ou simplement passer à un système 64 bits où:

9223372036854775807 > 10101000003163

et utilisez simplement une combinaison de is_page( 'technical' ) et get_query_var( 'page' ) mais cela semble être une solution compliquée, je ne le recommanderais donc pas vraiment ;-)

4
birgire