Вопрос или проблема
Сначала я думал, что схожу с ума, а потом, после дополнительной диагностики, оказалось, что это не так!
Я хотел создать страницу под названием 2017, но каждый раз, когда я создаю страницу, начинающуюся с цифры, WordPress добавляет в конце “-2”.
Я думал, что это связано с моей темой или с какими-то изображениями, которые уже имели такое же имя, поэтому я попробовал всевозможные странные числа, которые точно не использовал в других местах, и WordPress все равно добавляет “-2” в конце.
Тогда я решил: ладно, давайте отключим мою тему (включил стандартную тему WordPress) и плагины, чтобы изолировать проблему… проблема оставалась.
В корзине ничего нет, нет совпадающих названий постов или страниц (даже изображений)
Наконец, я подумал: дай-ка попробую это на другом сайте – другие изображения, другая тема, другие плагины, все другое… проблема осталась.
Так что теперь я думаю, что это проблема WordPress. Есть ли способ это исправить?
В основном, чтобы воспроизвести, попробуйте создать страницу, которая начинается с числа – это может быть 2005, 1999 или 2017 – единственное, что я заметил, это то, что она должна начинаться с числа.
Я что-то упустил?
В функции wp_unique_post_slug
выполняются проверки, чтобы “предотвратить создание новых слагов постов, которые могут привести к конфликту URL с архивами дат.” Вот соответствующий код с 3812 строки из wp-includes/post.php
// Предотвращение создания новых слагов постов, которые могут привести к конфликту URL с архивами дат.
$post = get_post( $post_ID );
$conflicts_with_date_archive = false;
if ( 'post' === $post_type && ( ! $post || $post->post_name !== $slug ) && preg_match( '/^[0-9]+$/', $slug ) && $slug_num = intval( $slug ) ) {
$permastructs = array_values( array_filter( explode( "https://wordpress.stackexchange.com/", get_option( 'permalink_structure' ) ) ) );
$postname_index = array_search( '%postname%', $permastructs );
/*
* Потенциальные конфликты с датами следующие:
*
* - Любое целое число в первой позиции permastruct может быть годом.
* - Целое число от 1 до 12, следующее за "годом", конфликтует с "monthnum".
* - Целое число от 1 до 31, следующее за "monthnum", конфликтует с "day".
*/
if ( 0 === $postname_index ||
( $postname_index && '%year%' === $permastructs[ $postname_index - 1 ] && 13 > $slug_num ) ||
( $postname_index && '%monthnum%' === $permastructs[ $postname_index - 1 ] && 32 > $slug_num )
) {
$conflicts_with_date_archive = true;
}
}
Большое спасибо за правильный код.
Ответ или решение
Проблема, которую вы описываете, связана с тем, как WordPress обрабатывает создаваемые вами "пост-слуги" (slugs) для страниц и постов. Когда вы создаете страницу с названием, начинающимся с числа, WordPress добавляет "-2" к окончанию, чтобы избежать конфликтов с путями к архивам дат. Это механизм, встроенный в платформу для предотвращения случаев, когда URL может пересекаться с записями архивов, которые могут содержать только цифры.
Согласно коду функции wp_unique_post_slug
, который вы уже нашли, система проверяет, не возникнет ли конфликт с архивами дат. Конфликт возникает, если "пост-слуга" (slug), который вы пытаетесь создать, представляет собой только цифры, которые могут потенциально соответствовать годам, месяцам или дням в URL-структуре, и, соответственно, это приводит к добавлению "-2" к названию.
Для решения данной проблемы вы можете рассмотреть следующие варианты:
-
Добавление префикса или суффикса к названию страницы: Например, вместо того чтобы называть страницу "2017", попробуйте "год-2017" или "2017-гид". Это позволит избежать конфликта с системой обработки дат в WordPress.
-
Изменение структуры постоянных ссылок (постоянных урлов): Если это возможно, вы можете попробовать изменить структуру постоянных ссылок в настройках WordPress, чтобы они не включали
%year%
,%monthnum%
и%day%
. Это может помочь устранить конфликты, но может повлиять на другие URL на вашем сайте. -
Использование плагина: Если вам нужно сохранить названия страниц, начинающиеся с цифр, вы можете поискать плагины, которые обеспечивают расширенные настройки управления URL и могут позволить вам создавать уникальные "пост-слуги" без конфликтов.
-
Изменение подхода к именованию: Возможно, стоит рассмотреть возможность использования названий, которые содержат буквы и числа, чтобы избежать проблем с конфликтами.
-
Открытие запроса в поддержку WordPress: Если это критично для вашего сайта, вы также можете обратиться к сообществу WordPress или открыть запрос на исправление в официальную поддержку, чтобы узнать, можно ли изменить это поведение на уровне кода WordPress.
Надеюсь, это поможет тебе разобраться с проблемой! Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.