Вопрос или проблема
Я изучал таксономии, пользовательские записи и т. д., через много проб и ошибок. Наконец, я настроил все так, как хотел, однако теперь я сталкиваюсь с конфликтом желаемых слагов. Я не могу назвать свою категорию “venue”, потому что где-то в базе данных это уже занято (я предполагаю) – даже несмотря на то, что я удалил категорию, использовавшую его. Теперь, когда я пытаюсь добавить категорию, которую хочу использовать с слагом “venue”, WP автоматически называет ее “venue-2”, что я определенно не хочу видеть в своем URL в качестве папки. Какие-нибудь предложения по этому поводу?
Это также может быть вызвано загрузкой изображений с теми же именами файлов, что и записи/страницы. В моем случае я загрузил изображение под названием ‘careers.jpg’ до того, как создал страницу под названием ‘Careers’, и страница получала суффикс ‘-2’. Чтобы исправить это, я просто изменил слаг на изображении, и затем я смог изменить слаг на странице.
Слаг хранится в колонке post_name
вашей таблицы posts
. Я бы порекомендовал сначала проверить эту таблицу перед тем, как вручную назначать этот слаг.
Есть еще одна причина, по которой WordPress добавляет -2
в конце: когда слаг содержит только цифры. Это не допускается.
Пример: я хотел назвать свою страницу 2016
, и даже несмотря на то, что в базе данных никогда не было 2016, слаг всегда превращался в 2016-2
. Насколько я помню, это связано с тем, что цифры имеют специальное значение для WordPress (переменные пути), и их нельзя отличить.
Поэтому моим решением было вручную переименовать слаг в year-2016
, что выглядит лучше, чем этот суффикс “-2”.
Обычно, когда WordPress добавляет “-2” к слагу, это означает, что у вас все еще есть старое содержимое, которое вы собирались удалить, в корзине. Убедитесь, что вы очистили свою корзину WordPress, а затем попробуйте снова сделать слаг.
Чтобы получить доступ к страницам в корзине, откройте меню Страницы / Все страницы, затем нажмите на раздел “Корзина”, который появляется справа от раздела “Все”. Обратите внимание, что если в корзине нет предметов, этот раздел не появится.
Мне удалось это сделать. Я использовал числовые слаги для пользовательских типов записей (CPT), но они автоматически получали суффикс -2. Например, example/test/2 преобразовывался в example/test/2-2. После некоторых исследований и тестирования мне удалось решить эту проблему, сохранив внимание к SEO. Вот решение, которое я реализовал:
Решение
Вот код, который я использовал для обработки числовых слагов в пользовательских типах записей без добавления суффикса -2:
function create_example_cpt() {
$labels = array(
'name' => 'Пример',
'singular_name' => 'Пример',
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый элемент',
'edit_item' => 'Редактировать элемент',
'new_item' => 'Новый элемент',
'all_items' => 'Все элементы',
'view_item' => 'Просмотреть элемент',
'search_items' => 'Поиск элементов',
'not_found' => 'Элементы не найдены',
'not_found_in_trash' => 'Элементы не найдены в корзине',
'parent_item_colon' => 'Родительский элемент:',
'menu_name' => 'Пример'
);
$args = array(
'labels' => $labels,
'public' => true,
'hierarchical' => true,
'supports' => array('title', 'editor', 'page-attributes'),
'rewrite' => array(
'slug' => 'example',
'with_front' => false,
'hierarchical' => true
),
'has_archive' => true,
'menu_position' => 5,
'show_in_rest' => true,
);
register_post_type('example', $args);
}
add_action('init', 'create_example_cpt');
function custom_unique_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
global $wpdb;
// Проверяем только CPT 'example' и числовые слаги
if ( 'example' != $post_type || ! is_numeric( $original_slug ) || $slug === $original_slug ) {
return $slug;
}
// Ищем существующие слаги, чтобы избежать конфликтов
$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 AND post_parent = %d LIMIT 1",
$original_slug, $post_type, $post_ID, $post_parent
) );
// Если конфликтов нет, возвращаем оригинальный слаг
if ( ! $post_name_check ) {
return $original_slug;
}
// В противном случае возвращаем слаг с суффиксом
return $slug;
}
add_filter( 'wp_unique_post_slug', 'custom_unique_slug', 10, 6 );
function custom_rewrite_rules($rules) {
$new_rules = array(
'example/([^/]+)/([^/]+)/?$' => 'index.php?post_type=example&name=$matches[2]',
'example/([^/]+)/?$' => 'index.php?post_type=example&name=$matches[1]',
);
return $new_rules + $rules;
}
add_filter('rewrite_rules_array', 'custom_rewrite_rules');
Объяснение
- create_example_cpt: Регистрирует пользовательский тип записи с поддержкой иерархии.
Настройте эту функцию в соответствии с вашими конкретными потребностями. - custom_unique_slug: Обеспечивает сохранение числовых слагов без суффикса, если конфликты не обнаружены.
- custom_rewrite_rules: Добавляет пользовательские правила перезаписи для поддержки желаемой структуры URL.
Заметки
- Убедитесь, что вы обновили свои постоянные ссылки после добавления этого кода, чтобы новые правила перезаписи были применены.
С этим решением мои дочерние CPT не будут получать суффикс example/test/2-2, а будут сохраняться как example/test/2/. Они также будут правильно работать и отображаться, как и ожидалось, в картах сайта.
.
Ответ или решение
Вопрос о том, почему WordPress добавляет «-2» к концу вашего слога, является довольно распространенной темой среди пользователей, которые работают с таксономиями и пользовательскими типами записей. Давайте рассмотрим основные причины этого поведения, а также способы устранения проблемы и удаления старых слогов из базы данных.
Причины добавления «-2» к слогу
-
Конфликт с существующими слогами: WordPress автоматически добавляет «-2», когда вы пытаетесь создать новый слог, который уже существует в базе данных. Это может происходить из-за ранее удаленных записей, которые все еще находятся в корзине, или из-за того, что вы уже имеете другую запись, использующую тот же слог.
-
Слоги, состоящие только из чисел: WordPress обрабатывает слоги, состоящие только из чисел, иначе. Например, если вы пытаетесь создать страницу с названием «2016», WordPress добавит «-2» к концу, даже если такой слог никогда не существовал. Это связано с тем, что числовые слоги могут вызывать конфликты с другими функциями системы.
-
Загруженные медиафайлы с тем же именем: Если вы загрузили изображение с тем же именем, что у страницы или категории, WordPress также добавит «-2» к слогу страницы или категории, чтобы избежать конфликта.
Где хранятся оригиналы слогов
Слоги в WordPress хранятся в столбце post_name
таблицы posts
базы данных. Чтобы устранить проблемы с конфликтующими слогами, вам следует выполнить следующие действия.
Шаги для удаления старых слогов
-
Проверка корзины WordPress:
- Перейдите в меню «Страницы» → «Все страницы» и проверьте, есть ли какие-либо записи в корзине. Если записи присутствуют, очистите корзину, чтобы удалить их навсегда. Это можно сделать, нажав на вкладку «Корзина» и выбрав пункт «Очистить корзину».
-
Поиск в базе данных:
- Для поиска существующих слогов вы можете использовать инструмент phpMyAdmin или любой другой интерфейс для работы с вашей базой данных. Выполните следующий SQL-запрос:
SELECT * FROM wp_posts WHERE post_name = 'venue';
- Это позволит вам узнать, имеются ли записи с таким слогом, и вы сможете их удалить, если они вам не нужны.
- Для поиска существующих слогов вы можете использовать инструмент phpMyAdmin или любой другой интерфейс для работы с вашей базой данных. Выполните следующий SQL-запрос:
-
Удаление старых записей:
- Если вы нашли старые записи с конфликтующими слогами, вы можете удалить их с помощью SQL-запроса:
DELETE FROM wp_posts WHERE post_name = 'venue';
- Будьте осторожны при выполнении подобных запросов, так как это приведет к потере данных.
- Если вы нашли старые записи с конфликтующими слогами, вы можете удалить их с помощью SQL-запроса:
-
Обновление постоянных ссылок:
- После удаления конфликтных слогов вам следует обновить постоянные ссылки. Это можно сделать, зайдя в меню «Настройки» → «Постоянные ссылки» и просто нажав кнопку «Сохранить изменения». Это перезапустит правила перезаписи и уберет недействительные ссылки.
Решение по работе с числовыми слогами
Если вы используете числовые слоги и хотите избежать добавления «-2», вы можете использовать следующий код в вашем файле functions.php
вашей темы:
function custom_unique_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
global $wpdb;
if ('example' != $post_type || !is_numeric($original_slug) || $slug === $original_slug) {
return $slug;
}
$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 AND post_parent = %d LIMIT 1",
$original_slug, $post_type, $post_ID, $post_parent
));
if (!$post_name_check) {
return $original_slug;
}
return $slug;
}
add_filter('wp_unique_post_slug', 'custom_unique_slug', 10, 6);
Заключение
Решение проблемы с добавлением «-2» к слогам в WordPress лежит в понимании причин конфликта, проверке существующих записей и правильном управлении слогами. Следуя описанным шагам, вы сможете успешно очистить базу данных от конфликтующих слогов и избежать их повторного появления в будущем. Не забудьте регулярно проверять свою базу данных и корзину, чтобы поддерживать порядок и улучшать SEO вашего сайта.