Примеры автоматического внесения изменений в базу данных WordPress при сохранении записи черновика или публикации.
Для изменения содержимого без внесения в базу данных читайте другую инструкцию.
Для того, чтобы запустить какую-нибудь функцию при сохранении поста, нужно воспользоваться хуком:
Более подробно об этом ниже.
1. save_post для основного контента поста
Меняем данные в основной записи поста (post_content). К примеру, перед отправлением данных, скрипт поменяет в контенте одну букву на другую, а затем сохранит содержимое в базе данных.
Функция меняющая контент в WordPress
{
global $post;
$search = ['Ё', 'ё'];
$replace = ['Е', 'е'];
$getContent = get_post($post->ID);
$postContent = $getContent->post_content;
$modifyContent['post_content'] = str_replace($search, $replace, $postContent);
$newPost = array();
$newPost['ID'] = $post->ID;
$newPost['post_content'] = $modifyContent['post_content'];
wp_update_post( $newPost );
}
Запуск функции
При сочетании wp_update_post и save_post, нужна конструкция, которая сначала удаляет action (remove_action), а затем добавляет его. Это необходимо, чтобы избежать бесконечный цикл, который повесит страницу.
{
global $post;
if ( ! wp_is_post_revision($post->ID) )
{
remove_action('save_post', 'runReplaceLetters', 99);
replaceLetters();
add_action('save_post', 'runReplaceLetters', 99);
}
}
add_action('save_post', 'runReplaceLetters', 99);
2. save_post для произвольных полей
Та же самая функция, но которую будем использовать для произвольных полей.
Функция меняющая контент
{
global $post;
$search = ['Ё', 'ё'];
$replace = ['Е', 'е'];
$getKeyData = get_post_meta($post->ID, $key, true);
$change = str_replace($search, $replace, $getKeyData);
update_post_meta($post->ID, $key, $change);
}
Запуск функции
В отличии от предыдущего примера, здесь не нужно удалять action.
{
replaceLettersCustomPostMeta('ploshadka.net');
replaceLettersCustomPostMeta('ploshadka-net');
}
add_action('save_post', 'runReplaceLettersCustomPostMeta', 99);
3. Сохраняем данные через wp_insert_post_data
Сохраним изменения в контенте записи через функцию wp_insert_post_data.
{
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $data; // Exclude Autosave
if ( ! current_user_can('edit_post') ) return $data;
if (!empty($data['post_content'])) {
$search = ['Ё', 'ё'];
$replace = ['Е', 'е'];
$modifyContent['post_content'] = str_replace($search, $replace, $data['post_content']);
}
return $modifyContent;
}
add_filter( 'wp_insert_post_data' , 'replaceLetters', 99 );
4. Создадим title записи для WordPress по шаблону
Заголовок будет автоматически формироваться при каждом сохранении записи из атрибутов, которые мы для него подготовим.
Функция создающая title
global $post;
$string = get_post_meta($post->ID, 'ploshadka.net', true);
$newsTag = wp_get_post_terms($post->ID, 'news');
foreach ($newsTag as $tag) {
$tag = ' - ' .$tag->name;
}
$date = get_post_time();
$newTitle = sanitize_text_field(sprintf('%s %s %s', $string, $tag, $date));
// Иногда возможен такой вариант:
// wp_update_post(array($post->ID, 'post_title' => $newTitle ));
// Но с ним может перестать сохраняться post_content.
$newPost = array();
$newPost['ID'] = $post->ID;
$newPost['post_title'] = $newTitle;
wp_update_post( $newPost );
}
Запуск функции для Custom Post Types
Функцию выше запустим для произвольных типов записей. Для этого к save_post прибавим название такой записи. В данном случае news.
{
global $post;
if ( ! wp_is_post_revision($post->ID) )
{
remove_action('save_post_news', 'runGenerateTitle', 10);
generateTitle();
add_action('save_post_news', 'runGenerateTitle', 10);
}
}
add_action('save_post_news', 'runGenerateTitle', 10);