- Вопрос или проблема
- Ответ или решение
- Структура постоянных ссылок для пользовательского типа записи в WordPress
- 1. Регистрация пользовательского типа записи
- 2. Настройка пермалинов
- 3. Использование функции post_type_link
- 4. Регистрация правил перенаправления с помощью add_rewrite_rule
- 5. Проверка и отладка
- Заключение
Вопрос или проблема
Мне нужна помощь в структурировании постоянной ссылки для пользовательского типа записи, который я создал. Я думаю, что попробовал все возможные ответы здесь. Надеюсь, кто-то сможет мне помочь.
Дополнительная информация
Пользовательский пост выглядит так в моем URL www.domain.com/oa/beauty/post-name
, но я хочу, чтобы он выглядел так www.domain.com/beauty/post-name/
. beauty
– это пример названия категории.
Структура пользовательской постоянной ссылки в настройках установлена как /%category%/%postname%/
, и я хотел бы, чтобы постоянные ссылки для моих пользовательских постов имели тот же формат. Если категория пользовательских постов – health
, то ее постоянная ссылка будет localhost/health/post-title
. Я использовал фильтр post_type_link
, чтобы изменить постоянную ссылку.
В моем пользовательском типе записи я пытался переименовать URL и затем сохранить его, но когда я захожу по нему, постоянная ссылка (URL) ведет на 404. Даже после повторного сохранения постоянной ссылки в настройках проблема все еще существует.
Вот как я настроил и зарегистрировал пользовательский пост (на случай, если я установил неправильные аргументы)
$args = array(
'labels' => $labels,
'public' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_icon' => 'dashicons-star-filled',
'query_var' => true,
'rewrite' => array('slug' => 'oa', 'with_front' => false),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 1,
'supports' => array('title', 'thumbnail', 'comments'),
'taxonomies' => array('category', 'post_tag'),
'show_in_rest' => true,
'rest_base' => 'oa-api',
'rest_controller_class' => 'WP_REST_Posts_Controller',
);
Судя по моим исследованиям, похоже, мне следует использовать метод add_rewrite_rule
. Но я не понимаю, как работает переписывание. Это правильное направление или я упускаю что-то еще?
Я хотел бы решить это программно, а не с помощью плагина.
Я не могу оставить комментарий, поэтому публикую это как “Ответ”.
Простой поиск приведет вас к десяткам вопросов об этом на самом StackOverflow, один из которых следующий.
Добавить базу категории в URL в пользовательском типе записи/таксономии
Предполагая, что вы пытаетесь получить слаг термина таксономии в URL.
Извините, я не могу прокомментировать, но хочу прояснить что-то о пользовательских типах записей. Это не полный ответ, поэтому, пожалуйста, отредактируйте, если я ошибаюсь.
В WordPress есть свой собственный пост, который является стандартным постом. Его можно найти здесь
А у WooCommerce есть свой собственный пользовательский тип записи, который называется продуктом. Его можно найти здесь, если вы скачаете плагин WooCommerce
Таким образом, каждый продвинутый пользовательский тип записи имеет свои собственные категории и метки, как вы можете видеть на изображениях. Вы проверяли, есть ли у вас тот же тип меню, что и ваша собственная категория в вашей кастомной записи? Потому что если у вашего пользовательского типа записи нет собственного меню категорий и меток, будет сложно получить категорию, которую вы хотите из стандартного поста WordPress. Это похоже на то, как будто вы берете категорию из другого типа записи или из стандартного типа записи.
В прошлом я делал это с помощью https://developer.wordpress.org/reference/functions/add_rewrite_rule/
Лучшее решение с помощью простого регулярного выражения может прочитать и обнаружить все параметры в вашем URL и переписать их, чтобы показать правильный пост.
Ответ или решение
Структура постоянных ссылок для пользовательского типа записи в WordPress
Для правильной настройки постоянных ссылок (пермалиов) для пользовательского типа записи в WordPress необходимо учитывать несколько ключевых моментов, включая регистрацию самого типа записи, настройки параметров пермалинов и возможности обработки запросов. В данной статье я постараюсь подробно разобрать каждый из аспектов, чтобы вы могли легко достичь желаемого результата.
1. Регистрация пользовательского типа записи
Для начала убедитесь, что вы правильно регистрируете пользовательский тип записи (Custom Post Type, CPT) с нужными параметрами. В вашем случае вы хотите, чтобы структура URL была такой, как www.domain.com/beauty/post-name/
, где beauty
является категорией.
Следующий код демонстрирует правильную регистрацию:
function register_custom_post_type() {
$args = array(
'labels' => $labels,
'public' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_icon' => 'dashicons-star-filled',
'query_var' => true,
'rewrite' => array('slug' => '', 'with_front' => false),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 1,
'supports' => array('title', 'thumbnail', 'comments'),
'taxonomies' => array('category', 'post_tag'),
'show_in_rest' => true,
'rest_base' => 'oa-api',
);
register_post_type('your_custom_post_type', $args);
}
add_action('init', 'register_custom_post_type');
2. Настройка пермалинов
Обратите внимание, что параметр rewrite
в данном примере настроен так, чтобы не включать базу типа записи в URL. Это важно, чтобы ваш пользовательский тип записи использовал напрямую название категории в качестве части URL.
3. Использование функции post_type_link
Если вам нужно дополнительно обработать структуру пермалинов, вы можете использовать фильтр post_type_link
:
function custom_post_type_permalink($post_link, $id = 0) {
$post = get_post($id);
if ($post->post_type == 'your_custom_post_type') {
// Получаем категории поста
$terms = get_the_terms($post->ID, 'category');
if ($terms) {
$term_slug = array_pop($terms)->slug;
$post_link = str_replace('%category%', $term_slug, $post_link);
}
}
return $post_link;
}
add_filter('post_type_link', 'custom_post_type_permalink', 10, 2);
4. Регистрация правил перенаправления с помощью add_rewrite_rule
Если вы столкнулись с 404 ошибками, важно убедиться, что ваши URL перенаправляются правильно. Для этого можно использовать add_rewrite_rule
. Пример кода для добавления пользовательского правила:
function custom_rewrite_rule() {
add_rewrite_rule(
'^([^/]+)/([^/]+)/?$',
'index.php?your_custom_post_type=$matches[2]',
'top'
);
}
add_action('init', 'custom_rewrite_rule');
Не забудьте обновить или сбросить правила пермалинов в настройках WordPress (нажав на кнопку "Сохранить изменения" в разделе Настройки → Постоянные ссылки), чтобы убедиться, что ваши изменения вступили в силу.
5. Проверка и отладка
После выполнения всех шагов, убедитесь, что ваши новые URL работают правильно. Если возникают проблемы, рекомендуется включить режим отладки в WordPress и проверить возможные конфликты с другими плагинами или темами.
Заключение
Следуя указанным шагам и внимательно настраивая параметры пермалинов и регистрацию постов, вы сможете эффективно изменить структуру URL для пользовательских типов записей в WordPress. Не забывайте проверять документацию по каждой используемой функции и обновлять правила пермалинов при внесении изменений.