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');
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:
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.
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 ;-)