Перезапись ссылок в WordPress. Часть 2

Начало статьи здесь Перезапись ссылок в WordPress. Часть 1

Настраиваем постоянные ссылки

Очень много информации отдается классом $wp_rewrite. Там описываются свойства, такие как $wp_rewrite->category_base или $wp_rewrite->author_base для извлечения стандартной структуры ссылок для этих страниц. Но наряду с извлечением стандартных настроек ВП, мы также можем создавать свои собственные правила.

Перестраиваем постоянные ссылки для авторов

Когда вы настраиваете структуру постоянных ссылок, у вас есть возможность переопределить префиксы для рубрик и тегов. Однако, для страниц авторов такой возможности не предусмотрено.

Но мы можем использовать функцию the add_rewrite_rule() из Кодекса WordPress для интеграции некоторых новых настроек. В нашем случае мы заменили /author/ на /writer/, но вы можете использовать все, что вам угодно. В дополнение к этому, мы скопировали некоторые другие редиректы для страницы авторов и лент RSS. Вы можете добавить этот кусок кода в файл functions.php темы:


    add_action( 'init', 'add_author_rules' );  
    function add_author_rules() {   
        add_rewrite_rule(  
            "writer/([^/]+)/?",  
            "index.php?author_name=$matches[1]",  
            "top");  
          
        add_rewrite_rule(  
        "writer/([^/]+)/page/?([0-9]{1,})/?",  
        "index.php?author_name=$matches[1]&paged=$matches[2]",  
        "top");  
          
        add_rewrite_rule(  
        "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?",  
        "index.php?author_name=$matches[1]&feed=$matches[2]",  
        "top");  
              
        add_rewrite_rule(  
        "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?",  
        "index.php?author_name=$matches[1]&feed=$matches[2]",  
        "top");  
    }  

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

Постоянные ссылки для авторов с помощью generate_rewrite_rules

Для этого способа нам снова понадобится глобальный класс $wp_rewrite. Мы создали новую переменную с именем $new_rules, которая содержит ассоциативный массив данных. Пример кода ниже просто перезаписывает правила для авторов.

    function generate_author_rewrite_rules() {  
      global $wp_rewrite;  
      $new_rules = array(  
        "writer/([^/]+)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)  
      );  
      $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;  
    }  

А что если мы захотим использовать множество страниц и лент feeds, мы улучшим наш массив. Обновленный код ниже, снова таки вставляем в файл functions.php темы:

    function generate_author_rewrite_rules() {  
      global $wp_rewrite;  
      $new_rules = array(  
        "writer/([^/]+)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1),  
        "writer/([^/]+)/page/?([0-9]{1,})/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&paged=".$wp_rewrite->preg_index(2),  
        "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&feed=".$wp_rewrite->preg_index(2),  
        "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=".$wp_rewrite->preg_index(1)."&feed=".$wp_rewrite->preg_index(2)  
      );  
      $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;  
    }  

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

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
  • Здравствуйте, помогите пожалуй

    Здравствуйте, помогите пожалуйста с проблемой.

    Нужно чтобы метка открывалась как поддомен, например site.ru?tag=dom было доступно по адресу dom.site.ru

    сервер для работы с поддоменами настроен.

    function sd_category_rewrite_rules( $rules ) {

    $url = getenv( ‘HTTP_HOST’ );// для получения слага метки из урл dom.site.ru

    $domain = explode( «.», $url );

    $categorystr = $domain[0]; // тут остается только dom

    $rules = array();

    $rules[‘$’] = ‘index.php?tag=’.categorystr;

    return $rules;

    }

    add_filter( ‘rewrite_rules_array’, ‘sd_category_rewrite_rules’ );

    Вот почему то если брать слаг метки из урл и передавать его в переменную $categorystr, то ничего не работает.

    $categorystr = $domain[0]; //в таком виде ошибка 404

    хотя если я сам укажу к переменной слаг метки вот так:

    $categorystr = ‘dom'; то все работает.

    Подскажите, в чем может быть проблема?

Scroll To Top