Фильтр wp_insert_post_data
в WordPress позволяет модифицировать данные поста перед тем, как они будут записаны в базу данных через функцию wp_insert_post()
. Этот фильтр дает возможность изменять различные параметры записи, такие как заголовок, контент, статус и GUID, и полезен для кастомизации перед добавлением или обновлением поста.
apply_filters( ‘wp_insert_post_data’, array $data, array $postarr, array $unsanitized_postarr, bool $update )
Параметры:
$data
(массив): содержит экранированные, проверенные и обработанные данные поста.$postarr
(массив): экранированные и проверенные, но не модифицированные данные поста.$unsanitized_postarr
(массив): оригинальные, не обработанные и не проверенные данные, переданные вwp_insert_post()
.$update
(логический): указывает, обновляется ли существующий пост (true
) или создается новый (false
).
Для доступа ко всем параметрам нужно передать значение 3
в качестве четвертого аргумента в add_filter()
.
add_filter( 'wp_insert_post_data', 'custom_function', 10, 3 );
Пример 1: Удаление символа возврата каретки из контента записи
Этот пример показывает, как удалить все символы возврата каретки \r
из контента перед сохранением поста:
add_filter( 'wp_insert_post_data', 'remove_carriage_return', 10, 2 );
function remove_carriage_return( $data, $postarr ) {
$data['post_content'] = str_replace( "\r", '', $data['post_content'] );
return $data;
}
Пример 2: Обновление GUID для пользовательского типа записи
Для кастомного типа записи transaction
этот код обновляет GUID, чтобы в нем всегда сохранялась постоянная ссылка на запись. Проверка производится на тип записи и отсутствие автосохранения:
add_filter( 'wp_insert_post_data', 'update_transaction_guid', 10, 3 );
function update_transaction_guid( $data, $postarr, $unsanitized_postarr ) {
if ( 'transaction' === $data['post_type'] && ! ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) {
$data['guid'] = get_permalink( $postarr['ID'] );
}
return $data;
}
Пример 3: Запрет изменения статуса записи на publish
Если нужно ограничить изменение статуса записи transaction
при редактировании через админку и не позволять менять его на publish
, используем следующий код:
add_filter( 'wp_insert_post_data', 'restrict_publish_status', 10, 2 );
function restrict_publish_status( $data, $postarr ) {
if ( 'transaction' === $data['post_type'] && 'publish' === $data['post_status'] ) {
$data['post_status'] = sanitize_key( filter_input( INPUT_POST, 'original_post_status' ) );
}
return $data;
}
Пример 4: Автоматическая замена HTML-энтити в заголовке
Этот пример показывает, как можно автоматически заменить HTML-спецсимволы на их оригинальные значения в заголовке записи:
add_filter( 'wp_insert_post_data', 'decode_html_entities_in_title', 10, 3 );
function decode_html_entities_in_title( $data, $postarr, $unsanitized_postarr ) {
$data['post_title'] = html_entity_decode( $data['post_title'] );
return $data;
}
Заключение
Фильтр wp_insert_post_data
предоставляет мощные возможности для модификации данных перед сохранением в базе данных. Будь то удаление лишних символов, изменение статуса записи, настройка GUID или автоматическая обработка HTML-спецсимволов, использование этого фильтра позволяет улучшить функциональность и гибкость при работе с постами в WordPress.