Изменение ЧПУ записи перед сохранением

10 июл. 2013 г., 09:50:41
Просмотры: 26.7K
Голосов: 12

Мне нужно получить значение поля ACF внутри записи и изменить ЧПУ (slug/permalink) записи перед её сохранением в базу данных. Какой подход использовать для достижения этой цели? Мне нужно, чтобы ЧПУ изменялся при каждой операции создания/редактирования записи.

0
Все ответы на вопрос 2
3
26

Следующее следует рассматривать скорее как концептуальное доказательство, а не готовое решение для копирования/вставки.
Тем не менее, вот как можно это реализовать:

Действие save_post action срабатывает каждый раз, когда запись обновляется или создается. Вы можете подключить callback-функцию к нему с помощью add_action.

Таким образом, ваш случай должен выглядеть примерно так:

// начальный хук
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // проверяем, что запись не является ревизией
    if ( ! wp_is_post_revision( $post_id ) ) {

        // отключаем эту функцию, чтобы избежать бесконечного цикла
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // обновляем ярлык записи
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'some-new-slug' // здесь делаем нужные изменения
        ));

        // снова подключаем эту функцию
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

Что может показаться немного запутанным в вышеприведенном коде — это отключение и повторное подключение функции изнутри неё. Это необходимо, поскольку мы вызываем wp_update_post для обновления ярлыка, что, в свою очередь, снова вызовет действие save_post.

Кстати, если вы хотите, чтобы WordPress автоматически генерировал новый ярлык на основе заголовка записи, просто передайте пустую строку:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // ярлык будет сгенерирован WordPress на основе заголовка записи
));
10 июл. 2013 г. 11:46:23
Комментарии

спасибо за концепцию, это помогло мне лучше понять процесс

Vit Kos Vit Kos
10 июл. 2013 г. 13:31:43

Вопрос относится к ACF, конкретно к "получению" значения поля, и ваша концепция работает в php, но пропускает именно то, что вы прокомментировали как "do your thing here". Можете ли вы также предоставить proof of concept для получения значения? (помните, что поле #postname не появляется до тех пор, пока не будет нажата кнопка "edit" (постоянная ссылка). То же самое с невидимым полем #new-post-slug)

sergio sergio
9 июл. 2015 г. 09:54:00

Не могу ли я сделать это также с помощью фильтра wp_insert_post_data, который выполняется после санитизации, прямо перед сохранением? В чем самое большое преимущество этого метода?

toni_lehtimaki toni_lehtimaki
3 сент. 2017 г. 12:22:33
0

Мне нужно было то же самое, но только для создания записей.

Я реализовал решение здесь (оно готово для копирования/вставки).

Просто удалите строку, которая проверяет равенство обеих дат, и это обновит ярлык (slug) также при редактировании. Однако я не рекомендую это делать, так как это изменит URL записи, что плохо для SEO и может привести к другим проблемам, таким как битые ссылки (404).

11 февр. 2016 г. 01:15:37