Проблема с действием WordPress "save_post" - PullRequest
6 голосов
/ 25 марта 2011

Я разработал плагин для WordPress, который должен выполнять дополнительную обработку при сохранении записи пользовательского типа.

Наиболее логичным решением было использование действия "save_post". После вызова обработчик действия создает или обновляет запись базы данных в пользовательской таблице (в зависимости от того, нажата ли кнопка «Создать публикацию» или «Обновить публикацию»).

Я реализовал это, и казалось, что оно работает отлично, но есть небольшая проблема, которую я хотел бы решить. Похоже, что «save_post» также запускается при первой загрузке страницы «Создать запись» (т. Е. До того, как вводятся какие-либо пользовательские вводы и до нажатия кнопки «Отправить новый / изменения»).

Это означает, что пользовательская таблица базы данных заполняется одной пустой строкой для каждого нового сохраненного сообщения. Это также означает, что при каждой загрузке страницы добавления поста имеется одна пустая строка.

Вот упрощенная версия моего обработчика save_post:

function do_save_post($post_id) {
    if (get_post_type($post_id) !== 'mycustomtype')
        return $post_id;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;

    if (!current_user_can('edit_mycustomtype'))
        return $post_id;

    echo 'This happens when selecting "Add New" from admin sidebar.';
    echo 'Even though post has not been saved or updated.';
    echo 'This should only happen when button on right of editor is clicked.';
}

Как определить, действительно ли запись сохраняется?

Ответы [ 4 ]

18 голосов
/ 01 мая 2011

У меня была такая же проблема, и я заглянул в соответствующий раздел post.php. Оказывается, save_post вызывается при каждом запуске post.php, поэтому вы будете запускать его при создании записи, списке и т. Д.

В WP 3.1 «post_updated» вызывается только для события сохранения / создания в post.php. Поэтому я использовал:

add_action('post_updated', 'some_function');

Надеюсь, это работает и для вас.

5 голосов
/ 21 марта 2012

Использование хука 'post_updated', как правило, проблематично, особенно при использовании пользовательских типов записей.Вместо этого я использовал это как свое решение:

   function do_save_post($post_id){
        $post = get_post($post_id);
        if($post->post_status == 'trash' or $post->post_status == 'auto-draft'){
                return $post_id;
        }
        echo "do stuff";
    }

Я также не хотел выполнять какие-либо действия, когда элементы отправлялись в корзину.

2 голосов
/ 25 марта 2011

Этот хук запускается всякий раз, когда сообщение или страница создаются или обновляются, например, из формы импорта, публикации / редактирования страницы, xmlrpc или сообщения по электронной почте.Таким образом, я предполагаю, что это также работает, когда пост-ревизия сохранена.Если бы я находился там, где вы, я бы проверил, установлен ли postID (это единственный аргумент, который должна получить функция ловушки) и является ли он ревизией wp_is_post_revision().

1 голос
/ 19 сентября 2012

Вы можете просто проверить, действительно ли данные публикуются или нет.

if(isset($_POST['post_title'])){
    //do stuff
}
...