Привет, друзья. Если помните, я как-то в Твиттере обмолвился, что мне постоянно приходится «забивать костыли» в движок WordPress, чтобы добиться правильной работы того или иного компонента. Так вот этих костылей у меня накопилось уже достаточно много, достаточно для того, чтобы оформить их в целый пост.
Почти все скрипты и функции, описанные ниже, придуманы и написаны мной, и все они в данный момент используются на моем блоге, так что, как говорится, все проверено на себе.
Каждый для себя обязательно найдет что-нибудь полезно в этом посте.
Breadcrumbs или Хлебные крошки для WordPress без плагинов
Если вы помните, то я большой противник установки плагинов, которые делают то, что можно реализовать и без них, при этом затратив гораздо меньше ресурсов и сохранив быстродействие движка в целом.
Вот и в вопросе создания хлебных крошек я решил не прибегать к плагинам, а решил врубить мозги и написать функцию самостоятельно. Как вы сейчас увидите, кода ровно на 10 строк!
/*** ХЛЕБНЫЕ КРОШКИ WordPress***/ function my_breadcrumbs() { if (is_home()) { // если главная страница, то ничего не делаем } elseif (is_single()) { // если страница поста, то выводим хлебные крошки echo '<a title="На главную страницу" href="http://alaev.info">Оптимизация сайтов</a> » <a title="Просмотреть все записи блога" href="https://alaev.info/blog">SEO Блог</a> » '; foreach((get_the_category()) as $cat) { $cat=$cat->cat_ID; echo(get_category_parents($cat, TRUE, ' » ')); }// вывод категории поста the_title(); // вывод заголовка поста } } |
Данный код необходимо вставить в начало (после <?php
) или в конец (перед ?>
) файла functions.php вашей текущей темы оформления.
После этого необходимо добавить код <?php my_breadcrumbs(); ?>
в файл single.php
Очищаем кеш, если это необходимо, и видим хлебные крошки в постах на своем блоге.
В коде функции все должно быть понятно, везде есть пометки, вам остается только прописать свои url’ы и анкоры к ним.
Будьте внимательны при использовании мультикатегорий, возможны неправильные варианты формирования крошек.
Пример работы данного кода вы можете наблюдать в данном посте над заголовком.
301 редирект неправильных адресов вида http://site.ru/http://site.ru/post-name на правильные
Совсем недавно я обнаружил в панели вебмастера Google в разделе «Диагностика сайта –> Ошибки сканирования» такую фигню: появилось несколько десятков битых урлов такого вида как указано в подзаголовке. Разумеется, при переходе по ним выдавалась 404 ошибка. Зачем и какого собственно хрена на меня поставили такие внешние ссылки мне не известно, но факт есть факт, пришлось разбираться.
Дабы исправить ситуацию я написал следующее условие, его необходимо вставить так же в файл functions.php:
/*** КОСТЫЛЬ ДЛЯ ИСПРАВЛЕНИЯ http://site.ru/http://site.ru/ ***/ if (strpos($_SERVER['REQUEST_URI'], 'http://alaev.info') !== false) { $real_page_url = "http://alaev.info".str_replace ( "/http://alaev.info", "", $_SERVER['REQUEST_URI'] ); header("HTTP/1.0 301 Moved Permanently"); header("Location: $real_page_url"); die("Redirect"); } |
Теперь, если в запрашиваемом url’е будет содержаться дублирование адреса хоста, это дублирование будет удаляться и будет происходить 301 редирект на нужную страницу.
Чтобы воспользоваться кодом вам необходимо заменить адрес хоста alaev.info на свой. Будьте внимательны, не удаляйте и не добавляйте никакие слеши в код, иначе может случиться беда.
Фильтрация результатов поиска в WordPress
Идею данного костыля я подсмотрел на каком-то блоге, на каком уже, разумеется, не помню.
В чем заключается суть данной функции? Функция позволяет ограничивать область поиска, а если быть конкретнее, то в строчке $query->set('post_type', 'post');
мы указываем тип записи, который выводить в результатах. Мне это понадобилось для того, чтобы через поиск не находились статические страницы, а показывались только посты блога.
Это будет полезно тем, у кого на блоге много различных статических страниц, которые могут не всегда совпадать по смыслу и содержанию с основной составляющей блога. В конкретно моем случае я не хотел, чтобы в поиске выдавались страницы фото-портфолио.
/*** ФИЛЬТР ДЛЯ ПОИСКА WordPress ТОЛЬКО ПО ПОСТАМ ***/ function SearchFilter($query) { if ($query->is_search) { $query->set('post_type', 'post'); // определяем тип записей, по которым нужно искать } return $query; } add_filter('pre_get_posts','SearchFilter'); // фильтр будет встроен в цикл и будет сортировать результат поиска перед выводом |
Для поверки вы можете целенаправленно поискать что-нибудь из раздела ФОТО и вы ничего не найдете =)
Делаем и добавляем свой метатег canonical для всех страниц блога
Вот с этой фишкой была вообще целая история. Помните, когда Яндекс ввел у себя поддержку данного метатега? Так вот почти сразу после этого в панели вебмастера у меня появилась категория ошибок «Документ не является каноническим» где отобразились все страницы пагинации. Я стал разбираться в чем дело, и оказалось так, что плагин WP-Pagenavi генерировал мне неправильные урлы страниц, о том как я разобрался с этой проблемой я уже описывал в посте про постраничную навигацию в WordPress без плагинов. Но на этом приключения не закончились!
Если вы пользуетесь плагином All In One SEO, а вы с вероятностью 95% им точно пользуетесь, знаете, что там есть такая настройка «Canonical URLs», при ее включении на все страницы будет добавляться пресловутый метатег rel="canonical". Так вот оказалось, что AISOEP-плагин тоже не полюбил некоторые страницы моего блога и прописывал адреса со слешем на конце, в то время как у меня все адреса без слеша. Ну и в итоге произошел нонсенс – при заходе на страницу со слешем происходит 301 редирект на страницу без слеша, при этом в каноникале прописан адрес со слешем. И вот как поступать роботом при индексации таких страниц? Вот и я не знаю.
Пришлось отключать в плагине All In One SEO Pack настройку канонизации и писать свою функцию, которая бы правильно работала в сложившейся ситуации.
/*** ДОБАВЛЯЕМ СВОЙ rel canonical ***/ function my_rel_canonical() { if (!is_404()) { // если не 404 ошибка $requested_url = ( !empty($_SERVER['HTTPS'] ) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://'; $requested_url .= $_SERVER['HTTP_HOST']; $requested_url .= $_SERVER['REQUEST_URI']; $url_array = explode('?', $requested_url); $requested_url = $url_array[0]; // отсекаем все что после первого знака вопроса ? $requested_url = rtrim($requested_url, '/'); // убираем конечный слеш, если есть echo "".'<link rel="canonical" href="'.$requested_url.'" />'."\n"; } } add_action('wp_head', 'my_rel_canonical', 3); // добавляем свой canonical в head |
Код данной функции надо добавить в свой functions.php. Функция работает следующим образом: запрошенный url разбирается на части (протокол + хост + uri), потом из полученного массива выкидывается все, что идет после знака вопроса (если он есть, обычно знаком вопроса отделяют передаваемый в url параметры), и в самом конце идет проверка на наличие заканчивающего слеша, и если он есть, то мы его удаляем.
Если же у вас адреса страниц на блоге формируются так, что в конце обязательно присутствует слеш, то просто удалите из кода строку:
$requested_url = rtrim($requested_url, '/'); // убираем конечный слеш, если есть |
И тогда все будет работать как надо!
Кстати, это дело не подойдет для НЕ ЧПУ урлов, так как в этом случае как раз все и передается с помощью параметров и для каждой страницы rel canonical будет содержать адрес главной страницы. Чтобы приспособить функцию для НЕ ЧПУ адресов необходимо избавиться от данной строки кода:
$url_array = explode('?', $requested_url); $requested_url = $url_array[0]; //отсекаем все, что после первого знака ? |
Вот, теперь я учел все нюансы.
Добавляем в WordPress метатег meta robots с noindex,nofollow для страниц с 404 ошибкой
Не уверен, насколько пригодится этот костыль вам, но у меня в панели вебмастера Google постепенно пропали все 404 ошибки после данной манипуляции.
Код данной функции предельно прост, смотрите сами:
/*** ДОБАВЛЯЕМ noindex,nofollow ЕСЛИ 404 ***/ function my_404_noindex () { if (is_404()) { echo "".'<meta name="robots" content="noindex,nofollow" />'."\n"; } } add_action('wp_head', 'my_404_noindex', 3); // добавляем свой noindex,nofollow в head |
Как и все предыдущие костыли, код функции надо добавить в ваш файл functions.php. Что же он делает? Простейшее условие на проверку — если выдается 404 ошибка, то выводим метатег, а потом через стандартный фильтр add_action();
добавляем эту запись в <head>
.
Все гениальное просто, не так ли! Надеюсь, вам пригодится.
Вывод постового через дополнительное произвольное поле в WordPress
Решил рассказать как можно более изящно и удобно размещать постовые или другие подобные ссылки (можно и не только ссылки, разумеется) в постах блога. Обычно постовой просто размещается в теле поста в самом конце, но мне так было неудобно, и я придумал, как можно выводить постовой через дополнительное поле в записи.
Для начала добавим в шаблон своей темы в файл single.php следующий код:
<?php $checkpos = get_post_meta($post->ID, 'postovoi', $single = true); if($checkpos !== '') {echo $checkpos;} else {echo '<a href="https://alaev.info/reklama#blogger">Тут может быть ваш постовой</a>';} ?> |
Размещать его необходимо, например, после строки <?php the_content(''); ?>
в таком случае сразу после текста поста будет выводиться нужная информация.
После этого заходим в редактирование любого поста или при добавлении нового прокручиваем страницу до блока под названием «Произвольные поля». Жмем «Добавить новое» и указываем ему имя postovoi, а в поле «Значение» вставляем нужный текст или html код ссылки, а потом жмем «Добавить произвольное поле».
Теперь в конце записи у вас появится эта ссылка-постовой. Особенность моей функции еще в том, что если это произвольное поле не заполнено, то будет выводиться стандартная информация, в данном случае это будет ссылка с анкором «Тут может быть ваш постовой», которая будет вести на страницу «Реклама». Вы сами сможете настроить, что у вас будет по умолчанию показываться, это не сложно.
Мне кажется это очень удобно и прикольно. Скрипт можно приспособить для вывода чего угодно — хоть баннера, хоть своих реф-ссылок или любой другой полезной информации.
Фильтрация html кода (вывод html обычным текстом) в комментариях WordPress
Вас одолели спамеры или вам не нравится, что комментаторы постят левые ссылки на свои сайты в комментариях без вашего ведома, а, может быть, вам просто не надо, чтобы обрабатывался html код в комментариях? Тогда читайте дальше.
В файл functions.php вашей темы необходимо добавить следующий код:
/*** ФИЛЬТРАЦИЯ html В КОММЕНТАРИЯХ WordPress ***/ function plc_comment_post( $incoming_comment ) { $incoming_comment['comment_content'] = htmlspecialchars($incoming_comment['comment_content']); $incoming_comment['comment_content'] = str_replace( "'", ''', $incoming_comment['comment_content'] ); return( $incoming_comment ); } function plc_comment_display( $comment_to_display ) { $comment_to_display = str_replace( ''', "'", $comment_to_display ); return $comment_to_display; } add_filter('preprocess_comment', 'plc_comment_post', '', 1); add_filter('comment_text', 'plc_comment_display', '', 1); add_filter('comment_text_rss', 'plc_comment_display', '', 1); add_filter('comment_excerpt', 'plc_comment_display', '', 1); |
Суть всех этих фильтров такова, что любая текстовая информация, добавленная в комментарий, не будет обрабатываться движком и отобразится точно так, как ее вбил комментатор, то есть никакая разметка не будет применяться. Потом вы сами сможете оформить текст комментария как вам надо из админки.
Иногда такой жёсткий метод просто необходим.
Удаление nofollow для ссылок в комментариях WordPress блога
Данный костыль стоит использовать в сочетании с предыдущим методом фильтрафии html. В таком случае вы самостоятельно сможете регулировать простановку ссылок, а раз вы решили оставить какие-то ссылки, значит они вам нужны, и значит нет смысла запрещать переход по ним для роботов.
По умолчанию WordPress ставить rel=”nofollow” для всех ссылок в комментариях, и нам надо переубедить его!
В свой файл functions.php надо добавить следующий фильтр:
/*** УДАЛЕНИЕ nofollow В КОММЕНТАРИЯХ WordPress ***/ function remove_nofollow($string) { $string = str_ireplace(' rel="nofollow"', '', $string); return $string; } add_filter('comment_text', 'remove_nofollow'); // удаляем nofollow для текстов комментариев |
Все готово, отныне никаких nofollow в ссылках комментариев!
На сегодня все, дорогие друзья. Я поделился с вами самыми интересными наработками для моего блога за время его ведения, и я очень надеюсь, что эти мелкие фишки пригодятся и вам.
Можете задавать вопросы, делиться своими оригинальными разработками, предлагать идеи и обсуждать!
PS Если вас интересует какой-то вопрос на тему «а как сделать ...?» — прошу вас оставлять запросы в комментариях. В следующем выпуске «костылей» я напишу решение вашей проблемы.
В еверноут однозначно. Спасибо. Мне бы хотелось узнать еще одно: на странице тегов и категорий нужно выводить произвольный текст с картинками и редактированием. Есть умельцы, которые прописывают функцию: выводить страницу (айди страницы), если тег такой (айди). Мне, как не особо понимающему в програмировании, очень сложно это осуществить. Вот бы пошаговую инструкцию в следующем выпуске:)
Ну да, я уже кому-то комментах или в почте помогал такую штуку реализовать, там кода-то две строчки. В следующем выпуске опишу как такое сделать.
Спасибо, офигительный набор очень полезных хаков, добавил в закладки.
И маленькое дополнение — для отключения HTML в комментах не нужна столь большая функция — достаточно простой строки
add_filter ('comment_text', 'wp_filter_nohtml_kses'); //удаление html из комментов
Да, разумно, я как-то до этой стандартной функции не добрался. Спасибо вам за идею!
Костыль — это доработка системы нестандартным (неоптимальным) образом и если заменить этот термин в посте на хаки или советы, поскольку ничего НЕстандартного не предложено, то тогда суть поста будет отражена верно.
Очень круто.
Мы вашу статью включим в пятничный дайджест (если вы не против?)
Да без проблем, скидывайте потом ссылку на дайджест :)
А вот и ссылка: http://www.aweb.com.ua/seo-blog/s-miru-po-nitke-vypusk-7/
Очень полезный и познавательный пост, но неплохо было бы написать как убирать виджеты в полной новости как у Вас, так как для SEO это великая сила, и для поста статью легче писать, так как не смешивается то что в виджетах и то что в статье в общую каку.
А вот это не факт еще, что это супер-сила для SEO :)
У меня сайдбара нет не потому, что это для SEO какой-то смысл имеет, а потому, что мне так удобнее, да и читать посты так приятнее.
> 301 редирект неправильных адресов вида http://site.ru/http://site.ru/post-name на правильные
Что-то не получается реализовать, прописал в файл functions.php, который располагается в шаблоне, заменил на свой урл, но не происходит редирект.
PS в Я.Вебмастере нашел много таких ошибок, вот у Вас решение, но что-то не заработало.
Проверьте все слеши и прочие мелочи, все должно быть как у меня в посте описано.
Если не поможет, пишите на почту через Feedback — будем персонально разбираться.
Привет, если не трудно, подскажи, будь добр.
Была временая папка http://www.site.com/temporary/ теперь я ее стер, но она проиндексирована с сотнями страниц, ни одна из них не нужна. Сейчас стоит полноценный сайт на root.
Как заредиректить так, чтобы все, что содержалось в /temporary/*** перекидывало на http://www.site.com?
Именно на рут, включая все потроха временной папки, все в одно место, а не каждый урл на свое место вне папки.
Сейчас поставил вот так:
Но мне это не подходит, надо на root все одном комом.
Заранее благодарю!
Достаточно прописать в самом начале, после RewriteEngine On следующую строку:
Тогда любые url, начинающиеся с http://www.мойсайт.com/temporary/ будут редиректиться на http://www.мойсайт.com/
Проверьте и отпишитесь.
Прежде всего спасибо.
Работает но не до конца, все абсолютные урл редиректятся, но если в пути есть где либо знак "?" то /temporary/ уходит, а динамический путь ?.. и все что за ним остается(. Тоесть вместо http://www.site.com/temporary/?page становится http://www.site.com/?=page.
Окей, давайте так попробуем:
Должно сработать.
А вот не работает елки палки 500 Internal Server Error...
Окей, если сайт на WordPress, то поступим проще, нафиг .htaccess, сделаем php-редирект.
В начало файла functions.php, после
<?
добавь следующее:В общем, Товарищь АлаичЪ, уважуха и респект, был уверен, что этот вариант должен работать, но там что-то мешало, был в папке одной еще один .htaccess и он вызывал конфликт.
В общем вот это:
Работает как в сказке!
Спасибо! Ждите Линк!
Что-то костыль на http://site.ru/http://site.ru/post-name не работает совсем. 20 раз перепроверил — не идет перенаправления и все тут. WP 3.3.1.
Не заставил работать, но увидел, что у меня яндекс нашел ссылки вида /http:/site.ru, то есть с одним слешем. Я их просто запретил индексировать в robots.txt через Disallow: /http:/www.*
ЧПУ? Анальная кара тому, кто первым «это» употребил.
Ежепонятный — и ежу понятный. Собаконепонятный — не понятный собаке? Да?
Здравствуйте!
По метатегу canonical — как сделать, чтобы при заходе на сайт по протоколу https метатег canonical показывал страницу с http.
Плагин Platinum SEO (аналог All In One SEO) на главной странице с https показывает каноническую с http, а внутренние с https.
Извините за то что такой глупый, но чуть не понял два момента:
1. /*** ДОБАВЛЯЕМ noindex,nofollow ЕСЛИ 404 ***/
function my_404_noindex () {
if (is_404 ()) {
echo "".'<meta name="robots" content="noindex,nofollow" />'."\n";
}
}
add_action ('wp_head', 'my_404_noindex', 3); // добавляем свой noindex,nofollow в head
весь это код ТОЛЬКО скопировать в functions.php
2. где это находиться — «Произвольные поля» ???
После этого заходим в редактирование любого поста или при добавлении нового прокручиваем страницу до блока под названием «Произвольные поля». Жмем «Добавить новое» и указываем ему имя postovoi, а в поле «Значение» вставляем нужный текст или html код ссылки, а потом жмем «Добавить произвольное поле».
1. Да.
2. Находится на той же странице где добавление/редактирование поста. Я не знаю, какая у вас версия, но у меня в версии WP 2.8.x это называется именно так.
1. ок, но что вы имели в виду при комментирование кода:
add_action ('wp_head', 'my_404_noindex', 3); // добавляем CВОЙ noindex,nofollow В HEAD
2. Спасибо огромное, у меня WP 3.4, и надо было просто, полазить в настройках экрана...
Это я для себя комментарии оставляю. А в чем проблема?
Для 403 ошибок можно сделать тоже что и для 404? А то в панели гугла вылезают 403 ошибки на разные папки типа wp-content/uploads/ или share42/
Ну нет конечно, рекомендую изучить какие ошибки что обозначают. 403 обозначает, что доступ в папку (которая реально существует на сервере) запрещен.
Не стоит по этому поводу переживать, это не ошибка, это просто сообщение с точки зрения ПС.
Спасибо, парочку себе советов возьму) а то плагины могут всё но вот движок не может их всех принять)
Здравствуйте! У вас в блоге так много полезного и нужного написано по оптимизации DLE и так мало по той же оптимизации WordPress...
Можно ли добавить статей?
Я пишу о том, что мне актуально и более всего интересно. Все, что мне казалось полезным про WP я написал, если что-то появится новое, я обязательно этим поделюсь.
Я слышала что поисковики по линку с атрибутом nofollow вес не передают, но уже все равно списывают его со страницы. Если я так добавлю на внутренние страницы сайта ...content="nofollow", поисковики случайно не начнут забирать вес с сайта, или это касается только внешних ссылок? А если на внутренних страницах сайта стоят перекрестные ссылки с атрибутом nofollow как тогда? Прошу прощения за дилетанский вопрос, я в этой оптимизации совсем запуталась :(
Все верно, при использовании nofollow вес со страницы уходит, но целевому сайту не передается. Так что нет смысла использовать nofollow, тем более проставляя ссылки внутри сайта. Можно использовать nofollow только для ссылок на "подозрительные" сайты, но на такие и вообще лучше не ссылаться...
В таком случае почему во всех этих вариантах "Добавляем в WordPress метатег meta robots с noindex,nofollow для страниц с 404 ошибкой" и подобных совсем nofollow не убрать, получается при каждом, даже внутреннем nofollow этот пылесос с меня вес тянет когда надо и не надо. Или и я чего недопонимаю. У меня на сайте все внутри ненужное под nofollow, рекомендуете убрать совсем с сайта этот тег?
Надо признаться, что добавление noindex,nofollow для 404 страниц — это бред полный. Я не знаю, какая муха меня укусила. Ведь получая ответ сервера 404 поисковый робот даже не смотрит содержимое страницы, а следовательно загрузки страницы даже не происходит и метатег робот никогда не увидит =) Такие вот дела!
nofollow тяжелая тема, надо ее подробнее разбирать, когда-нибудь напишу об этом пост.
АлаичЪ, но тем не менее, у Вас при 404 ошибке в коде сожержится noindex,nofollow :) Я по поводу хлебных крошек хотел спросить... Они выводят содержимое пути (той ссылки, где сейчас находится пользователь) в сниппет, точнее в саму ссылку под сниппетом для ПС? Как это было в посте под id 4160. Посмотрел ваш сайт в гоше и яше, там все как надо. Это и есть этот хак, либо это что-то отдельное?
Да, у меня много странных вещей можно на блоге найти, что-то является отголоском экспериментов, что-то просто сделано и забыто, ну в общем, у меня тут своя атмосфера :)
На счет хлебных крошек на моем блоге — да, это тоже самое, что и описано в посте, один в один. А вот то, что поисковики выводят в выдаче, то это совсем не обязательно, что повлияли хлебные крошки (хотя я и не утверждаю обратного). Так скажем, внедрение хлебных крошек на сайт совершенно не гарантирует, что поисковики как-то на это отреагируют.
Я не со всем понял что именно вы имели ввиду под выдачей. Я всего-лишь хочу знать, этот хак заменит обычное "alaev.info/blog/post/3411" на "Alaev.info›SEO Блог›Забиваем костыли" ??? В таком случае спасибо :)
Речь о выдаче в поисковике? В Яндексе? Нет, не заменит — я об этом и говорил выше, что поисковики могут никак не отреагировать.
Здравствуйте!
Не так давно вы мне очень помогли с одной проблемой. Может быть сейчас сможете посоветовать, как решить один вопрос.
Проблема следующая: я для блога на WP использовала скрипт для кнопки "Наверх", текст скрипта был вставлен в подключенный файл js. Потом мне на некоторое время понадобился Usernoise. Когда снесла Usernoise, увидела, что 1) пропала кнопка; 2) в консоли выскочила ошибка, что не определена функция, которая за эту кнопку отвечала.
Но эта функция никак не была связана с удаленным плагином, она была написана раньше — простой маленький скрипт.
Обратные действия (восстановление плагина) вернули кнопку на место, но это же не выход, мне он не нужен сейчас. Я даже просто оставить его деактивированым не могу, кнопка "Наверх" пропадает.
Есть ли какие-то общие советы — как избавиться от этих проблем? Плагин удален полностью из папки с плагинами, что за остаточные проблемы могло вызвать его удаление?
Помогите, пожалуйста, советом — что проверить и посмотреть?
Лично мой совет — Smooth Scroll Up вот плагин )) на моих сайтах он стоит и никаких проблем )
Привет, что тут работает что нет для 4.1? А то я первый раз на вордпрессе начал делать сайт, разбираюсь что воткнуть, что нет.
301 редирект неправильных адресов вида http://site.ru/http://site.ru/post-name на правильные не работает )
Может кто знает как? wp 4.1.1 последняя
Алаич,а подскажи, как в вордпрессе победить дубли постов с мультикатегориями? Вот к примеру у меня пост принадлежит категории 1, 2 и 3. Эти категории вложены др. в друга, т.е. 2 — родительская для 1, а 3 — родительская для 2.
Сейчас у меня данный пост отображается по 3 адресам: site.ru/3/post, site.ru/3/2/post и site.ru/3/2/1/post
Не знаю. Надо гуглить, я данным вопросом не интересовался, потому и решения не знаю.