Добавление значения мета-поля в содержимое записи WordPress во время save_post
Проблема кажется довольно простой: когда срабатывает действие save_post
, я хочу добавить значение мета-ключа в конец post_content
, если оно ещё не присутствует в самой записи.
Я пробовал вызывать wp_update_post()
из функции, привязанной к save_post
, но, как многие из вас сразу заметят, wp_update_post()
содержит do_action('save_post')
, что создаёт бесконечный цикл.
Какие ещё способы (используя API) существуют для обновления содержимого записи на основе её произвольных значений после сохранения/редактирования, не вызывая кошмарного бесконечного цикла?
Первое решение, которое я нашел, заключается в подключении фильтра к действию, такому как wp_insert_post_data
, и извлечении дополнительной информации о записи из глобального объекта $post
.
// Подключаем наш фильтр к действию wp_insert_post_data
add_filter( 'wp_insert_post_data', 'my_appender' );
function my_appender( $content ) {
// Делаем глобальную переменную $post доступной в функции
global $post;
// Получаем значение метаполя с ключом 'key_name'
$meta_value = get_post_meta( $post->ID, 'key_name', TRUE );
// Если значение отсутствует в контенте, добавляем его в конец
if ( stristr( $content['post_content'], $meta_value ) === FALSE )
$content['post_content'] .= $meta_value;
// Возвращаем отфильтрованный контент
return $content;
}
Я уверен, что это решение можно улучшить.
Ссылки
add_filter()
- "Фильтры — это хуки, которые запускает WordPress..."wp_insert_post_data
- "Фильтр, вызываемый функцией wp_insert_post..."global
ключевое слово - "Область видимости переменной — это контекст, в котором она определена..."get_post_meta()
- "Эта функция возвращает значения произвольных полей..."stristr()
- "Находит первое вхождение подстроки (без учета регистра)..."

Выглядит разумно. Думаю, реализация проверки будет зависеть от того, какое именно значение post meta используется.
