Як я можу редагувати дані публікації, перш ніж вони будуть збережені?


19

У мене є плагін, і я хотів би мати можливість запускати вміст публікації через деякі фільтри, перш ніж він буде збережений у базі даних. Переглядаючи api-плагіни , я бачу, що два гачки, схожі, можуть бути корисними:

save_post
wp_insert_post

Єдина проблема полягає в тому, що, схоже save_post, не потрібно повертати змінну, і тому я не знаю, як фільтрувати вміст, і wp_insert_postвиглядає документально.

Я хотів би зробити щось подібне:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

Я збираюся зробити щось більш корисне, ніж додати часову позначку, а саме запустити кілька фільтрів регулярних виразів, але це загальний тип фільтра / дії, який я намагаюся додати.

Оновлення

Зауважте, що я хочу перехопити дані про спосіб збереження в базі даних - не тоді, коли вони відображаються у публікації (наприклад, не додаючи фільтр до the_content)


Примітка. У вас поганий дизайн :-) 1. Кожен раз, коли буде збережено повідомлення, ця рядок буде додана. (якщо ви не видаляєте попередню, ви отримуєте багато " This post was..." s 2. даних, такі, як ці, повинні зберігатися як мета-значення повідомлення :-) BTW: save_postвикликається після збереження даних, тому після нього було збережено в базі даних (не те, що потрібно).
jave.web

Відповіді:


29

Wp_insert_post_data фільтр може зробити це:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}

2
змусив мене йти в правильному напрямку, дякую. я думаю, що вам потрібно використовувати, add_actionхоча замість цього add_filter. також ваші wpse35931_filter_post_dataі filter_handlerневідповідні ...
cwd

1
Це, безумовно, фільтр. Хоча фільтри та дії базуються на тій самій функціональності, яка дозволяє виконувати певний кросовер. Якщо ви використовуватимете це як дію, ви не зможете повернути дані, які б видалили всю точку. Ви хочете відфільтрувати дані та повернути їх.
Джейк

2
wp_insert_post_dataпрацює, але трохи переможений за те, що ОП (а можливо й інші) хочуть досягти. Більш простий варіант у цій ситуації, content_save_preяк рекомендує @drzaus.
rinogo

1
Документи розробника для wp_insert_post_dataфільтра: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web

Чи називається цей гачок кожного разу, коли ви: а) вручну дзвоніть на wp_insert_post (), наприклад, в функцію.php вашої теми, щоб вставити / оновити публікацію АБО б), коли публікація зберігається будь-якими можливими способами (наприклад, через бекенд, через фронтенд , якось ще ...)?
Вадим Н


2

Ви також можете перевірити на гачок pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}

1

Додайте наступний код до активної темі замінити <shell>з [shell]перед збереженням:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }

0

Якщо ви просто хочете додати щось подібне в кінці всіх публікацій, я б запропонував вам скористатися the_contentфільтром.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );

Дякую, але я насправді хочу редагувати дані, перш ніж вони будуть збережені в базі даних.
cwd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.