WordPress

Убираем название иерархического произвольного типа записи из url

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

Мне удобно использовать произвольные типы записи в вордпрессе. Стандартные “записи” и “страницы” зачастую не имеют необходимых мне свойств. Да и в случае косяков, произвольный тип можно удалить и создать новый, со стандартными так не выйдет. Так вот.

У вордпресса по умолчанию в записях произвольного типа подставляется слаг этого типа. О чём это я: создал я тип записей “Отчёты”. Его слаг – “otchety”. Соответственно, все записи этого типа будут иметь такой url:

site.ru/otchety/pervij

site.ru/otchety/desjatyj

site.ru/otchety/kvartalnij/1-chast

и т.д. И вот этот слаг мне жутко мозолит глаза. Во-первых он увеличивает уровень вложенности (сейчас на него в целом похер), во-вторых – не красиво. Нужно его как-то убрать.

Ниже код, который я откопал в зарубежном интернете:

/**
 * Убираем название иерархического произвольного типа записи из url
 */
 
if ( !class_exists( 'State_Rewrites' ) ) :
 
class State_Rewrites {
 
    private static $instance;
 
    public $rules;
 
    private function __construct() {
        /* Don't do anything, needs to be initialized via instance() method */
    }
 
    public static function instance() {
        if ( ! isset( self::$instance ) ) {
            self::$instance = new State_Rewrites;
            self::$instance->setup();
        }
        return self::$instance;
    }
 
    public function setup() {
        add_action( 'init',                array( $this, 'add_rewrites' ),            20 );
        add_filter( 'request',             array( $this, 'check_rewrite_conflicts' )     );
        add_filter( 'state_rewrite_rules', array( $this, 'strip_state_rules' )           );
        add_filter( 'rewrite_rules_array', array( $this, 'inject_state_rules' )          );
    }
 
    public function add_rewrites() {
        add_rewrite_tag( "%state%", '(.+?)', "state=" );
        add_permastruct( 'state', "%state%", array(
            'ep_mask' => EP_PERMALINK
        ) );
    }
 
    public function check_rewrite_conflicts( $qv ) {
        if ( isset( $qv['state'] ) ) {
            if ( get_page_by_path( $qv['state'] ) ) {
                $qv = array( 'pagename' => $qv['state'] );
            }
        }
        return $qv;
    }
 
    public function strip_state_rules( $rules ) {
        $this->rules = $rules;
        # We no longer need the attachment rules, so strip them out
        foreach ( $this->rules as $regex => $value ) {
            if ( strpos( $value, 'attachment' ) )
                unset( $this->rules[ $regex ] );
        }
        return array();
    }
 
    public function inject_state_rules( $rules ) {
        # This is the first 'page' rule
        $offset = array_search( '(.?.+?)/trackback/?$', array_keys( $rules ) );
        $page_rules = array_slice( $rules, $offset, null, true );
        $other_rules = array_slice( $rules, 0, $offset, true );
        return array_merge( $other_rules, $this->rules, $page_rules );
    }
}
 
State_Rewrites::instance();
 
endif;

Копируем его в notepad++ -> жмём Ctrl+F -> Заменить -> Заменяем “state” на слаг своего типа -> переносим в functions.php -> сохраняем. Обязательно поставьте галочку напротив “Учитывать регистр”.

Убираем название иерархического произвольного типа записи из url

Ещё один важный момент: я создаю типы записей с помощью Toolset Types, если вы тоже – обязательно в настройках снимите вот эту галочку:

Убираем название иерархического произвольного типа записи из url

иначе работать не будет. После вставки кода в функции в админке вордпресса идём в Настройки -> Постоянные ссылки и просто жмём “Сохранить изменения”.

Вуаля – надоедливый тег больше не будет преследовать.

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