Использование wp_update_post в save_post
Я пытаюсь обновить дату поста (уменьшить на 1 год) при нажатии на кнопку "Обновить", но это вызывает бесконечный цикл.
Есть ли другие способы сделать это?
Спасибо.
function change_year($post_id, $post){
// Проверяем, что это запись (post)
if ( $post->post_type == 'post' ) {
$format = 'Y-m-d H:i:s';
$id = $post->ID;
$old_date = $post->post_date;
$old_gmt_date = $post->post_date_gmt;
// Уменьшаем дату на 1 год
$new_date = date( $format, strtotime( '-1 year' , strtotime( $old_date ) ) );
$new_date_gmt = date( $format, strtotime( '-1 year' , strtotime( $old_gmt_date ) ) );
$new_values = array (
'ID' => $id,
'post_date' => $new_date,
'post_date_gmt' => $new_date_gmt
);
// Удаляем хук перед обновлением, чтобы избежать бесконечного цикла
remove_action('save_post', 'change_year');
wp_update_post( $new_values );
// Возвращаем хук после обновления
add_action('save_post', 'change_year');
}
}
add_action('save_post', 'change_year', 10, 2);

Причина бесконечного цикла в том, что каждый раз при сохранении записи вызывается функция change_year
... которая затем вызывает wp_update_post
... что снова запускает фильтр save_post
.
После изучения и анализа, я пришел к выводу, что вам следует избегать использования фильтра save_post
.
Попробуйте использовать этот фильтр: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_insert_post_data
Он действительно предоставляет то, что вам нужно.
Вот пример редактирования данных записи с его помощью:
function filter_handler( $data , $postarr ) {
$data[ 'post_title' ] = $postarr[ 'post_title' ] . 'RAWR!';
return $data;
}
add_filter( 'wp_insert_post_data' , 'filter_handler' , '99', 2 );
Этот код будет добавлять 'RAWR!' в конец заголовка любой сохраняемой записи.
Надеюсь, это поможет.
