
Все началось с того, что некоторые системы анализа сайтов мне показывали полные дубли некоторых страниц блога (например, https://alaev.info/blog
и https://alaev.info/blog/
, https://alaev.info/blog/category/seo
и https://alaev.info/blog/category/seo/
и др.), притом, что этих страниц я не мог найти в упор, да и сами дублирующие адреса автоматически редиректились на правильные (правильные у меня это без слеша на конце). Я не мог понять откуда это берется и где робот-анализатор мог их находить. Ночами перестал спокойно спать из-за этого…
Я начал очень тщательно просматривать все внутренние ссылки блога, вдруг я где-то сам установил такие ссылки и не заметил. Но как вы уже, наверное, поняли из заголовка поста, я нашел проблему в постраничной навигации моего WP.
Первая мысль – кривой плагин WP-Pagenavi, не иначе. Пошел делать «распил» файлов плагина, там оказалось все не просто и очень запутано, но я разобрался с проблемой за полчаса. Но это не главное.
Я вспомнил, что когда-то слышал, что можно сделать постраничную навигацию для WordPress и без всяких плагинов – пошел искать и тут же нашел множество вариантов. У меня была надежда, что если делать все самому и вручную без плагинов, то таких косяков быть не должно. Оказалось иначе – некоторые «самопалы» на деле оказались еще хуже, и вместо того чтобы показывать ссылку на основную страницу и без слеша, как мне надо, они показывали /page/1, что является полным дублем основной страницы, при этом реально существующим.
Чтож, опять придется «пилить» — мне не в первой. Для этого я выбрал самое адекватное из найденных решений (
Итак, несколько причин, по которым стоит отказаться от плагина WP-Pagenavi в пользу альтернативы, предложенной в этом посте:
- За удобство настроек в админ панели приходится платить ценой лишних запросов, так как эти настройки сохраняются в БД, а затем от туда и берутся, хотя это в теории, а на практике они берутся из кэша опций WordPress, но тем не менее…
- В продолжение первого пункта – удобство в данном случае дело сомнительное – постраничная навигация, это такое дело, что настроил однажды и забыл. А заменить несколько значений в коде (в котором, кстати, есть все пояснения) не составит труда даже новичку.
- Если вы продвинутый пользователь и не впервые слышите слово «php», то при желании что-то изменить (будь то внешний вид или что-то еще) это ни составит никакого труда – код простой, понятный и лаконичный.
- При написании кода, его автор kama использовал те же css стили, что и использует плагин Pagenavi, так что вам даже не придется заново все оформлять.
- Ну и последний пункт, самый важный, ради которого все и затевалось – будут нормальные ссылки на первую страницу, не возникнет никаких дублей и лишних редиректов.
Меньше слов, больше дела – рассмотрим код и что с ним делать.
Открываем в админке «Внешний вид -> Редактор» и выбираем Функции темы (functions.php). В самое начало этого файла вставляем следующий код:
/*** Альтернатива wp_pagenavi (без лишних обращений к данным) ***/ function kama_pagenavi($before='', $after='', $echo=true) { /* ================ Настройки ================ */ $text_num_page = ''; // текст для количества страниц. {current} заменится текущей, а {last} последней. Пример: 'Страница {current} из {last}' = Страница 4 из 60 $num_pages = 10; // сколько ссылок показывать $stepLink = 10; // после навигации ссылки с определенным шагом (значение = число (какой шаг) или '', если не нужно показывать). Пример: 1,2,3...10,20,30 $dotright_text = '…'; // промежуточный текст "до". $dotright_text2 = '…'; // промежуточный текст "после". $backtext = '«'; // текст "перейти на предыдущую страницу". Ставим '', если эта ссылка не нужна. $nexttext = '»'; // текст "перейти на следующую страницу". Ставим '', если эта ссылка не нужна. $first_page_text = ''; // текст "к первой странице" или ставим '', если вместо текста нужно показать номер страницы. $last_page_text = ''; // текст "к последней странице" или пишем '', если вместо текста нужно показать номер страницы. /* ================ Конец Настроек ================ */ global $wp_query; $posts_per_page = (int) $wp_query->query_vars[posts_per_page]; $paged = (int) $wp_query->query_vars[paged]; $max_page = $wp_query->max_num_pages; if($max_page <= 1 ) return false; //проверка на надобность в навигации if(empty($paged) || $paged == 0) $paged = 1; $pages_to_show = intval($num_pages); $pages_to_show_minus_1 = $pages_to_show-1; $half_page_start = floor($pages_to_show_minus_1/2); //сколько ссылок до текущей страницы $half_page_end = ceil($pages_to_show_minus_1/2); //сколько ссылок после текущей страницы $start_page = $paged - $half_page_start; //первая страница $end_page = $paged + $half_page_end; //последняя страница (условно) if($start_page <= 0) $start_page = 1; if(($end_page - $start_page) != $pages_to_show_minus_1) $end_page = $start_page + $pages_to_show_minus_1; if($end_page > $max_page) { $start_page = $max_page - $pages_to_show_minus_1; $end_page = (int) $max_page; } if($start_page <= 0) $start_page = 1; $out=''; //выводим навигацию $out.= $before."<div class="wp-pagenavi">\n"; if ($text_num_page){ $text_num_page = preg_replace ('!{current}|{last}!','%s',$text_num_page); $out.= sprintf ("<span class="pages">$text_num_page</span>",$paged,$max_page); } if ($start_page >= 2 && $pages_to_show < $max_page) { $out.= '<a href="'.rtrim(get_pagenum_link(), "https://alaev.info/").'">'. ($first_page_text?$first_page_text:1) .'</a>'; if($dotright_text && $start_page!=2) $out.= '<span class="extend">'.$dotright_text.'</span>'; } if ($backtext && $paged!=1) $out.= '<a href="'.rtrim(get_pagenum_link(($paged-1)), "https://alaev.info/").'">'.$backtext.'</a>'; for($i = $start_page; $i <= $end_page; $i++) { if($i == $paged) { $out.= '<span class="current">'.$i.'</span>'; } else { $out.= '<a href="'.rtrim(get_pagenum_link($i), "https://alaev.info/").'">'.$i.'</a>'; } } if ($nexttext && $paged!=$end_page) $out.= '<a href="'.get_pagenum_link(($paged+1)).'">'.$nexttext.'</a>'; //ссылки с шагом if ($stepLink && $end_page < $max_page){ for($i=$end_page+1; $i<=$max_page; $i++) { if($i % $stepLink == 0 && $i!==$num_pages) { if (++$dd == 1) $out.= '<span class="extend">'.$dotright_text2.'</span>'; $out.= '<a href="'.get_pagenum_link($i).'">'.$i.'</a>'; } } } if ($end_page < $max_page) { if($dotright_text && $end_page!=($max_page-1)) $out.= '<span class="extend">'.$dotright_text2.'</span>'; $out.= '<a href="'.get_pagenum_link($max_page).'">'. ($last_page_text?$last_page_text:$max_page) .'</a>'; } $out.= "</div>".$after."\n"; if ($echo) echo $out; else return $out; } |
Многие могут не заметить, чем именно мой вариант отличается от оригинала, предложенного kama. Поясняю: изменен порядок вывода, то есть местами поменяны некоторые элементы, теперь стало более юзабельно; и самое главное – при формировании некоторых ссылок я применил php-функцию string rtrim ( string $str [, string $charlist ] ), которая возвращает мне строку, но без слеша в конце, если он есть – что, собственно, и требовалось изначально.
Далее во всех файлах шаблона, в которых требуется добавить навигацию, необходимо в удобное место вставить:
<?php if (function_exists('kama_pagenavi')) kama_pagenavi(); ?> |
Если вы затрудняетесь с тем куда это надо вставлять, просто ищите что-то подобное:
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?> |
И заменяйте на указанную выше строку.
Вот и все готово, друзья!
Теперь остается открыть файл /wp-content/plugins/wp-pagenavi/pagenavi-css.css
скопировать оттуда весь код и вставить его в свой css файл (обычно это style.css и лежит в папке с вашей темой оформления).
Ну и последний шаг – деактивируем плагин WP-Pagenavi в админке и удаляем полностью его папку с сервера ;)
PS Ради интереса проверил первые пришедшие в голову блоги – на всех имеется такая проблема, решение которой я описал :)
Удачи вам, друзья, и помните – в SEO не бывает мелочей!
Задавайте вопросы, комментируйте. До связи.