Обновление данных записи при сохранении (сохранить запись против wp вставить данные записи)


Я пытаюсь изменить данные записи в действии сохранения записи.

Сначала я попытался использовать save_post такой крючок

function post_save_action($post_id, $post, $update)
    {
        if ($this->is_temp_saving_post($post, $post_id)) {
            return;
        }
        // Check user permissions
        if (!current_user_can('edit_post', $post_id))
            return;
        // Update post
        if (!$this->is_proper_post_type($post)) {
            return;
        }
        $processed_content = $this->process_post_data($post);
        $update_data = [
            self::POST_ID => $post_id,
            self::POST_CONTENT => $processed_content
        ];
        // Prevent infinite loop
        remove_action('save_post', array($this, 'post_save_action'), 99);
        // Update the post into the database
        wp_update_post($update_data);
        // Add hook again
        add_action('save_post', array($this, 'post_save_action'), 99);
    }

Проблема здесь в том, что wp_update_post($update_data); снова запускает действие save_post для других плагинов, поэтому все плагины, кроме моего, выполняются дважды, и это плохо.

Затем я нашел другой крючок wp_insert_post_data и добавил свою логику обработки

public function post_insert_filter($data, $postattr)
    {
        $post_id = $postattr['ID'];
        $post_object = $this->convertToObject($data);
        $post_object->ID = $post_id;
        if ($this->is_temp_saving_post($post_object, $post_id)) {
            return $data;
        }
        if (!current_user_can('edit_post', $post_id)) {
            return $data;
        }
        // Update post
        if (!$this->is_proper_post_type($post_object)) {
            return $data;
        }
        $processed_content = $this->process_post_data($post_object);
        $data[self::POST_CONTENT] = $processed_content;
        return $data;
    }

Это работает, крючок не вызывается дважды, но проблема на данный момент wp_insert_post_data вызвана, данные уже есть где-то был экранирован (скобки), но мне нужны необработанные данные здесь.

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

Author: cyeostoragrn, 2016-12-18

1 answers

Сначала данные были очищены здесь (строка 2997).

Если вы не хотите, чтобы какой-либо плагин/тема запускались в действии save_post. Пользовательская функция remove_all_actions для удаления всех функций, подключенных к действию save_post.

function post_save_action($post_id, $post, $update)
 {
    if ($this->is_temp_saving_post($post, $post_id)) {
        return;
    }
    // Check user permissions
    if (!current_user_can('edit_post', $post_id))
        return;
    // Update post
    if (!$this->is_proper_post_type($post)) {
        return;
    }
    $processed_content = $this->process_post_data($post);
    $update_data = [
        self::POST_ID => $post_id,
        self::POST_CONTENT => $processed_content
    ];
    // Backup actions
    global $wp_filter, $merged_filters;
    $backup_wp_filter = $wp_filter;
    $backup_merged_filters = $merged_filters;
    // Remove all functions which hooked to this action, to prevent run twice.
    remove_all_actions('save_post');
    // Update the post into the database
    wp_update_post($update_data);
   // restore actions
    $wp_filter = $backup_wp_filter;
    $merged_filters = $backup_merged_filters;
 }
 0
Author: Nguyễn Văn Được, 2016-12-18 10:48:53