Как предотвратить перенаправление до max 2147483647 для больших значений переменной запроса страницы?

У меня есть идентификатор 10101000003163

Я установил его на свой href как "technical/10101000003163/"

но WordPress перенаправляет меня на "technical/2147483647/"

Как я могу остановить WordPress от этого?

Мое правило перезаписи

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

Solutions Collecting From Web of "Как предотвратить перенаправление до max 2147483647 для больших значений переменной запроса страницы?"

Почему часть

Если у нас есть страница, называемая technical и попробуйте загрузить:

 example.tld/technical/99999999999999999999 

то часть 99999999999999999999 рассматривается как переменная запроса page со значением 2147483647 .

Причина в том, что это правило перезаписи для страниц:

переписать правила

в соответствии с удобным анализатором переименования Monkeyman от Jan Fabry.

Эта часть WP_Query::get_posts() :

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

отвечает за целочисленное преобразование, т. е.

 absint( '99999999999999999999' ) = 2147483647 

Это на самом деле то же самое, что :

 abs( intval( '99999999999999999999' ) ) 

Я также тестировал:

 intval( 99999999999999999999 ) 

но это просто дает 0.

Я проверил документацию PHP на intval() которая гласит:

Максимальное значение зависит от системы. 32-битные системы имеют максимальный знаковый целочисленный диапазон от -2147483648 до 2147483647. Так, например, в такой системе intval ('1000000000000') вернет 2147483647. Максимальное знаковое целочисленное значение для 64-битных систем – 9223372036854775807.

Строки, скорее всего, вернут 0, хотя это зависит от самых левых символов строки. Применяются общие правила целочисленного литья.

Наконец, каноническое перенаправление запускается и перенаправляется на:

 example.tld/technical/2147483647/ 

Ваше текущее правило перезаписи:

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

кажется неправильным. Например, отсутствует часть index.php и поддерживается только одна цифра.

Временное решение

Попробуйте, например, (непроверенный) :

 add_rewrite_rule( '^technical/([0-9]+)/?', 'index.php?pagename=technical&wpseid=$matches[1]', 'top' ); add_filter( 'query_vars', function( $qv ) { $qv[] = 'wpseid'; return $qv; } ); 

где я изменил pid на wpseid чтобы избежать возможных конфликтов имен.

Теперь вы сможете использовать $wpseid = get_query_var( 'wpseid' ); чтобы получить его немодифицированным.

Обратите внимание, что вы, скорее всего, потеряете возможность разбивки на страницы для этой страницы.

… или просто переключитесь на 64-битную систему, где:

 9223372036854775807 > 10101000003163 

и просто используйте комбинацию is_page( 'technical' ) и get_query_var( 'page' ) но это похоже на бесполезное решение, поэтому я бы не рекомендовал его 😉