Настройка title для каждой страницы сайта на WordPress без плагинов

Просто добавьте этот код в functions.php вашей темы:

function your_document_title($title) {
  $sep = ' | ';
  $array = [];
  $term = get_queried_object();
 
  global $page;
 
  if (is_singular()) {
    if ($page) {
      array_push($array, 'Часть '.intval($page));
    }
    array_push($array, get_the_title($term));
  }
  else if (is_paged()) {
    array_push($array, 'Страница ' . intval(get_query_var('paged')));
  }
 
 if (is_search()) {
    array_push($array, 'Результат поиска по запросу "'.esc_html($_GET['s'].'"'));
  }
  else if (is_category($term)) {
    array_push($array, 'Категория "' . $term->name . '"');
  }
  else if (is_tag($term)) {
    array_push($array, 'Метка "' . $term->name . '"');
  }
 
  array_push($array, get_bloginfo('name'));
 
  if (is_front_page() && !is_paged()) {
    array_push($array, get_bloginfo('description'));
  }
 
  return implode($sep, $array);
}
add_filter('document_title', 'your_document_title');

Эти строчки добавляют фильтр к методу document_title.
Для каждого заголовка страницы WordPress вызывает наш код следующим образом:

$title = your_document_title(default_title());

Правила такие:

  • для одиночных постов — «Название поста»
  • для страницы категории выводится — Категория «Название»
  • для страницы тега выводится — Метка «Название»
  • для главной страницы «Название сайта | Описание сайта»
  • для постов разбитых на части добавляется «Часть N» в начале
  • для страница поиска типа /s=QUERY «Результат поиска QUERY»
  • для страниц пагинации типа /page/N добавляется «Страница N» в начале
  • для всех страниц добавляется информация из поля Настройки->Общие->Название сайта
  • для всех страниц, кроме главной и страниц пагинаций, в конце добавляется информация из поля «Настройки->Общие->Краткое описание»
Добавляем мета тег canonical к каждой странице сайта на WordPress без плагинов

Всем привет! Чтобы добавить запись типа meta rel="canonical" href="url" к каждой странице вашего сайта на WordPress, добавьте этот код в functions.php вашей темы:

function remove_args($url) {
  $parsed = parse_url($url);
 
  $fragment = '';
 
  if (array_key_exists('fragment', $parsed)) {
    $fragment = '#' . $parsed['fragment'];
  }
 
  return sprintf("%s://%s%s%s",
    $parsed['scheme'],
    $parsed['host'],
    $parsed['path'] ?? '',
    $fragment);
}
 
 
function print_canonical_link() {
  $url = "";
 
  // Одиночная страница
  if (is_single()) {
    global $page;
    // Пост из нескольких частей
    if ($page) {
      $url = get_pagenum_link($page);
    }
    else {
      $url = get_permalink();
    }
  }
  // Страница пагинации типа что-то-там/page/N
  else if (is_paged()) {
    $url = get_pagenum_link(get_query_var('paged'));
  }
  // Главная страница сайта
  else if(is_front_page()) {
    $url = get_home_url();
  }
  // Страницы категории или тега
  else if(is_category() || is_tag()) {
    $url = get_term_link(get_queried_object());
  }
 
  if ($url) {
    echo '<link rel="canonical" href="'.remove_args($url).'" />';
  }
}
add_action('wp_head', 'print_canonical_link');

Подробности для непосвящённых: функция print_canonical_link() выводит запись вида
<meta rel="canonical" href="url" /> во время вызова штатной функции wp_head(), что очень уважают поисковые системы, но это неточно. А функция remove_args() удаляет GET аргументы вида «?key=value» из URL. Критика, замечания, пожелания приветствуются.

SEO сайта, аудит, контент, копирайтеры, реклама

Как может заметить внимательный читатель, на этом сайте совершенно нет рекламы и я не клянчу денег с посетителей, как последний голодранец, с помощью баннеров и прочей ерунды. К чему это я вообще? Да просто так, надо же с чего-то заметку начинать да и похвастаться опять же…

Сегодня, в меру своих сил и возможностей, расскажу про оптимизацию своего сайта для поисковых систем. Какими сайтами для проверки пользуюсь, что подправить в functions.php вашей темы, чтобы запись нормально смотрелась при репостинге в социальных сетях типа ВКонтакте и Facebook. Заодно поделюсь плагинами для ускорения работы сайта.

Плагины для WordPress

Начну с конца — плагины для WordPress. Их у меня установлено несколько: WP Super Cache, Autoptimize, Async JavaScript и EWWW Image Optimizer.

WP Super Cache

Плагин для кеширования страниц вашего сайта. Дело в том, что каждая страница в WordPress создается динамически при любом обращении. Динамическая страница каждый раз генерируется налету и лезет в базу данных. Этот плагин сохраняет сгенерированную страницу в кеш и отдаёт пользователю простой статический html файл, что экономит ресурсы сервера.

Ссылка для скачивания и установки: WP Super Cache.

Autoptimize

Простой и удобный плагин для объединения и минификации файлов JavaScript и стилей. В каждой вашей странице используется множество JavaScript и CSS файлов — от плагинов и темы. С помощью этого плагина (в идеале) у вас подключается всего два файла: один JavaScript и один CSS.

Ссылка для скачивания и установки: Autoptimize.

Async JavaScript

Плагин для выставления флажка defer для всех JavaScript файлов. В обычном случае браузер разбирает эти файлы последовательно, по мере обнаружения их в HTML коде. С этим флажком браузер откладывает парсинг файлов и занимается этим паралельно с загрузкой страницы.

Ссылка для скачивания и установки: Async JavaScript.

EWWW Image Optimizer

Плагин пережимает картинки без потери качества. Поддерживает форматы JPEG и PNG. Есть функция создания файлов типа WEBP, который браузер незаметно отдает вместо запрашиваемых для экономии трафика. Посетитель, что любопытно, не замечает подмены даже если попробует этот файл сохранить. Как это работает — понятия не имею, скорее всего замешано какое-то колдунство.

Ссылка для скачивания и установки: EWWW Image Optimizer.

Исправления functions.php вашей темы

В каждой теме WordPress есть файл functions.php, где происходит настройка темы и прочий тюнинг. Правильный подход для настройки своей темы — это написать свою с нуля или создать дочернюю и менять всё в ней, а по-хорошему создайте свой мини-плагин, где добавляйте всё это барахло, чтобы никак не зависеть от темы.

В этом файле у меня сделано добавление meta тегов для помощи поисковым системам и социальным сетям плюс небольшие вспомогательные фрагменты.

Мета-теги og:type, og: description, og:image, og:title

Добавление мета-тегов og:title, og:description, og:type, og:url, og:locale, og:image и description к посту. В качестве og:description и description берётся первые 55 слов из вашего поста. Эти теги помогают социальным сетям создавать предпросмотр страницы, если вы решите ею поделиться.

Исходный код

function b2k_og_meta() {
    if (!is_singular()) {
        return;
    }
 
    global $post;
    $description = esc_attr(wp_trim_words($post->post_content, 55));
 
    $tags = array();
    $tags['og:title'] = '<meta property="og:title" content="'.get_the_title().'"/>';
    $tags['og:description'] = '<meta property="og:description" content="'.$description.'"/>';
    $tags['og:type'] = '<meta property="og:type" content="article"/>';
    $tags['og:url'] = '<meta property="og:url" content="'.get_the_permalink().'"/>';
    $tags['og:locale'] = '<meta property="og:locale" content="'.get_locale().'"/>';
    $tags['description'] = '<meta property="description" content="'.$description.'"/>';
 
     $images = get_posts(array(
        'post_status'    => null,
        'post_type'      => 'attachment',
        'post_parent'    => get_the_ID(),
        'post_mime_type' => 'image',
        'order'          => 'ASC'
    ));
 
    if ($images) {
        foreach ($images as $img) {
            $url = wp_get_attachment_url($img->ID);
            $tags[$url] = '<meta property="og:image" content="'.$url.'"/>';
        }
    }
 
    echo implode("\n", $tags);
}
add_action('wp_head', 'b2k_og_meta');

Автоматический переход на страницу при поиске

Если при поиске была найдена всего одна страница, соответствующая запросу, то переход на неё идёт в автоматическом режиме, чтобы избавить пользователя от лишних кликов мышью.

Исходный код

function b2k_redirect_single_post() {
    if (is_search()) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
            die;
        }
    }
}
add_action('template_redirect', 'b2k_redirect_single_post');

Добавление ссылок на следующую страницу и предыдущую

К каждой странице вашего блога при возможности добавляются мета-теги prev и next, которые используются браузером для загрузки этих страниц, чтобы в дальнейшем переход на них происходил быстрее.

Исходный код

function b2k_rel_next_prev() {
    global $paged;
 
    if ( get_previous_posts_link() ) { ?>
        <link rel='prev' href='<?php echo get_pagenum_link( $paged - 1 ); ?>' /><?php
    }
    else if (is_singular()) {
        $prev_post = get_previous_post(true);
        if (!empty($prev_post)) { ?>
            <link rel='prev' href='<?php echo get_permalink($prev_post->ID); ?>' /> <?php
        }
    }
 
    if (get_next_posts_link()) { ?>
        <link rel='next' href='<?php echo get_pagenum_link( $paged +1 ); ?>' /><?php
    }
    else if (is_singular()) {
        $next_post = get_next_post(true);
        if (!empty($next_post)) { ?>
            <link rel='next' href='<?php echo get_permalink($next_post->ID); ?>' /> <?php
        }
    }
}
add_action('wp_head', 'b2k_rel_next_prev');

Отключение страниц автора

Яндекс.Робот гораздо глупее робота от Гугла, поэтому в первую очередь он умудрился найти страницы вида https://адрес.сайта/что-то-там/evgenii.zhirnov/. Чтобы этого больше не происходило, страницы такого типа отключаются вот этим кодом.

Исходный код

function b2k_disable_author_page() {
    if (is_author() && !is_404()) {
        global $wp_query;
        $wp_query->set_404();
        status_header(404);
        nocache_headers();
    }
}
add_action('template_redirect', 'b2k_disable_author_page');

Открывать все ссылки в новом окне

Не знаю, как вы, а я привык, чтобы все ссылки открывались в новом окне, поэтому обычно открываю их кликом средней кнопки мыши. Данный скрипт добавляет атрибут target="_blank" всем ссылкам на сайте.

Исходный код

function b2k_target_blank($content) {
    $content = preg_replace_callback(
        '/<a[^>]*href=["|\']([^"|\']*)["|\'][^>]*>([^<]*)<\/a>/i',
 
        function($m) {
            $url = $m[1];
            $desc = $m[2];
            return '<a href="'.$url.'" target="_blank" rel="noopener">'.$desc.'</a>';
        },
        $content);
 
    return $content;
}
add_filter('the_content', 'b2k_target_blank');

Полезные ссылки

CY-PR.com

Проверяет сайт целиком на предмет индексации разными поисковиками. После регистрации позволяет обновлять информацию каждые 24 часа.

Ссылка: CY-PR.com.

Reflex grid

С помощью reflex.css сделана тема на моём сайте, так что упомяну из благодарности. Это всего лишь файл стиля, который разбивает сайт на 12 виртуальных колонок. К примеру, центральная часть моей темы занимает 9 колонок на широком экране, правая часть — 3 колонки. При низком разрешении экрана, обе части занимают 12 колонок, на всю ширину экрана.

Ссылка на документацию: Reflex grid.

Постскриптум

А на сегодня всё. Если у вас есть вопросы — не стесняйтесь спрашивать в комментариях, которые я наконец-то привёл в более-менее человеческий вид после смены темы.

За семь лет ковыряния своего блога немного стал разбираться в PHP, HTML, CSS и JavaScript. На самом деле, это несложно — попробуйте и всё у вас получится.

Меняем формат вывода плагина WP-PostRatings

Плагин WP-PostRatings использует функцию number_format_i18n() для вывода рейтинга в числовом виде, используя данные локали. В русском варианте цифры выглядят так: «Рейтинг статьи 4,80 из 5». Как программисту, мне неприятно было видеть запятую в виде разделителя и лишний ноль в конце. Хотя математически все соответствует русским стандартам.

Существует способ поменять формат вывода, но для этого придется править исходники плагина.

Процедура довольно простая: открываем файл wp-postratings/wp-postratings.php в редакторе плагинов. Находим такие строчки:

$value = str_replace("%RATINGS_MAX%", number_format_i18n($ratings_max), $value);
$value = str_replace("%RATINGS_AVERAGE%", number_format_i18n($post_ratings_average), $value);

И меняем функцию number_format_i18n() на number_format():

$value = str_replace("%RATINGS_MAX%", number_format($ratings_max, 1, '.', ''), $value);
$value = str_replace("%RATINGS_AVERAGE%", number_format($post_ratings_average, 1, '.', ''), $value);

После этой процедуры рейтинг будет выводится так: «Рейтинг статьи 4.8 из 5.0». Число в скобках означает количество цифр после запятой.

Блог Евгения Жирнова