Вопрос или проблема
Я пытался понять, как добиться определенной структуры постоянной ссылки, но ничего не вышло. Вот ситуация:
На моем сайте у меня есть одна основная пользовательская таксономия (модуль). У меня есть пять пользовательских типов записей (рассылка, тема, вопрос, ресурс, деятельность). Таксономия “модуль” связана с каждым из пользовательских типов записей.
Я хочу добиться структуры постоянной ссылки, которая выглядела бы так (для деятельности, например):
http://example.com/module/%module%/activity/activity_name. И я хочу, чтобы http://example.com/module/%module%/activity вела к архиву для типа записи “деятельность” для тех действий, которые связаны с %module%.
Я использовал плагин PODS для управления моими пользовательскими типами записей/таксономиями. Я экспериментировал с различными пользовательскими кодами и другими плагинами, чтобы достичь своей цели, но так и не смог это сделать.
Некоторые записи здесь, которые я видел и которые близки к тому, что я ищу, связаны с написанием кода для определения пользовательских типов записей/таксономий. У меня с этим проблем нет; я делал это раньше. Однако, поскольку у меня все настроено (а пользовательские структуры довольно обширны), я хотел бы продолжать использовать/развивать PODS, если это возможно.
Похоже, вы хотите создать Пользовательские Таксономии с Pods. Это похоже на создание новой опции, которую вы позже можете добавить к каждому элементу, например, добавление “Размер” как опции к “Рубашка”. Тогда Размер был бы кликабельным, и вы могли бы видеть архивы для всех похожих размеров. Это делается с помощью Пользовательских Таксономий.
- В админке WordPress перейдите в Pods Admin > Добавить новый, и нажмите Создать новый
- В выпадающем списке Тип контента, выберите ‘Пользовательская таксономия (как категории или метки)’
- Введите единственное и множественное обозначение (например, Размер и Размеры), используйте Расширенные параметры, если хотите переопределить Архивный slug, и нажмите Следующий шаг.
- Настройте параметры пользовательского интерфейса администратора
- Настройте Расширенные параметры, иерархические для таксономий, таких как Категории, оставьте это без изменений для таксономий в стиле меток.
- Настройте Расширенные параметры, Связанные типы записей для соединения ваших таксономий с типами записей, которые они будут организовывать.
- Добавьте любые поля к таксономии в разделе Управление полями.
Источник: https://docs.pods.io/creating-editing-pods/creating-a-custom-taxonomy/
Примечание: Вам может не понадобиться иметь структуру постоянной ссылки, как вы упомянули. Используя pods, вы можете иметь URL вроде: http://example.com/pod-module-name
Например:
http://example.com/question
Эта страница будет перечислять все записи вопросов. И каждая отдельная запись должна иметь URL вроде:
http://example.com/question/the-question-slug/
Это стандартное поведение Pods. Так что это может уже делать что-то близкое к тому, что вы хотите.
Я полагаю, add_permastruct может помочь вам в этом. Например, предположим, что текущая структура постоянной ссылки, определенная PODS, выглядит как “example.com/activities/activity_name”.
function wpse415279_custom_permastruct(){
add_permastruct(
'activities', /* должна соответствовать текущему slug для типа записи "activities" */
'module/%module%/activities/%activities%'
);
}
/*
Эта функция должна запускаться после того, как PODS определил тип записи.
Я предполагаю, что это происходит на хука init, так что это также будет привязано
к init, но с низким приоритетом 100.
*/
add_action( 'init', 'wpse415279_custom_permastruct', 100 );
Теперь мы говорим WordPress изменить ссылки, которые он генерирует на фронт-энде, чтобы они соответствовали нашей новой структуре постоянной ссылки выше. Мы можем сделать это, фильтруя ссылку типа записи:
function wpse415279_rewrite_activity_links( $post_link, $post_obj ){
/* выясняем, привязана ли к этому посту термин в таксономии 'module' */
if ( is_object( $post_obj )){
$terms = wp_get_object_terms(
$post_obj->ID,
'module' /* предполагая, что 'module' - это ключ вашей пользовательской таксономии */
);
}
/* если да, заменяем тег замены %module% на название модуля */
if ( $terms ){
$post_link = str_replace('%module%', $terms[0]->slug, $post_link);
}
return $post_link;
}
add_filter( 'post_type_link', 'wpse415279_rewrite_activity_links', 10, 2 );
Я создал мини-версию вашей настройки на моем локальном компьютере с “модулями” в качестве пользовательской таксономии и “деятельностями” в качестве пользовательского типа записи. Этот метод сработал для меня в этом контексте. Ваша настройка, безусловно, более сложная, так что я надеюсь, что она сможет адаптироваться. Это должно удовлетворить необходимость в том, чтобы вам не нужно было самостоятельно определять тип записи и таксономию. Я просто положил вышеуказанный код в небольшой плагин.
Также посмотрите на лучший ответ на этот вопрос, если вы еще этого не сделали, в основном оттуда я это и взял.
Правка: Предполагаю, что следует упомянуть о необходимости обновить перезаписи перед тестированием, перейдя в настройки > постоянные ссылки и нажав “сохранить изменения”.
Ответ или решение
Чтобы настроить структуру постоянных ссылок (permalinks) для пользовательских типов записей и таксономий в WordPress, особенно с использованием плагина Pods, вам нужно выполнить несколько шагов. Давайте разберёмся в этом процессе более детально.
Обзор задачи
У вас есть основная пользовательская таксономия под названием "module", связанная с пятью пользовательскими типами записей: dispatch, topic, question, resource, activity. Вы хотите, чтобы структура постоянных ссылок для типа записи "activity" выглядела так:
- Для отдельной записи:
http://example.com/module/%module%/activity/activity_name
- Для архива всех записей этого типа:
http://example.com/module/%module%/activity
Шаги для реализации:
1. Создание пользовательских таксономий и типов записей через Pods
Если вы уже создали таксономии и типы записей с помощью Pods, убедитесь, что:
- Ваши пользовательские типы записей имеют корректные слуги (slugs).
- Таксономия "module" связана со всеми необходимыми типами записей.
Вы можете проверить или создать их в разделе Pods Admin -> Add New.
2. Определение структуры постоянных ссылок
Для изменения структуры постоянных ссылок вам потребуется использовать функции add_permastruct()
и добавить фильтр на генерацию ссылок. Эта часть кода можно добавить в файл вашего плагина или в файл functions.php
вашей темы.
function wpse415279_custom_permastruct() {
add_permastruct(
'activities', /* подходит к текущему слогу для "activities" */
'module/%module%/activities/%activities%'
);
}
add_action('init', 'wpse415279_custom_permastruct', 100);
3. Перезапись ссылок для пользовательского типа записи
Теперь воспользуемся фильтром post_type_link
, чтобы поменять ссылки на основе вашего таксономии "module".
function wpse415279_rewrite_activity_links($post_link, $post_obj) {
if (is_object($post_obj)) {
$terms = wp_get_object_terms(
$post_obj->ID,
'module' /* предположим, что 'module' - это ключ для вашей таксономии */
);
}
if ($terms && !is_wp_error($terms)) {
$post_link = str_replace('%module%', $terms[0]->slug, $post_link);
}
return $post_link;
}
add_filter('post_type_link', 'wpse415279_rewrite_activity_links', 10, 2);
4. Обновление структуры перезаписей
После внесения изменений необходимо обновить структуру перезаписей. Для этого перейдите в Настройки -> Постоянные ссылки и просто нажмите "Сохранить изменения". Это очистит кэш перезаписей (rewrite rules), что позволит вашим новым ссылкам работать корректно.
Примечания:
- Важно регулярно тестировать изменения на локальной среде или staging-сайте перед их внедрением на продакшн.
- Убедитесь, что у вас настроены все необходимые права доступа для доступа к вашим пользовательским типам и таксономиям.
- Использование плагина Pods предоставляет вам гибкость в настройках, поэтому не стесняйтесь использовать его возможности для дальнейшего расширения вашего проекта.
Эти шаги помогут вам настроить желаемую структуру постоянных ссылок для ваших пользовательских типов записей и таксономий. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обратиться к документации Pods или сообществу WordPress.