Частичное ЧПУ на сайте WP

В контексте SEO и вебмастеринга, ЧПУ означает «человеко-понятный УРЛ». В английском аналогичная аббревиатура: SEF URL, т.е. «SEO friendly URL» (дружественный к поисковому продвижению URL). Такое название не случайно, т.к. URL наряду с заголовком и описанием страницы является одним из элементов, попадающих в поисковый сниппет, потому ключевое слово в URL существенно добавляет релевантности странице.

Search Engine Friendly URLs

ЧПУ повышает релевантность страницы

Потому ЧПУ — это хорошо для SEO, и на новом сайте настоятельно рекомендуется включать именно такую структуру адресов. Но на старом сайте могут быть тысячи страниц, и не всегда есть возможность перейти на новую структуру адресации без потерь. В этом случае для успешного продвижения некоторых страниц поможет частичное включение ЧПУ.

У меня недавно возникла такая необходимость. Как обычно, скорость решения имела приоритет над удобством, так родился следующий кусок кода, который я поместил в /wp-content/mu-plugins/custom_sef_url.php

Код php-файлов из папки mu-plugins выполняется независимо от подключенных тем и плагинов, на этапе загрузки страницы, когда ещё не загрузился и не сработал код плагинов и файла functions.php активной темы

<?
function custom_sef_url() {
    return [
        8187 => 'site-security-control'
    ];
}

add_filter('request', function($query_vars) {
    $post_slug_by_id = custom_sef_url();
    if ($query_vars['p'] ?? 0 and $post_slug_by_id[$query_vars['p']] ?? 0) {
        $permalink = get_home_url().'/'.$post_slug_by_id[$query_vars['p']];
        wp_redirect($permalink, 301);
        die;
    }
    $post_id_by_slug = array_flip($post_slug_by_id);
	$request = ltrim(parse_url($_SERVER['REQUEST_URI'])['path'], '/');
	if($request and $post_id_by_slug[$request] ?? 0) {
		$query_vars['p'] = $post_id_by_slug[$request];
	}
	return $query_vars;
});
add_filter('post_link', function ($permalink, $post, $leavename) {
    $post_slug_by_id = custom_sef_url();
    if ($post_slug_by_id[$post->ID] ?? 0) {
        $permalink = get_home_url().'/'.$post_slug_by_id[$post->ID];
    }
    return $permalink;
}, 10, 3);

В данном случае переход на ЧПУ срабатывает для поста с ID = 8187. URL до добавления этого кода: /?p=8187, URL после: /site-security-control, и конечно с помощью этого кода происходит редирект с кодом 301 (постоянное перенаправление) со старого URL на новый. Новые адреса добавляются в начало кода, например:

<?
function custom_sef_url() {
    return [
        8187 => 'site-security-control',
        555 =>  'some-sef-url',
        777 =>  'your-keywords-here',
    ];
}

В коде используется синтаксис php7, потому для работы на устаревшем php5 придётся кое-что подправить. Но у меня не продакшен, предназначенный для 99% охвата платформ, так что — as is

Как я уже говорил, удобство решения в этом случае мне было не принципиально, главное — функциональность. Пройдёмся кратко по функционалу. Здесь добавляется наш фильтр на событие request (когда мы запрашиваем контент из базы, нам нужно указать WP, что some-sef-url — это пост 555). Для этого мы создаём переменную запроса $query_vars['p'], которую передаём ID страницы, если запрошен наш URL. А если запрос происходит по старому адресу (переменная p задана в URL), то нужно осуществить 301 редирект на some-sef-url. Также добавляется фильтр к функции post_link, которая отвечает за генерацию ссылок во всех элементах навигации, в т.ч. на карте сайта и в мета-теге rel="cannonical". Соответственно, при генерации ссылок нам желательно возвращать каноничную ссылку /your-keywords-here вместо /?=777. Для этого и служит фильтр. Вот, собственно, и всё.

Для удобства вы можете создать произвольное поле (custom fields), чтобы прописывать ЧПУ для нужных страниц во время их редактирования из интерфейса админки. Возможно, добавите уникальное ЧПУ для таксономии. Уверен, если вам такой функционал необходим, то вы детишки взрослые и сами его допишете.

Запись опубликована в рубрике Web-мастеринг с метками , , . Короткая ссылка для добавления в закладки: Частичное ЧПУ на сайте WP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *