Вопрос или проблема
У меня есть пользовательский тип записи под названием “оборудование”. Я хотел бы, чтобы структура постоянной ссылки была следующей:
example.com/equipment/%post_id%-slug
Я специально хочу использовать дефис, а не косую черту (т.е. – “id-slug”, а не “id/slug”). Каждое возможное решение, которое я нашел в интернете, использовало косые черты, и я просто не могу заставить это работать с дефисом.
Я также хочу предотвратить добавление WordPress дополнительного номера, если есть две записи с одинаковым заголовком. Пример:
example.com/equipment/45-awesomeness
и
example.com/equipment/46-awesomeness-2
Я думаю, что решение состоит в использовании add_rewrite_rule, но я немного запутался с регулярными выражениями.
Следующий код работал, чтобы заменить имя записи на id в слаг:
function equipment_links($post_link, $post = 0) {
if($post->post_type === 'equipment') {
return home_url('equipment/' . $post->ID . '');
}
else{
return $post_link;
}
}
add_filter('post_type_link', 'equipment_links', 1, 3);
function equipment_rewrites_init(){
add_rewrite_rule('equipment/([0-9]+)?$', 'index.php?post_type=equipment&p=$matches[1]', 'top');
}
add_action('init', 'equipment_rewrites_init');
Это вернуло URL “example.com/equipment/123”, но я хотел бы добавить “-post_name” в конец этого “123”.
У меня не так много опыта с переписыванием кода, но разве нельзя просто добавить $post->post_name
в ваше выражение возврата?
return home_url('equipment/' . $post->ID . '-' . $post->post_name );
Есть и другие способы изменить постоянные ссылки, которые я использовал и которые могут вам помочь:
- Самый простой способ изменить структуру постоянной ссылки, вероятно, состоит в использовании пользовательской структуры, перейдя в меню администратора, настройки > постоянные ссылки. Выберите пользовательскую структуру и установите ее на
/%post_id%-%postname%/
- Если вы хотите изменить структуру постоянной ссылки для конкретного типа записи, не трогая никакой код или другой тип записи, я бы посоветовал скачать плагин, такой как “Постоянные ссылки для пользовательских типов записей” или “Простые постоянные ссылки для типов записей”, оба от Toro_Unit.
Что касается уникального идентификатора, который вы хотите убрать в конце… У меня нет на это ответа. Однако, если вы готовы использовать переписывание .htaccess вместо php, вы можете попробовать вот это:
https://stackoverflow.com/questions/14635438/remove-trailing-number-from-url-via-htaccess
Чтобы получить результат для структуры постоянной ссылки для вашего пользовательского типа записи “оборудование” и предотвратить добавление WordPress номера к слагу, если есть записи с одинаковым заголовком, вы можете использовать фильтр post_type_link
и настроить процесс генерации постоянной ссылки.
Добавьте код в файл вашей темы functions.php
или в пользовательский плагин
// Измените структуру постоянной ссылки для пользовательского типа записи "оборудование"
function custom_equipment_permalink($permalink, $post) {
// Убедитесь, что это наш пользовательский тип записи
if ('equipment' === $post->post_type) {
// Получите ID записи
$post_id = $post->ID;
// Получите имя записи (слаг)
$post_slug = $post->post_name;
// Составьте постоянную ссылку с желаемым форматом
$new_permalink = home_url("/equipment/{$post_id}-{$post_slug}");
return $new_permalink;
}
return $permalink;
}
add_filter('post_type_link', 'custom_equipment_permalink', 10, 2);
// Предотвратите добавление WordPress номера к слагу, если есть записи с одинаковым заголовком
function prevent_duplicate_post_slugs($slug, $post_ID, $post_status, $post_type) {
// Убедитесь, что это наш пользовательский тип записи
if ('equipment' === $post_type) {
global $wpdb;
// Получите количество записей с одинаковым слагом
$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
$post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_type, $post_ID));
// Если есть записи с одинаковым слагом, добавьте номер, чтобы сделать его уникальным
if ($post_name_check || -1 !== intval(get_page_by_path($slug, OBJECT, $post_type))) {
$suffix = 2;
do {
$alt_post_name = $slug . '-' . $suffix;
$post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_type, $post_ID));
$suffix++;
} while ($post_name_check);
return $alt_post_name;
}
}
return $slug;
}
add_filter('wp_unique_post_slug', 'prevent_duplicate_post_slugs', 10, 4);
Ответ или решение
Как добавить %post_id% к слагу пользовательского типа записи и предотвратить уникальность слага в WordPress
Если вы работаете с пользовательским типом записи в WordPress, таким как "оборудование", и хотите изменить структуру URL так, чтобы она выглядела как:
example.com/equipment/%post_id%-slug
где %post_id%
— это ID поста, а slug
— это его название, вам необходимо провести несколько настроек. В этой инструкции мы обсудим, как добиться желаемого результата и избежать добавления уникальных индикаторов к слагу в случае совпадения названий записям.
Шаг 1: Изменение структуры permalink
Прежде всего, вам необходимо отредактировать формат permalink для вашего пользовательского типа записи. Добавьте следующий код в файл functions.php
вашей темы или в плагин:
// Изменяем структуру permalink для пользовательского типа записи "оборудование"
function custom_equipment_permalink($permalink, $post) {
if ('equipment' === $post->post_type) {
$post_id = $post->ID;
$post_slug = $post->post_name;
$new_permalink = home_url("/equipment/{$post_id}-{$post_slug}");
return $new_permalink;
}
return $permalink;
}
add_filter('post_type_link', 'custom_equipment_permalink', 10, 2);
Этот код проверяет, является ли тип записи "оборудование", и формирует новый permalink в нужном вам формате, комбинируя ID поста и его название.
Шаг 2: Настройка переработки правил
Следующий шаг — это добавление правила переработки, чтобы WordPress мог распознать ваш новый формат URL. Этот код также нужно добавить в functions.php
:
function equipment_rewrites_init() {
add_rewrite_rule('^equipment/([0-9]+)-([a-zA-Z0-9-]+)/?$', 'index.php?post_type=equipment&name=$matches[2]&p=$matches[1]', 'top');
}
add_action('init', 'equipment_rewrites_init');
Здесь мы используем add_rewrite_rule
, чтобы сообщить WordPress, как обрабатывать новые URL. Это правило обозначает, что любой URL вида example.com/equipment/123-awesomeness
должен быть связан с постом с ID 123 и слагом "awesomeness".
Шаг 3: Избежание дублирующихся слагов
Чтобы избежать добавления к постам уникальных индикаторов (например, -2
, -3
), если есть несколько постов с одинаковым названием, вам нужно использовать следующий код:
function prevent_duplicate_post_slugs($slug, $post_ID, $post_status, $post_type) {
if ('equipment' === $post_type) {
global $wpdb;
// Проверяем наличие дублирующего слага
$post_name_check = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1", $slug, $post_type, $post_ID));
if ($post_name_check) {
return $slug; // Возвращаем исходный слаг, чтобы избежать добавления уникального индикатора
}
}
return $slug;
}
add_filter('wp_unique_post_slug', 'prevent_duplicate_post_slugs', 10, 4);
Заключение
С применением вышеуказанных настроек вы сможете добиться желаемого формата URL example.com/equipment/%post_id%-slug
, а также предотвратить добавление уникальных индикаторов для слагов. После внесения изменений не забудьте обновить настройки перезаписи в WordPress, сделав это в разделе "Настройки" -> "Постоянные ссылки". Это важный шаг для корректного функционирования новых правил.
Эти изменения обеспечат удобство для пользователей и улучшат визуальное восприятие вашего сайта, позволяя более точно определять содержимое по URL.