Привіт, друзі. Якщо пам’ятаєте, я в Твіттері сказав, що мені постійно доводиться «забивати милиці» у движок WordPress, щоб домогтися правильної роботи того чи іншого компонента. Так ось цих милиць у мене накопичилося вже достатньо багато, достатньо для того, щоб оформити їх у цілий пост.

Майже всі скрипти і функції, описані нижче, придумані і написані мною, і всі вони в даний момент використовуються на моєму блозі, так що, як кажуть, все перевірено на собі.

Кожен обов’язково знайде для себе що-небудь корисне в цьому пості.

Breadcrumbs або Хлібні крихти без плагінів для WordPress

Якщо ви пам’ятаєте, то я великий противник установки плагінів, які роблять те, що можна реалізувати і без них, при цьому витративши набагато менше ресурсів і зберігши продуктивність движка в цілому.

Ось і в питанні створення хлібних крихт я вирішив не вдаватися до плагінів, а вирішив вмикати мізки і написати функцію самостійно. Як ви зараз побачите, коду рівно на 10 рядків!

/*** ХЛІБНІ КРИХТИ WordPress***/
function my_breadcrumbs() {
if (is_home()) { // якщо головна сторінка, то нічого не робимо
} elseif (is_single()) { // якщо сторінка посту, то виводимо хлібні крихти
echo ‘Оптимізація сайтів » SEO Блог » ‘;
foreach((get_the_category()) as $cat) {
$cat=$cat->cat_ID;
echo(get_category_parents($cat, TRUE, ‘ » ‘));
}// висновок категорії посади
the_title(); // вивід заголовку поста
}
}

/*** ХЛІБНІ КРИХТИ WordPress***/
function my_breadcrumbs() {
if (is_home()) { // якщо головна сторінка, то нічого не робимо
} elseif (is_single()) { // якщо сторінка посту, то виводимо хлібні крихти
echo ‘Оптимізація сайтів » SEO Блог » ‘;
foreach((get_the_category()) as $cat) {
$cat=$cat>cat_ID;
echo(get_category_parents($cat, TRUE, ‘ » ‘));
}// висновок категорії посади
the_title(); // вивід заголовку поста
}
}

Цей код потрібно вставити в початок (після ) файлу functions.php вашої поточної теми оформлення.
Після цього необхідно додати код в файл single.php

Очищаємо кеш, якщо це необхідно, і бачимо хлібні крихти в постах на своєму блозі.

В коді функції все повинно бути зрозуміло, скрізь є позначки, вам залишається тільки прописати свої до и і анкор до них.

Будьте уважні при використанні мультикатегорий, можливі неправильні варіанти формування крихт.

Приклад роботи цього коду ви можете спостерігати в даному пості над заголовком.

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”);
}

/*** МИЛИЦЯ ДЛЯ ВИПРАВЛЕННЯ 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”);
}

Тепер, якщо в запитуваній до е буде міститися дублювання адреси хоста, це дублювання буде віддалятися і буде відбуватися 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’); // фільтр буде вбудований в цикл і буде сортувати результат пошуку перед виведенням

/*** ФІЛЬТР ПОШУКУ 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 “”..\n;
}
}
add_action(‘wp_head’, ‘my_rel_canonical’, 3); // додаємо свій canonical в head

/*** ДОДАЄМО СВІЙ 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 “”.”.”\n”;
}
}
add_action(‘wp_head’, ‘my_rel_canonical’, 3); // додаємо свій canonical в head

Код даної функції треба додати свій functions.php. Функція працює наступним чином: запитаний url розбирається на частини (протокол + хост + uri), потім з отриманого масиву викидається все, що йде після знака питання (якщо він є, зазвичай знаком питання відокремлюють передається в url параметри), і в самому кінці йде перевірка на наявність котра закінчувала слеша, і якщо він є, то ми його видаляємо.

Якщо ж у вас адреси сторінок на блозі формуються так, що в кінці обов’язково присутній слеш, то просто видаліть рядок коду:

$requested_url = rtrim($requested_url, ‘/’); // забираємо кінцевий слеш, якщо є

$requested_url = rtrim($requested_url, ‘/’); // забираємо кінцевий слеш, якщо є

І тоді все буде працювати як треба!

До речі, це справа не підійде для ЧПУ урлов, так як в цьому випадку якраз все і передається за допомогою параметрів і для кожної сторінки rel canonical буде містити адресу головної сторінки. Щоб пристосувати функцію для НЕ ЧПУ адрес необхідно позбутися від даної рядка коду:

$url_array = explode(‘?’, $requested_url); $requested_url = $url_array[0]; //відкидаємо все, що після першого знака ?

$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 “”..\n;
}
}
add_action(‘wp_head’, ‘my_404_noindex’, 3); // додаємо свій noindex,nofollow в head

/*** ДОДАЄМО noindex,nofollow ЯКЩО 404 ***/
function my_404_noindex () {
if (is_404()) {
echo “”.”.”\n”;
}
}
add_action(‘wp_head’, ‘my_404_noindex’, 3); // додаємо свій noindex,nofollow в head

Як і всі попередні милиці, код функції треба додати в ваш файл functions.php. Що ж він робить? Найпростіше умова на перевірку — якщо видається 404 помилка, то виводимо метатег, а потім через стандартний фільтр add_action(); додаємо цю запис .

Все геніальне просто, чи не так! Сподіваюся, вам стане в нагоді.

Висновок постового через додаткове довільне поле в WordPress

Вирішив розповісти як можна більш витончено і зручно розміщувати постові або інші подібні посилання (можна і не тільки посилання, зрозуміло) в постах блогу. Зазвичай постової просто розміщується в тілі поста в самому кінці, але мені так було незручно, і я придумав, як можна виводити постової через додаткове поле в запису.

Для початку додамо в шаблон своєї теми у файл single.php наступний код:

$checkpos = get_post_meta($post->ID, ‘postovoi’, $single = true);
if($checkpos !== ) {echo $checkpos;}
else {echo ‘Тут може бути ваш постової’;} ?>

ID ‘postovoi’, $single = true);
if($checkpos !== “) {echo $checkpos;}
else {echo ‘Тут може бути ваш постової’;} ?>

Розміщувати його необхідно, наприклад, після рядка в такому випадку відразу після тексту поста буде виводитися потрібна інформація.

Після цього заходимо в редагування будь-якого посту або при додаванні нового прокручуємо сторінку до блоку під назвою «Довільні поля». Тиснемо «Додати нове» і вказуємо ім’я йому 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);

/*** ФІЛЬТРАЦІЯ 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 В КОМЕНТАРЯХ WordPress ***/
function remove_nofollow($string) {
$string = str_ireplace(‘ rel=”nofollow”‘, “, $string);
return $string;
}
add_filter(‘comment_text’, ‘remove_nofollow’); // видаляємо nofollow для текстів коментарів

Все готово, відтепер ніяких nofollow у посиланнях коментарів!

На сьогодні все, дорогі друзі. Я поділився з вами самими цікавими напрацюваннями для мого блогу за час його ведення, і я дуже сподіваюся, що ці дрібні фішки стануть в нагоді і вам.

Можете задавати питання, ділитися своїми оригінальними розробками, пропонувати ідеї та обговорювати!

PS Якщо вас цікавить якесь питання на тему «а як зробити …?» — прошу вас залишати запити в коментарях. У наступному випуску «милиць» я напишу рішення вашої проблеми.

З повагою, Олександр Алаєв