WordPress – add_action и save_post

Admin MySQL, WordPress

Примеры автоматического внесения изменений в базу данных 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"