Удаление слага из URL таксономии
Интересует, как можно удалить слаги из некоторых URL. Я использую пользовательский тип записи под названием exhibitors и несколько таксономий для определения этих экспонентов (например: featured-guests, publishers и т.д.):
Сейчас у меня такой URL: http://thisurl.com/exhibitor_filters/featured-guests/
Я хотел бы получить такой: http://thisurl.com/featured-guests/
Я экспериментировал с перезаписью / слагом в WordPress, но пока безрезультатно.
Есть предложения?
Спасибо!
-Редактирование-
Забавно, теперь я получаю ошибки 404 для всего, что связано с пользовательскими типами записей и терминами таксономии. Сначала я попробую хотя бы заставить это перестать выдавать столько ошибок... спасибо за общие предложения, ребята.
По умолчанию это невозможно, и использование API для регистрации CPT (Custom Post Types) и пользовательских таксономий также не позволяет этого сделать.
И на то есть веская причина.
Все связано с возможными конфликтами постоянных ссылок (permalink) и ярлыков (slug), а также с необходимостью избегать неоднозначности. Хотя бывают случаи, когда система не разрешает уникальные URL, которые никогда не пересекаются, из-за этой причины (ложное срабатывание).
Поэтому я рекомендую выбрать замену для 'exhibitor_filters'
, например 'exhibitors'
или 'filters'
, и использовать это в качестве ярлыка (slug) в параметре rewrite при регистрации.
Если же вы действительно хотите реализовать это так, как задумано, вам потребуется добавить правила перезаписи (rewrite rules). Это может быть проблематично, так как существует реальный риск конфликтов (например, загружать страницу 'about'
или термин таксономии 'about'
?), и порядок, а также приоритеты ваших хуков будут играть важную роль.
Например:
function ex_rewrite( $wp_rewrite ) {
$feed_rules = array(
'(.+)' => 'index.php?exhibitor_filter='. $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $wp_rewrite->rules + $feed_rules;
}
// обновите/сбросьте постоянные ссылки в админке, если этот код был изменен
add_filter( 'generate_rewrite_rules', 'ex_rewrite' );
Приведенный выше код будет работать для отдельных терминов, но потребует доработки для иерархических URL и таксономий.
Поместите этот код в файл functions.php вашей темы или связанного с темой плагина.
Внимание: Будьте осторожны, чтобы избежать конфликтов постоянных ссылок, и учитывайте порядок, в котором применяются правила. Для тестирования используйте плагин Monkeyman Rewrite Analyzer. Вы предупреждены.

Это всё ещё работает? Нужно ли добавить что-то вроде return
? У меня это, кажется, вообще ничего не делает.

Да, но вам нужно адаптировать код под ваш конкретный случай использования. Этот ответ был написан для автора вопроса, поэтому простое копирование и вставка не сработает, если ваши пользовательские типы записей и таксономии не совпадают с теми, что были у автора. Этот ответ не предназначен для слепого копирования. Также обратите внимание на оговорки в ответе.

Существует плагин, который позволит вам легко удалить слаг таксономии в несколько кликов. Однако, как сказал Том, будьте осторожны, например, не называйте термины разных таксономий одинаково, иначе всё может сломаться.
Ссылка на плагин: http://wordpress.org/extend/plugins/wp-htaccess-control/

Вы можете указать это в разделе постоянных ссылок. Это можно настроить через пользовательскую постоянную ссылку, но, похоже, один из стандартных вариантов "Название записи" подойдет вам. Это можно найти в настройках, раздел "Постоянные ссылки" в админ-панели WordPress.

Я нашел ответ здесь и использовал код из комментариев Джонатана Бринли.
Вам следует сначала объявить свою таксономию "exhibitor_filters"
, а затем ваш тип записи (CPT), установив его ярлык (slug) как %exhibitor_filters%
.
Тогда все ваши CPT и термины будут работать корректно, включая ссылки на архивы терминов. В моем случае я убрал slug CPT из постоянных ссылок, используя %taxo% в slug CPT, и это также сработало, за исключением архива терминов, который все еще показывает slug CPT. Но в вашем случае, кажется, это именно то, что вам нужно.
Похоже, вы хотите страницы архивов, на которых будут отображаться все пользовательские записи в фильтре экспонентов "featured-guests"
.
Удачи.

Есть ли способ передать что-то вроде пустого слага? Если я оставлю его пустым, я также получаю ошибки сервера.

Могу ли я увидеть полный код, просто чтобы убедиться, что он реализован правильно. Насколько я знаю, если функция не срабатывает, она не должна вызывать ошибку 500.

register_taxonomy('exhibitor_filters','exhibitors', array( 'hierarchical' => true, 'label' => 'Тип экспонента', 'query_var' => true, 'rewrite' => array( 'slug' => 'featured-guests', 'with_front' => false )
)
);
Я не думаю, что это правильно. featured-guests - это термин, связанный с exhibitor_filters. Я просто хочу, чтобы часть exhibitor_filters не отображалась в ссылке. Возможно, это невозможно. Наверное, я просто соберу страницу вручную или что-то в этом роде.

Я заметил, что у вас возникают ошибки 404 с текущей структурой постоянных ссылок. Вы сбросили структуру перезаписи? http://wpengineer.com/2044/custom-post-type-and-permalink/

Да. Пока безрезультатно. Я полностью очистил свою БД и начал с нуля. Результат: архивы 2 типов записей не работают, а еще 2 по-прежнему выдают 404.
