Диагностика проблемы: зачем автоматически изменять заголовки постов
В стандартном 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 в админке | Простое визуальное изменение | Не меняет данные, может сбиться | Скрипт для админки |