Вопрос или проблема
У меня есть пользовательский тип записи, который использует главную одиночную страницу только по определенным терминам, но для других она действительно не нужна. Я хочу избежать доступа пользователя к постоянной ссылке для всех терминов, кроме одного. Я предполагаю, что должен быть способ «расширить» правило основного пользовательского типа записи так, чтобы оно использовалось только по определенным терминам, но не уверен. Думаю, нет «официального» способа сделать это в WordPress, но, возможно, с помощью пользовательских функций? Есть идеи?
Хорошо – это не то, что я хотел, но это сработало. Добавление функции для перенаправления, когда пользователь попадает на любой термин, кроме одного:
function my_page_template_redirect() {
if( is_singular( 'custom-post-type' ) && !(has_term('term', 'custom-taxonomy')) ) {
wp_redirect( home_url(), 301 );
exit();
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Ответ на основе этого: Отключить просмотр одиночного поста для конкретной таксономии на пользовательском типе записи
.
Ответ или решение
Вопрос о том, как сделать так, чтобы publicly_queryable => false
применялось только для определенных терминов таксономии в вашем пользовательском типе записей в WordPress, действительно сложен, однако его можно решить, используя подход с переопределением стандартного поведения через пользовательские функции.
Понимание проблемы
Ваша задача заключается в ограничении доступа к отдельным записям пользовательского типа в зависимости от терминов таксономии. То есть, вы желаете сделать так, чтобы записи были доступны только для определённых терминов, в то время как для других терминов доступ к одиночной странице записей не требовался.
Использование publicly_queryable
Параметр publicly_queryable => false
используется при регистрации пользовательского типа записи, чтобы отключить доступ к одиночной странице записей. Однако он применяется ко всему типу записи, что делает его неэффективным для случаев, когда разные термины требуют разных уровней доступа.
Решение через редирект
Ваше текущее решение, основанное на редиректе при попытке доступа к записи, если термин не соответствует заданному, является хорошим подходом. Вы создаете условие, при котором, если пользователь пытается получить доступ к одиночной записи с термином, отличным от ожидаемого, срабатывает редирект на главную страницу.
Вот ваш код с небольшими доработками и комментариями для большей ясности:
function my_page_template_redirect() {
// Проверяем, является ли запрашиваемый контент одиночной записью пользовательского типа
if( is_singular( 'custom-post-type' ) && !( has_term('term', 'custom-taxonomy') ) ) ) {
// Перенаправляем пользователя на главную страницу
wp_redirect( home_url(), 301 );
exit();
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Пояснения к коду
- Функция
is_singular()
: Проверяет, является ли текущая страница одиночной записью заданного пользовательского типа. - Функция
has_term()
: Условие проверяет, принадлежит ли текущая запись к конкретному термину какому-либо из определённых в нужной таксономии. Если нет, срабатывает редирект. - Редирект: При помощи
wp_redirect()
вы перенаправляете пользователя на главную страницу, избегая таким образом показа одиночной записи.
Другие варианты
Если вы хотите более гибко управлять доступом, вы можете рассмотреть использование других хуков, таких как:
pre_get_posts
: Можно изменить запрос перед его выполнением, запрещая отображение записей в зависимости от условий.template_include
: Позволяет подменять выбранный шаблон в зависимости от условий, предоставляя больше контроля над выводом контента.
Заключение
Использование редиректа — это практичный способ управления доступом к записям вашего пользовательского типа на основе терминов таксономии. Хотя publicly_queryable => false
не позволяет дифференцировать доступ по терминам, использование функций, таких как is_singular()
и has_term()
, вместе с wp_redirect()
, дает вам необходимые инструменты для достижения вашего замысла.
Эта реализация поможет вам избежать нежелательных обращений к записям и обеспечит более точное управление видимостью контента на вашем сайте.