Функции WordPress

Забиваем костыли — Сборник полезных функций и скриптов для WordPress

Сборник полезных функций для WordPress Привет, друзья. Если помните, я как-то в Твиттере обмолвился, что мне постоянно приходится «забивать костыли» в движок 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, "https://alaev.info/"); // убираем конечный слеш, если есть
			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, "https://alaev.info/"); // убираем конечный слеш, если есть

И тогда все будет работать как надо!

Кстати, это дело не подойдет для НЕ ЧПУ урлов, так как в этом случае как раз все и передается с помощью параметров и для каждой страницы 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( "'", '&apos;', $incoming_comment['comment_content'] );
		return( $incoming_comment );
	}
	function plc_comment_display( $comment_to_display ) {
		$comment_to_display = str_replace( '&apos;', "'", $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 Если вас интересует какой-то вопрос на тему «а как сделать …?» — прошу вас оставлять запросы в комментариях. В следующем выпуске «костылей» я напишу решение вашей проблемы.

Статьи по теме

Кнопка "Вернуться к началу"
Закрыть

Обнаружен Adblock

Пожалуйста, подумайте о том, чтобы поддержать нас, отключив свой блокировщик рекламы!