Сгенерировать заголовок поста и постоянную ссылку из пользовательского поля и даты поста

Вопрос или проблема

У меня есть пользовательский тип записи со следующей структурой постоянной ссылки

/%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);

Объяснение Кода

  1. Проверка Типа Поста: Убедитесь, что функция работает только для нужного типа поста (matches), чтобы не затрагивать другие типы записей.
  2. Получение Значений: Используйте get_field() для получения значений пользовательского поля, и get_the_date() для получения даты создания поста.
  3. Формирование Заголовка и Слога: Генерируйте заголовок и слаг поста, добавляя необходимые элементы. Использование sanitize_title() обеспечивает корректное форматирование слага.
  4. Обновление Поста: Используя wp_update_post(), обновляйте пост с новыми значениями, избегая бесконечных циклов с помощью временного удаления хука.

Заключение

Данная реализация позволяет легко генерировать заголовки и постоянные ссылки для матчей, избегая дубликатов. Это улучшает читабельность URL и упрощает поиск информации в будущем. Следуя этому решению, вы можете оптимизировать управление постами в WordPress, сохраняя уникальность каждой записи.

Оцените материал
Добавить комментарий

Капча загружается...