Intereting Posts
Добавить последнее измененное время как версия в css и js Настройка фокальной точки для чувствительного заголовка Дайвинг в магистраль и API REST Способ кэширования запроса в течение 24 часов Создает ли WordPress автоматическую страницу для форматов сообщений? Сортировка продуктов Woocommerce с числовыми названиями Как изменить порядок полей comment_form с помощью css? Лучший способ выполнить ping для изменений API в wordpress? Котировки не отображаются должным образом в настройках WooCommerce API Почему идентификаторы в URL-адресах не работают, но слизняки? Пользовательская постоянная ссылка на пользовательские поля типа сообщения Новые функции в отдельном каталоге – лучше, переносимо Сделать страницу архивом персонализированного типа сообщения Исключить пользовательские столбцы с таксономией из настраиваемого почтового цикла Тип сообщения – Обычный пост – изображение

Обновление данных post для сохранения (save_post vs wp_insert_post_data)

Я пытаюсь изменить данные после публикации.

Во-первых, я попытался использовать 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 действие снова для других плагинов, поэтому все плагины, кроме моего, выполняются дважды, и это плохо.

Затем я нашел еще один hook 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; } 

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

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

Сначала данные были дезинфицированы здесь (строка 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; }