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

4

J'ai un identifiant qui est 10101000003163

Je l'ai défini sur mon href sous la forme "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');
    
posée Roi 23.05.2016 - 07:26

1 réponse

4

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 de 2147483647 .

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

selonle analyseur de réécriture Monkeyman par Jan Fabry.

Cette partie de laWP_Query::get_posts():

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

est responsable de la conversion de nombre entier, c'est-à-dire

absint( '99999999999999999999' ) =  2147483647

Il s'agit en réalité du identique à :

abs( intval( '99999999999999999999' ) )  

J'ai aussi testé:

intval( 99999999999999999999 )

mais cela ne donne que 0.

J'ai consulté la documentation PHP sur intval() qui dit:

  

La valeur maximale dépend du système. Les systèmes 32 bits ont un maximum   nombre entier signé de -2147483648 à 2147483647. Ainsi, par exemple sur   un tel système, intval ('1000000000000') renverra 2147483647. La   la valeur entière maximale signée pour les systèmes 64 bits est   9223372036854775807.

     

Les chaînes renverront très probablement 0 bien que cela dépende de la   caractères les plus à gauche de la chaîne. Les règles communes du casting entier   appliquer.

Enfin, la redirection canonique démarre 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 avoir tort. C'est par exemple manque la partie index.php et ne prend en charge qu'un seul chiffre.

Solution de contournement

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 remplacé pid par 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 allez probablement perdre la possibilité d'une pagination du contenu pour cette page.

... ou passez simplement à 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; -)

    
réponse donnée birgire 23.05.2016 - 15:07

Lire d'autres questions sur les étiquettes