Использование wp_update_post в save_post

9 нояб. 2011 г., 23:14:33
Просмотры: 4.75K
Голосов: 5

Я пытаюсь обновить дату поста (уменьшить на 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);
1
Комментарии

Я хотел бы добавить немного больше информации - приведенное выше решение вносит изменения в КАЖДУЮ запись, даже если она, например, публикуется администратором в админке. Подробнее смотрите мой ответ здесь: http://wordpress.stackexchange.com/a/113967/37612

Asped Asped
13 сент. 2013 г. 02:12:46
Все ответы на вопрос 1
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!' в конец заголовка любой сохраняемой записи.

Надеюсь, это поможет.

10 нояб. 2011 г. 02:21:56
Комментарии

просто возвращение на самом деле не изменяет время/дату записи

chrismccoy chrismccoy
10 нояб. 2011 г. 05:28:44

Я обновил ответ, дайте знать, если это поможет.

Sterling Hamilton Sterling Hamilton
10 нояб. 2011 г. 20:57:38