Поддержка Проблемы и решения Произвольные rewrite правила

  • Добрый день.

    Столкнулся с задачей реализации собственных rewrite правил.

    Есть сайт объявлений.
    Объявления размещаются по рубрикам различного уровня вложенности.
    Объявления делятся по регионам. Задается параметр при их публикации.

    Посетитель заходя на сайт выбирает регион: «Московская область» передали GET и запомнили выбор пользователя
    http://site.ru/?region=545

    При переходе в рубрику например «Недвижимость» посетитель увидит объявления у которых параметры «регион/область» указана как «Московская область (545)»
    Адрес объявления видим таким: http://site.ru/realty/slug_ad.html

    У региона 545 есть slug — msk

    Необходимо добавить rewrite правило, чтобы адрес объявления принял следующий вид:
    http://site.ru/msk/category/slug_ad.html
    возможно даже такой
    http://site.ru/msk/category/category2/category3/slug_ad.html

    Как вариант, конечно, можно создать рубрики с названиями регионов, к ним добавить подрубрики для объявлений. Но сколько же будет копий одинаковых рубрик…

    Поэтому решил попробовать решить задачу при помощи функции add_rewrite_rule и add_rewrite_tag.

    По мимо объявлений на сайте размещаются записи в раздел Новости, Статьи и пр. которые не делятся по регионам.

    Для тестирования функций воспользовался кодом который работает на страницах:

    add_action('init', 'my_rewrite_rule');
    function my_rewrite_rule(){
    	add_rewrite_tag('%region%', '([^&]+)');
    	add_rewrite_rule('^([^/]*)/([^/]*)/?', 'index.php?region=$matches[1]&pagename=$matches[2]', 'top');
    	flush_rewrite_rules();
    }

    Все работает. Но как быть с записями размещенными на различных уровнях вложенности категорий? Что то вроде:

    add_rewrite_rule('^([^/]*)/([^/]*)/([^/]*)/?', 'index.php?region=$matches[1]&cat=$matches[2]&p=$matches[3]', 'top');

    не работает, переходя по /msk/category/slug_ad.html вижу белый экран, а не контент записи.

    В настройках постоянных ссылок указано: /%category%/%postname%.html

    И как быть, когда уровень категорий больше одного? WP сделаем редирект самостоятельно?

    Возможно есть другой выход и ситуации? Спасибо.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Проще говоря, мне нужна функция подобная add_rewrite_endpoint которая позволяет добавлять переменные в начало адресной строки, а не в конец.

    Для записей переделал таким образом:

    add_rewrite_rule('([^/]+)/([^/]+)/([^/]+)/?$', 'index.php?region=$matches[1]&category_name=$matches[2]&name=matches[3]','top');

    все равно безрезультатно. Видимо регулярное выражение построено совсем не верно.

    Как вариант нашел решение подобное этому:

    function do_rewrite() {
    	global $wp_rewrite;
    	$region_structure = '/%region%/%category%/%postname%.html';
    	$wp_rewrite->add_rewrite_tag("%region%", '([^/]+)', "region=");
    	$wp_rewrite->add_permastruct('region', $region_structure, false);
    }
    add_action('init', 'do_rewrite');

    но как быть с записями, у которых нет разделения по регионам? т.к. перейдя по адресу /news/privet-mir.html за регион будет принята категория news

    Видимо решение принимает следующий вид:

    function add_my_var($query_vars) {
        $query_vars[] = 'region';
        return $query_vars;
    }
    add_filter('query_vars', 'add_my_var');
    
    function do_rewrite() {
    	global $wp_rewrite;
    	$region_structure = '/%region%/%category%/%postname%.html';
    	$wp_rewrite->add_rewrite_tag("%region%", '([^/]+)', "region=");
    	$args = array(
    		'with_front' 	=> true,
    		'ep_mask' 	=> 'EP_NONE',
    		'paged' 	=> true,
    		'feed' 		=> false,
    		'forcomments' 	=> false,
    		'walk_dirs' 	=> false,
    		'endpoints' 	=> true
    	);
    	$wp_rewrite->add_permastruct('region', $region_structure, $args);
    	//flush_rewrite_rules();
    }
    add_action('init', 'do_rewrite');

    я не ошибся?

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Тема «Произвольные rewrite правила» закрыта для новых ответов.