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

Следующее следует рассматривать скорее как концептуальное доказательство, а не готовое решение для копирования/вставки.
Тем не менее, вот как можно это реализовать:
Действие 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 на основе заголовка записи
));

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

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