Вопрос или проблема
Я переименовал тип записи по умолчанию на своем сайте в «Статьи» с помощью следующей функции:
// Заменить название записей на Статьи в административной панели
function change_post_menu_label() {
global $menu;
global $submenu;
$menu[5][0] = 'Статьи';
$submenu['edit.php'][5][0] = 'Статьи';
$submenu['edit.php'][10][0] = 'Добавить статьи';
echo '';
}
function change_post_object_label() {
global $wp_post_types;
$labels = &$wp_post_types['post']->labels;
$labels->name="Статьи";
$labels->singular_name="Статья";
$labels->add_new = 'Добавить статью';
$labels->add_new_item = 'Добавить статью';
$labels->edit_item = 'Редактировать статью';
$labels->new_item = 'Статья';
$labels->view_item = 'Просмотреть статью';
$labels->search_items="Искать статьи";
$labels->not_found = 'Статьи не найдены';
$labels->not_found_in_trash="Статьи не найдены в Корзине";
$labels->name_admin_bar="Добавить статью";
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );
Я добавил /articles/
в свою структуру постоянных ссылок в разделе Администратор -> Настройки -> Постоянные ссылки, так что сейчас это выглядит как /articles/%postname%/
. Поля ‘база категории’ и ‘база тегов’ пустые.
Налогономии по умолчанию для категорий и тегов применяются только к типу записи articles
.
Все CPT объявлены с 'rewrite' => array( 'with_front' => false )
.
На моем сайте также есть несколько CPT (Истории, Прогулки, Кино) и несколько пользовательских таксономий (Район, Область и т.д.), которые были применены только к типу записи ‘Кино’.
Я зарегистрировал свойство rewrite
для пользовательских таксономий, используя этот код:
$rewrite = isset( $taxonomy['rewrite'] ) ? $taxonomy['rewrite'] : array( 'slug' => $taxonomy['slug'] );
$hierarchical = isset( $taxonomy['hierarchical'] ) ? $taxonomy['hierarchical'] : true;
register_taxonomy( $taxonomy['slug'], $taxonomy['post_type'], array(
'hierarchical' => $hierarchical,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => $rewrite,
));
Текущий результат/статус:
- Все URL-адреса записей (включая записи по умолчанию) корректны:
/[post-type]/[post-title]
- URL-адреса архивов по умолчанию для тегов и категорий корректны:
/articles/tag/[term]
//articles/category/[term]
- URL-адреса архивов пользовательской таксономии CPT неверные:
/articles/[taxonomy]/[term]/
(не должны включать ‘/articles’) - URL-адреса
get_category_link()
также неверны. Используя следующий код, я получаю/articles/[term]
, но фактический URL включает ‘/category’ после ‘/articles’:
$cats = get_the_category();
foreach($cats as $cat):
echo '<li><a href="'. get_category_link($cat->cat_ID) .'">';
echo $cat->name;
echo '</a></li>';
endforeach;
Желаемый результат/статус:
- Все одиночные записи CPT и URL-адреса архивов пользовательских таксономий не должны включать
/articles/
? - Все одиночные записи по умолчанию и URL-адреса пользовательских таксономий сохраняют
/articles/
? get_category_link()
выводит правильный URL для показа архива и не выдает ошибку 404?
Заранее благодарю за любые советы по достижению этого.
Ответ или решение
Для корректного редактирования структуры постоянных ссылок для как стандартных, так и пользовательских постов и таксономий в WordPress, необходимо учитывать несколько ключевых моментов в вашем текущем коде и настройках.
1. Изменение структуры постоянных ссылок
Вы уже установили структуру постоянных ссылок для постов с использованием префикса /articles/
и это влияет на стандартный тип постов. Для достижения желаемого результата вам нужно будет также изменить настройки для пользовательских типов постов и таксономий.
2. Настройка пользовательских типов постов
Поскольку у вас есть несколько пользовательских типов постов (CPT), таких как Stories, Walks и Cinemas, вам нужно убедиться, что их маршруты не включают /articles/
. Это можно сделать, установив параметр rewrite
для ваших CPT следующим образом:
register_post_type('cinema', array(
'labels' => $cinema_labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'cinemas', 'with_front' => false),
));
Здесь мы задаем slug
, который соответствует вашему желаемому пути. Убедитесь, что каждый CPT настроен аналогичным образом.
3. Настройка пользовательских таксономий
Для пользовательских таксономий, связанных с постами типа Cinema, вы можете настраивать их без префикса articles
. Для этого ваш код для регистрации таксономий должен выглядеть так:
register_taxonomy('borough', 'cinema', array(
'hierarchical' => true,
'labels' => $borough_labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array('slug' => 'borough', 'with_front' => false),
));
Убедитесь, что 'with_front' => false
указан для всех ваших кастомных таксономий. Это позволит избежать добавления /articles/
в URL таксономий.
4. Настройка ссылок на категории
Для получения правильных ссылок на категории, вы можете использовать функцию get_category_link()
и убедиться, что ваши настройки не конфликтуют с вашими изменениями. Например, если вы хотите получить ссылку без /articles/
, вам нужно переопределить настройки категорий так:
function custom_get_category_link($term_id) {
$category_link = get_category_link($term_id);
return str_replace('/articles/category/', '/category/', $category_link);
}
Теперь вы можете использовать custom_get_category_link()
в ваших шаблонах, чтобы избежать ошибки 404 на старых категориях.
5. Применение изменений
После внесения всех изменений убедитесь, что вы обновили ссылки постоянных ссылок в админ-панели WordPress (Настройки -> Постоянные ссылки) для применения изменений к URL-структуре. Это обычно требует «сохранения» текущих настроек.
6. Проверка работоспособности
Наконец, важно протестировать все URL-адреса, чтобы убедиться, что они работают так, как ожидается:
- Для стандартных статей:
/articles/[post-title]
- Для категорий:
/articles/category/[term]
- Для CPT:
/cinemas/[post-title]
и/borough/[term]
Проверьте каждую ссылку, чтобы убедиться, что нет 404 ошибок и что все окончательные URL соответствуют вашим ожиданиям.
Следуя этим шагам и указаниям, вы сможете скорректировать структуру постоянных ссылок для стандартных и пользовательских постов, а также для таксономий в соответствии с вашими требованиями.