@Q133

Как правильно настроить специфичные ЧПУ url для собственных типов записей в WP?

Здравствуйте.

Только начал изучать WP. Стоит задача - собрать каталог организаций со сложной структурой, фильтрацией, ЧПУ.
Сделал набор собственных типов записей (через register_post_type) и создал пару тестовых записей.

Условная пара из них
  • Тип записей city с таксономией country.
  • Тип записей company

Далее, я пытаюсь создать правила вида:

add_rewrite_rule(
   "catalog/(ru|by|ua)/$",
   'index.php?post_type=city', //&country=$matches[1]
   "top"
 );


Вообще цель стоит построить немного более широких охват ЧПУ:

#catalog/%country%/ - список городов
#catalog/%country%/%city%/ - список компаний, привязанных к конкретному городу
#catalog/%country%/%city%/%company%/ - конкретная компания


и множество узконаправленных фильтров

#catalog/%country%/%city%/filer_type/(ip|ooo)/ - вывод компаний отфильтрованных по типу ИП, ООО 
#catalog/%country%/%city%/filer_vid/([a-z_\-]+)/ - вывод компаний с фильтром по виду деятельности


так же будут общие фильтры catalog/%country%/%city%/filter/?f1=x&f2=y&f3=z

Уперся уже на уровне add_rewrite_rule,

Набрался целый ряд вопросов:

1. настройки нового типа записи (register_post_type). При создании:

public - true, (чтобы видеть в админке), но какими в итоге должны быть

publicly_queryable
query_var
rewrite


Чтобы:

я мог настроить свои правила ЧПУ через add_rewrite_rule, при этом, чтобы при обращении к сайту с запросом
my.site/?city=moskva
не появлялась страница пустая (т.е. чтобы пользовательский запрос такого вида не обрабатывался (если все 3 свойства true - он как раз таки обрабатывается)) и чтобы при этом я мог спокойно задать в дальнешем свои ЧПУ правила

2. Правильно ли я понимаю правила того, как WP обрабатывает запросы ЧПУ:

я прописываю ЧПУ правило для
catalog/%country%/
- соотв запрос нужно передать вида

add_rewrite_rule(
        "^catalog/([a-z_\-]+)/$",
        'index.php?post_type=city&country=$matches[1]', 
        "top"
);


а дальше WP должен выбрать все города (тип записи city), которые находятся в разделе country (это таксономия для city).
и попытается вывести их через archive-city.php, если его не существует - то через archive.php?

После того как я добавлю код add_rewrite_rule в свою функцию и подключу ее
add_action( 'init', 'custom_rules' );

Я сохраняю настройки на странице со списком пермалинков в админке и изменения должны вступить в силу.
Но я упорно застопорился на первом же шаге: /catalog/ru/ - отдает 404 =(

2.1 Еще здесь не понятно что должно быть в параметре $redirect, если я пишу ЧПУ правило для дет. карточки организации и мне надо использовать символьный код (кастомное свойство, созданное через плагин "Расширенные произвольные поля").

По идее WP должен понять index.php?post_type=city&post_id=$matches[1], но
это тоже только мое предположение. А как сделать, чтобы он понял, что ему нужно выводить данные через single.php по входной переменной?

3. Я еще не дошел до фильтров в ЧПУ, поэтому даже еще не особо понимаю, где в итоге реализовывать их логику:

Как сейчас я это представляю - логика в файле archive-XXX.php, перед выводом данных.
XXX определяется типом записей, который в итоге я вывожу:

  • Если конечные данные это список городов - то в archive-city.php будет фильтр, который будет ориентироваться на данные из get_query_var и префильтровывать данные.
  • Если конечные данные - организации, то archive-company.php будет работать со своим фильтром данных.
    + т.к. т.к. тут будет куча разных вариантов фильтров, то тут и будет пачка логики? Или как то нормально можно это по уму организовать?

.

4. проверка формата url

+ нужно еще будет проверять правильность ЧПУ, например, что по адресу
/ru/tokio/some-firm/ - что фирма some-firm действительно привязана через кастомное свойство к городу Токио, а город токио - к стране RU.
Или можно это как-то обойти штатными механизмами?

Спасибо что дочитали =)
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
AwardWallet Пермь
от 45 000 до 60 000 руб.
While Web Production Киев
от 5 000 до 15 000 грн.
Dart Simple Санкт-Петербург
от 120 000 до 150 000 руб.
15 авг. 2018, в 23:38
300 руб./за проект
15 авг. 2018, в 22:39
60000 руб./за проект
15 авг. 2018, в 21:18
30000 руб./за проект