- Вопрос или проблема
- ОБНОВЛЕНИЕ
- ОБНОВЛЕНИЕ 2
- Ответ или решение
- Генерация Заголовка Поста и Постоянной Ссылки на Основе Пользовательского Параметра и Даты Поста
- Структура Постоянной Ссылки
- Проблема с Уникальностью Постоянной Ссылки
- Решение: Автоматическое Генерирование Заголовка и Постоянной Ссылки
- Объяснение Кода
- Заключение
Вопрос или проблема
У меня есть пользовательский тип записи со следующей структурой постоянной ссылки
/%match_season%/%match_team%/%postname%-%year%-%monthnum%-%day%/
%match_season% и %match_team% являются таксономиями.
Тип записи содержит предстоящие матчи и прошедшие матчи, заголовок поста установлен как имя соперника, что дает мне хорошую структуру URL. Однако, поскольку имена команд одинаковы в каждом сезоне, я замечаю, что WordPress добавляет -2 к %postname% в постоянной ссылке.
Я понимаю причины, по которым WordPress добавляет число в конец постоянной ссылки, если уже существует страница / пост с таким же слагом, но в моем случае он не учитывает уникальную дату, которая также является частью URL.
Я попытался изменить структуру на
/%match_season%/%match_team%/%year%-%monthnum%-%day%-%postname%/
Но происходит то же самое.
Существует ли способ избежать этого? Любая помощь будет оценена.
ОБНОВЛЕНИЕ
Я провел дополнительные исследования и наткнулся на этот пост о wp_insert_post_data, который косвенно привел меня к этому посту о save_post. Теперь у меня есть следующая функция
function change_title( $post_id ) {
// Установить переменные
$opposition = get_field( 'opposition', $post_id );
$match_date_url = get_the_date( 'Y-m-d', $post_id );
$match_date_title = get_the_date( 'd/m/y', $post_id );
// Создать заголовок поста и постоянную ссылку
$post_title = $opposition . ' v Team - ' . $match_date_title;
$post_name = $opposition . ' v Team - ' . $match_date_url;
// Отключить эту функцию, чтобы она не зацикливалась бесконечно
remove_action( 'save_post_matches', 'change_title', 10, 3 );
// обновить пост, который вызывает save_post снова
wp_update_post( array(
'ID' => $post_id,
'post_title' => $post_title,
'post_name' => $post_name,
)
);
// восстановить эту функцию
add_action( 'save_post_matches', 'change_title', 10, 3 );
}
add_action( 'save_post_matches', 'change_title', 10, 3 );
Что практически то, что мне нужно.
Если это новый пост, настраиваемое поле не добавляется в заголовок или слаг, но остальная часть добавляется. Если пост существует, при обновлении заголовок и слаг обновляются правильно.
Есть ли что-то очевидное, что я упускаю? Снова любая помощь будет оценена.
ОБНОВЛЕНИЕ 2
Я думаю, что нашел решение. Поскольку приведенный выше код не добавлял пользовательский тип поста ACF, я начал поиск вокруг этого и нашел acf/save_post
Таким образом, код, который у меня сейчас, который, похоже, работает как для новых постов, так и для обновлений постов, выглядит следующим образом:
function create_title( $post_id ) {
// Установить переменные
$opposition = get_field( 'opposition', $post_id );
$match_date_url = get_the_date( 'Y-m-d', $post_id );
$match_date_title = get_the_date( 'd/m/y', $post_id );
// Установить заголовок поста и постоянную ссылку
$post_title = $opposition . ' v Team - ' . $match_date_title;
$post_name = $opposition . ' v Team - ' . $match_date_url;
// обновить пост, который вызывает save_post снова
wp_update_post( array(
'ID' => $post_id,
'post_title' => $post_title,
'post_name' => $post_name,
)
);
}
add_action( 'acf/save_post', 'create_title', 20 );
Надеюсь, это поможет кому-то другому.
Это структура, а не уникальный слаг поста или категории. И это не имеет ничего общего с URL. Вы можете добавить пост с тем же слагом, если есть разные post_type/страницы/посты.
Ответ или решение
Генерация Заголовка Поста и Постоянной Ссылки на Основе Пользовательского Параметра и Даты Поста
В данном ответе мы рассматриваем, как автоматизировать процесс создания заголовков и постоянных ссылок для пользовательских типов записей в WordPress, основываясь на пользовательских полях и дате создания поста. Данная задача может быть полезной для упрощения управления содержимым и улучшения структуры URL.
Структура Постоянной Ссылки
На первом этапе необходимо определить структуру постоянной ссылки, которая будет использоваться для вашего пользовательского типа записей. В этом случае она выглядит следующим образом:
/%match_season%/%match_team%/%postname%-%year%-%monthnum%-%day%/
Здесь:
%match_season%
и%match_team%
— таксономии, которые представляют собой уникальные атрибуты для каждого матча.%postname%
— это название поста, генерируемое автоматически или заданное вручную.-%year%-%monthnum%-%day%
— добавляет дату, что крайне важно для уникальности ссылок на матчи.
Проблема с Уникальностью Постоянной Ссылки
Ваша основная проблема заключается в том, что WordPress автоматически добавляет -2
, если обнаруживает дубликат слуга. Это может происходить из-за того, что заголовок поста (или его «slug») не учитывает дату, даже если она является частью структуры постоянной ссылки. Это приводит к конфликтам, особенно если одноименные посты существуют в разных годах или на разных этапах.
Решение: Автоматическое Генерирование Заголовка и Постоянной Ссылки
Использование хуков save_post
и acf/save_post
позволяет установить заголовок и формировать постоянную ссылку при создании или обновлении поста. Вот пример кода, который вы можете использовать для этой цели:
function create_title( $post_id ) {
if (get_post_type($post_id) != 'matches') {
return; // Убедитесь, что это нужный тип поста
}
// Получаем оппозицию и дату
$opposition = get_field('opposition', $post_id);
$match_date_url = get_the_date('Y-m-d', $post_id);
$match_date_title = get_the_date('d/m/y', $post_id);
// Формируем заголовок и slug поста
$post_title = $opposition . ' v Team - ' . $match_date_title;
$post_name = sanitize_title($opposition . ' v Team - ' . $match_date_url);
// Обновляем пост, чтобы избежать бесконечного цикла
remove_action('acf/save_post', 'create_title', 20);
wp_update_post(array(
'ID' => $post_id,
'post_title' => $post_title,
'post_name' => $post_name,
));
add_action('acf/save_post', 'create_title', 20);
}
add_action('acf/save_post', 'create_title', 20);
Объяснение Кода
- Проверка Типа Поста: Убедитесь, что функция работает только для нужного типа поста (
matches
), чтобы не затрагивать другие типы записей. - Получение Значений: Используйте
get_field()
для получения значений пользовательского поля, иget_the_date()
для получения даты создания поста. - Формирование Заголовка и Слога: Генерируйте заголовок и слаг поста, добавляя необходимые элементы. Использование
sanitize_title()
обеспечивает корректное форматирование слага. - Обновление Поста: Используя
wp_update_post()
, обновляйте пост с новыми значениями, избегая бесконечных циклов с помощью временного удаления хука.
Заключение
Данная реализация позволяет легко генерировать заголовки и постоянные ссылки для матчей, избегая дубликатов. Это улучшает читабельность URL и упрощает поиск информации в будущем. Следуя этому решению, вы можете оптимизировать управление постами в WordPress, сохраняя уникальность каждой записи.