#php #wordpress #redirect
#php #wordpress #перенаправление
Вопрос:
у меня проблема с функцией PHP для сайта WordPress. Начиная с этой статьиhttps://perishablepress.com/wordpress-infinite-duplicate-content У WordPress есть проблема с бесконечной нумерацией страниц. Итак, мне нужно исправить это, перехватив нумерованные URL-адреса и перенаправив их на родительский URL.
Я нашел этот код в Интернете, но я немного изменил его для своих нужд. Это работает, как ожидалось, но не улавливает URL-адреса, содержащие ноль, а также не перенаправляет напрямую на URL-адрес с косой чертой (если в полученном URL-адресе ее нет).
Из моих тестов кажется, что PHP не улавливает URL-адреса, которые содержат 0
параметр is_numeric
(возможно, потому, что 0 считается int
, но я не уверен). Я не знаком с PHP, поэтому я делюсь этим с вами.
В остальном это работает отлично, перехватывая нумерованные URL-адреса и перенаправляя на родительский URL. Конечно, я уже закрыл код в функцию и загрузил в хук. Но я поделюсь только самим кодом только для лучшего разъяснения:
global $posts, $numpages;
$request_uri = $_SERVER['REQUEST_URI'];
$result = preg_match('%/(d) (/)?$%', $request_uri, $matches);
$ordinal = $result ? intval($matches[1]) : FALSE;
if(is_numeric($ordinal)) {
// a numbered page was requested: validate it
// look-ahead: initialises the global $numpages
setup_postdata($posts[0]); // yes, hack
$redirect_to = ($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);
if(is_string($redirect_to)) {
// we got us a phantom
$redirect_url = get_option('home') . preg_replace('%'.$matches[0].'%', $redirect_to, $request_uri);
// if page = 0 or 1, redirect permanently
if($ordinal) {
header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
}
header("Location: $redirect_url");
exit();
}
}
Я ожидаю, что нумерованные URL-адреса, также содержащие 000000
или 01234
, также перенаправляются на родительский источник. Спасибо за помощь.
Комментарии:
1.
000000
это строка, а не число. Строки могут начинаться с 0, числа — нет2. хорошо, спасибо за ответ, итак, как я могу изменить код, чтобы соответствовать строке 0 в URL-адресах?
Ответ №1:
вызовы is_numeric() для значений типа ‘0000’ и ‘0123’ вернут true в php, и они будут проанализированы в 0 и 123, как и следовало ожидать, через intval().
Я заметил, что вы изменили исходный код в сообщении в блоге с
// if page = 0 or 1, redirect permanently
($ordinal < 2) {
header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
} else {
header($_SERVER['SERVER_PROTOCOL'] . ' 302 Found');
}
Для
// if page = 0 or 1, redirect permanently
if($ordinal) {
header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
}
Комментарий больше не соответствует функциональности, возможно, потому, что вы всегда хотите, чтобы функциональность 301 использовалась для ваших целей?
Я полагаю, что ваш код будет обрабатывать порядковый номер 0000 по-другому, потому что он будет оценивать false при проверке if.
Если я правильно понимаю, чего вы хотите, вы могли бы попробовать полностью удалить эту проверку if и посмотреть, решит ли она вашу проблему. Если нет, можете ли вы предоставить несколько полных URL-адресов, которые показывают проблему?
Комментарии:
1. Привет, Патрик, да, это правда, что ты говоришь. Я хотел бы использовать 301 для всех URL-адресов, потому что я применяю условные теги к некоторому типу записи, поэтому мне не нужно перенаправление 302. И в этом элементе управления, возможно, есть проблема. Итак, вы предлагаете удалить if ($ ordinal) { или подделать проверку элемента управления следующим образом: if ($ordinal <= 9) {
2. Я бы просто удалил
if ($ordinal
полностью3. я протестировал это без
if ($ordinal
, но безуспешно. Если я запускаю URL, подобныйhttps://www.example.com/how-to-do-that/111
, работает как ожидалось, но если я запускаю дляhttps://www.example.com/how-to-do-that/000
, игнорируется.4. О, подождите, я думаю, что вам понадобится еще одно изменение, которое я пропустил. Попробуйте изменить эту строку, которая выполняет аналогичную проверку if ($ ordinal):
$redirect_to = ($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);
на this$redirect_to = isset($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);
5. да, Патрик, это сработало. Я проверю это как лучший ответ, но не могли бы вы также сказать мне, если можете, как я могу перенаправить не завершающийся сокращенный URL-адрес непосредственно на конечный сокращенный URL-адрес? Итак, если я запущу
https://www.example.com/how-to-do-that/111
, вывод будетhttps://www.example.com/how-to-do-that
а затемhttps://www.example.com/how-to-do-that/
. Вместо этого, если я сделаю это,https://www.example.com/how-to-do-that/111/
вывод будетhttps://www.example.com/how-to-do-that/
немедленно. Как я могу добиться этого, не вызывая правило в htaccess, которое вызывает/
?. Большое спасибо