Как автоматически изменять заголовки постов при их редактировании в WordPress

Диагностика проблемы: зачем автоматически изменять заголовки постов

В стандартном WordPress заголовок поста задаётся вручную и сохраняется без изменений, пока пользователь сам его не изменит. Зачастую возникает задача автоматически модифицировать заголовок при редактировании, например, добавлять префиксы, суффиксы или стандартизировать формат. Это особенно актуально для сайтов с большим количеством контента, где соблюдение единого стиля заголовков — требование SEO или корпоративных стандартов.

Проверить, что заголовок не изменяется автоматически, достаточно просто: отредактируйте пост и посмотрите, что заголовок сохраняется в том же виде, что и введённый вручную.

Пошаговое решение: автоматическая модификация заголовков через хук save_post

Для решения задачи используется хук save_post, который вызывается при сохранении или обновлении поста. В нём можно получить текущий заголовок, изменить его и обновить пост программно.

Пример кода для добавления префикса "[Новинка]" к заголовку

function wptool_auto_modify_post_title( $post_id ) {
    // Проверка, чтобы не запускаться при автосохранении
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
        return;
    }
    // Проверка прав пользователя
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    $post = get_post( $post_id );
    if ( ! $post || $post->post_type !== 'post' ) {
        return;
    }
    $title = $post->post_title;
    // Добавляем префикс, если его нет
    $prefix = '[Новинка] ';
    if ( strpos( $title, $prefix ) !== 0 ) {
        $new_title = $prefix . $title;
        // Обновляем пост без зацикливания
        remove_action( 'save_post', 'wptool_auto_modify_post_title' );
        wp_update_post( array(
            'ID' => $post_id,
            'post_title' => $new_title
        ) );
        add_action( 'save_post', 'wptool_auto_modify_post_title' );
    }
}
add_action( 'save_post', 'wptool_auto_modify_post_title' );

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

  • Проверяем, что не происходит автосохранение, чтобы не вызвать бесконечный цикл.
  • Проверяем права пользователя на редактирование поста.
  • Берём текущий заголовок и добавляем префикс, если его там нет.
  • Отключаем хук перед обновлением, чтобы не вызвать рекурсию.

Проверка результата после внедрения

1. Отредактируйте любой пост в админке, измените его содержимое, но не меняйте заголовок вручную.

2. Сохраните изменения.

3. После сохранения в списке постов и в редакторе заголовок должен автоматически содержать префикс [Новинка], если его там не было.

4. Попробуйте отредактировать пост с уже добавленным префиксом — он не должен дублироваться.

Частые ошибки и как исправить

  • Зацикливание функции обновления поста: Если не отключить хук перед вызовом wp_update_post, функция вызовется рекурсивно. Решение: использовать remove_action и add_action как в примере.
  • Автосохранение ломает логику: Функция срабатывает при автосохранении, что не нужно. Решение: проверять DOING_AUTOSAVE.
  • Не срабатывает для кастомных типов записей: В примере ограничение по типу post. Если нужно — изменить условие на нужный post_type.
  • Права пользователя: Если функция срабатывает для неподходящих пользователей, добавить проверку current_user_can.

Практические советы по безопасности и производительности

  • Минимизируйте работу с базой: Не вызывайте wp_update_post без необходимости, чтобы избежать лишних операций.
  • Проверяйте типы постов: Делайте функцию универсальной, если требуется, или ограничивайте по типу для безопасности.
  • Проверяйте права доступа: Защищайте функцию от запуска неавторизованными пользователями.
  • Логирование: При необходимости добавьте логирование изменений, чтобы отслеживать автоматические обновления.

Дополнительный пример: добавление суффикса с текущей датой

function wptool_add_date_suffix_to_title( $post_id ) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    $post = get_post( $post_id );
    if ( ! $post || $post->post_type !== 'post' ) {
        return;
    }
    $suffix = ' (' . date('Y-m-d') . ')';
    $title = $post->post_title;
    if ( substr( $title, -strlen($suffix) ) !== $suffix ) {
        $new_title = $title . $suffix;
        remove_action( 'save_post', 'wptool_add_date_suffix_to_title' );
        wp_update_post( array(
            'ID' => $post_id,
            'post_title' => $new_title
        ) );
        add_action( 'save_post', 'wptool_add_date_suffix_to_title' );
    }
}
add_action( 'save_post', 'wptool_add_date_suffix_to_title' );

Сравнение подходов к автоматическому изменению заголовков

МетодПлюсыМинусыПример
Хук save_post с wp_update_postГибкий, можно менять заголовок по любым условиямРиск рекурсии, может замедлить сохранениеПример выше
Фильтр the_titleМеняет отображение без изменения в базеНе меняет заголовок в админке и базеadd_filter('the_title', function($title){ return '[Префикс] ' . $title; });
JavaScript в админкеПростое визуальное изменениеНе меняет данные, может сбитьсяСкрипт для админки
WooCommerce: автоматическое изменение наличия и цены товара при изменении атрибутов
30.07.2026
Как создать динамическое отображение товара WooCommerce по параметрам
09.01.2026
Как сделать отзывную AJAX-форму обработки на WordPress
05.01.2026
Как автоматизировать проверку и удаление спам-комментариев в WordPress
25.01.2026
Как автоматизировать управление ролями пользователей в WordPress с помощью кода
01.02.2026