Структура ссылок (ЧПУ) для произвольного типа записей в WordPress

Помните, мы писали о том, как создать произвольный тип записей и как вывести записи произвольного типа на WordPress сайте. Но есть еще один не менее важный момент, который вам понадобится в работе с произвольными типами записей - это настройка ЧПУ или структуры ссылок. Базовые настройки WordPress позволяют настроить ЧПУ только для встроенного типа записей, что сильно ограничивает в разработке сайта. Но решить эту проблему можно несколькими способами.

Рекомендуем прочесть пост о том, как правильно настроить ЧПУ в WordPress.

Плагины для работы с ЧПУ в WordPress

Конечно же, уже написаны специальные плагины для работы с ЧПУ произвольных типов записей:

  1. Custom Post Type Permalinks
  2. Permalink Editor

Чтобы установить плагин, смотрите инструкцию по установке WordPress плагинов.

Эти плагины усовершенствуют страницу настроек ЧПУ в WordPress примерно следующим образом Настройка ЧПУ для произвольных типов записей

Использовать плагины для настройки произвольной структуры ссылок в WordPress очень удобно. Но если нужно обойтись без плагинов, то можно сделать то же самое с помощью php кода в файле functions.php.

Настройка произвольной структуры ссылок в WordPress с помощью кода

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

global $wp_rewrite;
$stati_structure = '/stati/%category%/%stati%';     // "stati" - это ярлык произвольного типа записей, нужно поменять
$wp_rewrite->add_rewrite_tag("%stati%", '([^/]+)', "stati=");
$wp_rewrite->add_permastruct('stati', $stati_structure, false);

add_filter('post_type_link', 'stati_permalink', 10, 3);

function stati_permalink($permalink, $post_id, $leavename) {
    $post = get_post($post_id);
    $rewritecode = array( '%category%');

    if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) {
        $unixtime = strtotime($post->post_date);

        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = wp_get_object_terms($post->ID, 'rubriki'); // "rubriki" - это зарегистрированная произвольная таксономия, нужно поменять
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
            }
        }
        $rewritereplace = array($category);
        $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
    }
    return $permalink;
}