WordPress – add_action и save_post

Примеры автоматического внесения изменений в базу данных WordPress при сохранении записи черновика или публикации.

Для изменения содержимого без внесения в базу данных читайте другую инструкцию.

Для того, чтобы запустить какую-нибудь функцию при сохранении поста, нужно воспользоваться хуком:

add_action('save_post', '', );

Более подробно об этом ниже.

1. save_post для основного контента поста

Меняем данные в основной записи поста (post_content). К примеру, перед отправлением данных, скрипт поменяет в контенте одну букву на другую, а затем сохранит содержимое в базе данных.

Функция меняющая контент в WordPress

function replaceLetters()
{
    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), а затем добавляет его. Это необходимо, чтобы избежать бесконечный цикл, который повесит страницу.

function runReplaceLetters()
{
    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 для произвольных полей

Та же самая функция, но которую будем использовать для произвольных полей.

Функция меняющая контент

function replaceLettersCustomPostMeta($key = "")
{
    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.

function runReplaceLettersCustomPostMeta()
{
    replaceLettersCustomPostMeta('ploshadka.net');
    replaceLettersCustomPostMeta('ploshadka-net');
}
add_action('save_post', 'runReplaceLettersCustomPostMeta', 99);

3. Сохраняем данные через wp_insert_post_data

Сохраним изменения в контенте записи через функцию wp_insert_post_data.

Надо быть внимательным при сочетании функций add_filter -> wp_insert_post_data и add_action -> save_post. При неправильных приоритетах что-то может не работать.
function replaceLetters( $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

function generateTitle() {
    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.

function runGenerateTitle()
{
    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);

Привет. Ты находишься на моём сайте. Я разработчик. Здесь я делюсь своими наработками и знаниями. Спрашивай в комментариях, если тебе что-то не понятно или пиши, если есть что добавить.

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи: "WordPress – add_action и save_post".

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Если вам нужно добавить участок кода ставьте его между тегами <code></code>