Так уж вышло, что я получаю кайф от самого процесса работы. Одним словом – я задрот. Поэтому стараюсь делать вещи, которые по моему мнению добавляют красоты в сайт. Сейчас речь идёт о ссылках на записи.
Мне удобно использовать произвольные типы записи в вордпрессе. Стандартные “записи” и “страницы” зачастую не имеют необходимых мне свойств. Да и в случае косяков, произвольный тип можно удалить и создать новый, со стандартными так не выйдет. Так вот.
У вордпресса по умолчанию в записях произвольного типа подставляется слаг этого типа. О чём это я: создал я тип записей “Отчёты”. Его слаг – “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 -> сохраняем. Обязательно поставьте галочку напротив “Учитывать регистр”.
Ещё один важный момент: я создаю типы записей с помощью Toolset Types, если вы тоже – обязательно в настройках снимите вот эту галочку:
иначе работать не будет. После вставки кода в функции в админке вордпресса идём в Настройки -> Постоянные ссылки и просто жмём “Сохранить изменения”.
Вуаля – надоедливый тег больше не будет преследовать.