Этот хук срабатывает, когда вы создаете новый пост, редактируете существующий или обновляете его. Он может быть использован для выполнения различных задач, таких как обновление метаданных, отправка уведомлений, валидация данных или изменение содержимого поста перед его сохранением.
Когда использовать save_post
?
- Когда нужно обновить или сохранить метаданные поста (дополнительную информацию, связанную с записью).
- При необходимости выполнить валидацию данных или модификации до сохранения.
- Для отправки уведомлений или выполнения действий (например, синхронизация с внешним API) после создания или обновления поста.
Пример использования save_post
Предположим, вы хотите сохранять дополнительное пользовательское поле (например, «источник статьи») при сохранении поста. Вот как это можно сделать:
function save_custom_meta_box_data($post_id) {
// Проверяем, если это автосохранение, выходим
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем наличие nonce для безопасности
if (!isset($_POST['custom_nonce']) || !wp_verify_nonce($_POST['custom_nonce'], 'save_custom_meta')) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Сохраняем данные поля "источник статьи"
if (isset($_POST['source_field'])) {
update_post_meta($post_id, '_source_field', sanitize_text_field($_POST['source_field']));
}
}
add_action('save_post', 'save_custom_meta_box_data');
Разбор кода:
Проверка автосохранения:
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
Если происходит автосохранение (например, черновик), мы прерываем выполнение, чтобы не выполнять дальнейшие действия.Проверка nonce:
Мы используем nonce для защиты от CSRF-атак. wp_verify_nonce()
проверяет корректность переданного значения.Проверка прав:
Используем current_user_can()
, чтобы убедиться, что текущий пользователь имеет права на редактирование поста.Сохранение метаданных:
Если поле source_field
передано через форму, его значение будет очищено функцией sanitize_text_field()
и сохранено как метаданные поста с помощью update_post_meta()
.
Допустим, вам нужно автоматически присваивать категорию или тег при создании поста. Вот пример кода:
function auto_assign_category($post_id) {
// Проверяем, если это автосохранение, выходим
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Проверяем тип поста (например, только для постов типа 'post')
if (get_post_type($post_id) != 'post') {
return;
}
// Присваиваем категорию с ID 5
wp_set_post_terms($post_id, array(5), 'category', true);
}
add_action('save_post', 'auto_assign_category');
Здесь при каждом сохранении поста автоматически присваивается категория с ID 5
.
Особенности использования save_post
- Порядок вызова:
save_post
вызывается после того, как данные записи были обновлены в базе данных. Вы можете получить доступ ко всем данным поста, таким как метаданные и термины. - Проверка автосохранений и ревизий: Важно проверять автосохранения и ревизии, чтобы ненужные действия не выполнялись при этих процессах.
- Использование nonce: Всегда проверяйте и используйте nonce для безопасности при работе с пользовательскими формами и сохранением данных.
Другие полезные функции с save_post
update_post_meta()
: Обновляет метаданные записи.wp_set_post_terms()
: Присваивает термины (категории, теги) к записи.wp_mail()
: Отправка писем при сохранении поста (например, уведомления администратору).
Заключение
Хук save_post
— это мощный инструмент для выполнения дополнительных действий при сохранении поста в WordPress. С его помощью можно легко сохранять метаданные, автоматизировать присвоение категорий или тегов, проверять данные и выполнять другие задачи, связанные с сохранением записей.