Как изменить структуру постоянных ссылок для произвольного типа записей и его таксономий?

20 сент. 2011 г., 14:35:16
Просмотры: 35.9K
Голосов: 12

Это повторная публикация моего предыдущего вопроса, но теперь я хочу рассмотреть его более детально, чтобы полностью решить проблему.

Итак, для обычных записей изменение постоянных ссылок просто как никогда - достаточно перейти в Настройки > Постоянные ссылки и изменить структуру на любую понравившуюся, например, на широко используемую %category%/%postname%.html. Это работает. Если бы это было так же просто для произвольного типа записей и его таксономий.

Вот чего я хочу добиться:

  1. http://mywordpress.com/portfolio.html - Отображать все записи во всех категориях.
  2. http://mywordpress.com/portfolio/music/ - Отображать все записи в этой категории.
  3. http://mywordpress.com/portfolio/music/trance/ - Отображать все записи в этой (дочерней) категории.
  4. http://mywordpress.com/portfolio/music/trance/Tiesto.html - Отображать запись.

Вот что у меня есть на данный момент:

  1. Сначала я создал custom_post_type с названием project и taxonomy project_category.
  2. Я создал страницу Portfolio и назначил ей шаблон страницы, который будет выводить все записи с post_type = project. Как добавить .html к постоянной ссылке страниц? Сейчас она ведет на http://mywordpress.com/portfolio, а мне нужно http://mywordpress.com/portfolio.html. Это должно решить первую проблему.
  3. Дальше становится сложнее, потому что мы заранее не знаем, сколько будет подкатегорий, возможно их вообще не будет. Поэтому структура, которую мы ищем: portfolio/(ПУТЬ КАТЕГОРИИ ОТ ВЕРХНЕЙ ДО ДОЧЕРНЕЙ)/post.html. Я все еще застрял на этом моменте. Думаю, что как-то нужно получить последнюю добавленную категорию в путь и передать ее в project_category, что должно привести к файлу taxonomy.php, где я смогу правильно ее обработать.
  4. Я также еще не решил эту проблему, но она должна быть связана с добавлением %postname%.html в конце чего-то.

Надеюсь, моя проблема понятна, и найдутся смелые разработчики, которые помогут мне решить эту задачу, над которой я бьюсь уже ЧЕТЫРЕ полных дня!

3
Комментарии

Решение, которое я дал в предыдущем вопросе, должно было работать таким образом, если вы реализовали его правильно. Единственное - вы не можете получить HTML-часть.

Manny Fleurmond Manny Fleurmond
20 сент. 2011 г. 17:43:40

Да, но оно было привязано к определенному пути, то есть только category/subcategory/page, тогда как подкатегорий может не быть или их может быть больше. Это решение более динамичное.

Mark Mark
20 сент. 2011 г. 18:58:51

Или я реализовал его неправильно ;)

Mark Mark
20 сент. 2011 г. 18:59:01
Все ответы на вопрос 3
1

Хорошо, думаю, у меня есть решение. Я не уверен, правильный ли это способ реализовать задуманное, но пока это единственное, что работает.

// Добавляем фильтр для изменения правил перезаписи URL
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');

function mmp_rewrite_rules($rules) {
    $newRules                               = array();
    // Правило для отдельных проектов: portfolio/категория/проект.html
    $newRules['portfolio/(.+)/(.+?).html$'] = 'index.php?project=$matches[2]';
    // Правило для категорий проектов: portfolio/категория/
    $newRules['portfolio/(.+)/?$']          = 'index.php?project_category=$matches[1]'; 

    // Объединяем новые правила с существующими
    return array_merge($newRules, $rules);
}

// Добавляем фильтр для обработки запроса
add_filter('request', 'mmp_rewrite_request');

function mmp_rewrite_request($vars) {
    // Если запрошена категория проекта
    if (isset($vars['project_category'])) {
        // Если в URL категории есть слэши
        if (strpos($vars['project_category'], '/') !== false) {
            // Разбиваем URL по слэшам
            $categories = explode('/', $vars['project_category']);
            // Берем последний элемент (актуальное имя категории)
            $vars['project_category'] = $categories[count($categories) - 1];
        }
    }

    return $vars;
}
20 сент. 2011 г. 17:28:13
Комментарии

Фильтр запросов — это хороший способ определить, запрашиваем ли мы категорию (по сути, термин) или запись. Он позволяет добавить только одно правило перезаписи и получать страницу записи независимо от того, находится ли запись в категории, подкатегории или вообще без категории.

ZalemCitizen ZalemCitizen
30 окт. 2018 г. 13:14:54
0

После многочасовых мучений я нашел этот плагин очень полезным.

https://wordpress.org/plugins/custom-post-type-permalinks/

Ниже приведен скриншот доступных опций.

Настройки плагина для ЧПУ пользовательских типов записей

7 апр. 2016 г. 04:57:39
0

2 разных метода:

*Смотрите примечания внизу этого поста.


Например, вы хотите иметь такую структуру постоянных ссылок:
/ГЛАВНАЯ_КАТЕГОРИЯ/ПОДКАТЕГОРИЯ_2/Еще_ПОДКАТЕГОРИЯ/моя-запись

Сначала вам может потребоваться установить постоянные ссылки в формате /%category%/%postname%. Затем...




МЕТОД 1:

создайте СТАНДАРТНЫЕ категории (ГЛАВНАЯ_КАТЕГОРИЯ, ПОДКАТЕГОРИЯ_1, и так далее..), затем зарегистрируйте ПРОИЗВОЛЬНЫЙ ТИП ЗАПИСИ, включив этот параметр:

'taxonomies'    => array('category'..)

и используйте этот код для изменения постоянных ссылок: https://wordpress.stackexchange.com/a/195643/33667
Затем, после публикации ПРОИЗВОЛЬНОЙ ЗАПИСИ (если она прикреплена к категории), URL будет выглядеть так:
example.com/ГЛАВНАЯ_КАТЕГОРИЯ/ПОДКАТЕГОРИЯ_1/моя-запись



МЕТОД 2:

(примечание: этот метод не рекомендуется, если вы планируете публиковать сотни или тысячи записей)

зарегистрируйте ПРОИЗВОЛЬНЫЙ ТИП ЗАПИСИ (названный ГЛАВНАЯ_КАТЕГОРИЯ), включив эти параметры:

    "supports"      => array('page-attributes'......
    "hierarchical"  => true,

затем публикуйте произвольные записи следующим образом: Структура произвольных записей
(т.е. публикуйте несколько произвольных записей, названных ПОДКАТЕГОРИЯ_2, ПОДКАТЕГОРИЯ_1... После этого, когда вы публикуете другую запись, выберите ПОДКАТЕГОРИЯ_2 в качестве родительской.





Примечания:
1) Если вы новичок, изучите: Регистрация ПРОИЗВОЛЬНОГО ТИПА ЗАПИСИ и Регистрация ПРОИЗВОЛЬНОГО ТИПА ЗАПИСИ с ТАКСОНОМИЕЙ
2) если вам потребуется функциональность поиска для подуровней, используйте произвольный поисковый запрос

10 нояб. 2014 г. 12:23:37