Добавление значения мета-поля в содержимое записи WordPress во время save_post

8 янв. 2011 г., 05:12:02
Просмотры: 1.8K
Голосов: 2

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

Я пробовал вызывать wp_update_post() из функции, привязанной к save_post, но, как многие из вас сразу заметят, wp_update_post() содержит do_action('save_post'), что создаёт бесконечный цикл.

Какие ещё способы (используя API) существуют для обновления содержимого записи на основе её произвольных значений после сохранения/редактирования, не вызывая кошмарного бесконечного цикла?

2
Комментарии

Пробовали ли вы использовать фильтр wp_insert_post_data? (Несмотря на название, он срабатывает как при добавлении, так и при обновлении записей.)

BoltClock BoltClock
8 янв. 2011 г. 05:25:22

@BoltClock Именно этим путем я пошел сразу после публикации вопроса - нашел рабочий пример, который, без сомнения, можно улучшить. Я поделюсь им ниже.

Sampson Sampson
8 янв. 2011 г. 07:17:32
Все ответы на вопрос 1
2

Первое решение, которое я нашел, заключается в подключении фильтра к действию, такому как 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;
}

Я уверен, что это решение можно улучшить.

Ссылки

  1. add_filter() - "Фильтры — это хуки, которые запускает WordPress..."
  2. wp_insert_post_data - "Фильтр, вызываемый функцией wp_insert_post..."
  3. global ключевое слово - "Область видимости переменной — это контекст, в котором она определена..."
  4. get_post_meta() - "Эта функция возвращает значения произвольных полей..."
  5. stristr() - "Находит первое вхождение подстроки (без учета регистра)..."
8 янв. 2011 г. 07:25:44
Комментарии

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

BoltClock BoltClock
8 янв. 2011 г. 07:40:33

@BoltClock Верно. Я намеренно сделал этот пример максимально простым. В рабочей версии у меня реализованы все необходимые проверки и балансировки.

Sampson Sampson
8 янв. 2011 г. 07:42:58