Вопрос или проблема
У меня есть несколько вопросов, и я не думаю, что желаемый результат возможен без добавления пользовательской таксономии и переделки множества работы.
Я зарегистрировал пользовательский тип записи – галерея – с таксономиями, установленными на post_tag и category.
Я установил структуру постоянных ссылок на /blog/%postname%/, чтобы записи могли иметь базу /blog/ с использованием стандартного раздела Записей в WordPress.
Когда я использую get_category_link() для категории в пользовательском типе записи галерея, он ссылается на /blog/ceremonies/, вместо /gallery/ceremonies/, что мне хотелось бы для всего на архиве галереи или на отдельной странице галереи. Для блога это должно быть /blog/category_name/, как это сейчас есть.
Я знаю, что могу сделать работу из этого вопроса, но у меня уже проделано много работы, которую я не хочу пересматривать.
Мои вопросы:
Существует ли способ сделать так, чтобы /blog/ceremonies/ и /gallery/ceremonies/ загружали одни и те же категории, и я мог бы отфильтровать их в зависимости от того, что установлено в URL для /blog/ или /gallery/ с помощью $_SERVER[‘REQUEST_URI’] (или что-то подобное) без создания пользовательской таксономии?
Если нет (я не думаю, что это возможно), есть ли способ удалить /blog/ из пользовательской постоянной ссылки, чтобы осталось только /ceremonies/ и при этом сохранить /blog/ в начале всего, что опубликовано в разделе “Записи”?
Буду признателен за любую помощь. Спасибо!
Когда вы регистрируете свой тип записи, в вашем массиве параметров установите
'rewrite' => array(
'with_front' => false
),
это уберет “блог” спереди. Не забудьте обновить свои постоянные ссылки после внесения этого изменения.
Не уверен по поводу категорий, программируемых через WordPress (это может быть возможно), но вы могли бы сделать правило перенаправления в вашем htaccess, которое легко перенаправляет все /blog/category на /gallery/category. Что-то вроде:
RewriteEngine On # Включить движок перезаписи
RewriteRule ^/blog/category/([A-Za-z0-9-]+)/?$ /gallery/category/$1 [NC,L] # Обработать запросы для "блог префикс"
Я НАШЕЛ РЕШЕНИЕ
Для начала, у меня был пользовательский тип записи (галерея), для которого мне нужно было использовать те же категории, что и для стандартных записей WordPress, но оставаться полностью отдельным. В конце концов, я придумал свое собственное решение и поделюсь им на случай, если кто-то столкнется с теми же проблемами, что и я.
Во-первых, я установил базу категории в разделе постоянных ссылок на /blog/category.
Затем я создал правило перезаписи: (спасибо rudtek за идею)
add_rewrite_rule('^gallery/category/(.+?)/?$', 'index.php?category_name=$matches[1]&is_gallery_cat=1', 'top');
и мне нужно было добавить is_gallery_cat
в query_vars
, чтобы это сработало.
add_filter( 'query_vars', 'query_vars' );
function query_vars( $vars )
{
array_push($vars, 'is_gallery_cat');
return $vars;
}
Оттуда, на странице архива галереи, я использовал следующий код, чтобы ссылаться на каждую из категорий, в которых она указана, со своей собственной ссылкой галереи:
$cats = get_the_category();
$co = "";
if(!empty($cats)){
foreach($cats as $cat){
$link = get_category_link($cat->term_id);
$link = str_replace("blog/category", "gallery/category", $link);
$co .= "<a href="https://wordpress.stackexchange.com/questions/279280/$link">{$cat->name}</a>, ";
}
}
echo rtrim($co, ", ");
Это изменяет ссылки так, как мне нужно, но главная страница category.php или archive.php все еще загружала посты типа post_type, поэтому мне пришлось добавить фильтр.
function set_category_archive_gallery_posts($query){
//проверка является ли это страницей категории
if(is_category()){
if(isset($query->query_vars['is_gallery_cat'])){
//это поиск категории галереи, измените тип запроса на галерею
$query->set('post_type', 'gallery');
}
}
}
add_action('pre_get_posts', 'set_category_archive_gallery_posts');
Теперь, когда я перехожу на страницу категории через блог (записи) или через галерею, они загружают полностью отдельные посты, используя одни и те же категории. Они могут делить категорию, например, вечеринки, но показывать разный контент.
Загрузка /blog/category/parties/ показывает все посты (не галереи) с установленной категорией вечеринки, тогда как /gallery/category/parties/ показывает только галереи с установленной категорией, что именно то, что я искал.
Надеюсь, это будет полезно кому-то!
Ответ или решение
Изменение базовой категории для пользовательского типа записей или страниц записей может вызывать определенные трудности, особенно если необходимо сохранить определенные функции и уже выполненную работу. Ниже приведено полное решение для вашей задачи, которое позволяет использовать одни и те же категории как для пользовательского типа записей (например, „gallery“), так и для стандартных записей в WordPress с различными базами URL.
Шаги для достижения желаемого результата:
-
Настройка структуры постоянных ссылок:
Убедитесь, что структура пермалинков настроена правильно. Для этого перейдите в настройки WordPress: Настройки -> Постоянные ссылки и выберите структуру/blog/%postname%/
для стандартных записей. Вы можете сохранить существующий базовый путь для записей, как есть. -
Создание пользовательского типа записи:
При регистрации пользовательского типа записиgallery
, установите параметры перезаписи, чтобы они не использовали префикс вашего главного типа постов:register_post_type('gallery', array( 'labels' => array( 'name' => __('Галереи'), 'singular_name' => __('Галерея') ), 'public' => true, 'has_archive' => true, 'rewrite' => array( 'slug' => 'gallery', 'with_front' => false ), ));
-
Добавление правила перезаписи:
Добавьте правило перезаписи, чтобы связать категорию, находящуюся в URL, с пользовательским типом записиgallery
:add_rewrite_rule('^gallery/category/(.+?)/?$', 'index.php?category_name=$matches[1]&is_gallery_cat=1', 'top');
-
Добавление переменной запроса:
Для обработки нового варианта URL необходимо добавить переменную запроса:add_filter('query_vars', 'add_custom_query_vars'); function add_custom_query_vars($vars) { $vars[] = 'is_gallery_cat'; return $vars; }
-
Изменение запроса на архиве категорий:
Чтобы содержимое архива категории корректно отображало записи определенного типа, добавьте следующий код:function set_category_archive_gallery_posts($query) { if (is_category() && isset($query->query_vars['is_gallery_cat'])) { $query->set('post_type', 'gallery'); } } add_action('pre_get_posts', 'set_category_archive_gallery_posts');
-
Замена ссылок на категории в галерее:
На странице архива галерей вам нужно правильно формировать ссылки на категории:$cats = get_the_category(); $co = ""; if (!empty($cats)) { foreach ($cats as $cat) { $link = get_category_link($cat->term_id); $link = str_replace("/blog/category", "/gallery/category", $link); $co .= "<a href=\"$link\">{$cat->name}</a>, "; } } echo rtrim($co, ", ");
Заключение:
С вышеописанными шагами вы сможете настроить работу так, чтобы URL для категорий пользовательского типа записи gallery
выглядели как /gallery/ceremonies/
, а для стандартных записей как /blog/category_name/
. Благодаря этому оба типа записей смогут использовать одни и те же категории, но отображать разные записи в зависимости от URL, что соответствует вашим требованиям.
Не забудьте после внесения изменений сбросить кэш постоянных ссылок, перейдя в Настройки -> Постоянные ссылки и просто нажав на кнопку «Сохранить изменения». Это обеспечит, что все новые правила перезаписи будут применены.