Обновление данных записи при сохранении (сохранить запись против 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
вызвана, данные уже есть где-то был экранирован (скобки), но мне нужны необработанные данные здесь.
Пожалуйста, предложите правильный способ изменения данных с учетом всех требований.
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;
}