Вопрос или проблема
Я хочу сгенерировать заголовок поста из имени и фамилии, которые являются двумя полями. Посты создаются в WS Form и сохраняются без заголовка.
Я пробовал этот код, но он, похоже, не работает. Есть мысли?!
function set_post_title_from_acf($post_id){
$my_post = array();
$my_post['ID'] = $post_id;
if (get_post_type($post_id) == 'staff'){
$first_name = get_field('first_name',$post_id);
$last_name = get_field('last_name',$post_id);
$my_title = $first_name . ' ' . $last_name;
$my_post['post_title'] = $my_title;
$my_slug = sanitize_title($my_title);
$my_post['post_name'] = $my_slug;
wp_update_post($my_post);
}
}
add_action('save_post','set_post_title_from_acf',20);
Значение $post_id
, полученное в хуке save_post, может быть ID ревизии
. Поэтому, чтобы получить реальный ID поста, вы можете использовать эту функцию wp_is_post_revision()
Попробуйте изменить ваш код следующим образом,
function set_post_title_from_acf($post_id) {
// Если это ревизия, получаем реальный ID поста
if ( $parent_id = wp_is_post_revision( $post_id ) )
$post_id = $parent_id;
$my_post = array();
$my_post['ID'] = $post_id;
if (get_post_type($post_id) == 'staff') {
$first_name = get_field('first_name', $post_id);
$last_name = get_field('last_name', $post_id);
$my_title = $first_name . ' ' . $last_name;
$my_post['post_title'] = $my_title;
$my_slug = sanitize_title($my_title);
$my_post['post_name'] = $my_slug;
// отключаем эту функцию, чтобы она не зацикливалась
remove_action( 'save_post', 'set_post_title_from_acf' );
wp_update_post($my_post);
// повторно подключаем эту функцию
add_action( 'save_post', 'set_post_title_from_acf' );
}
}
add_action('save_post', 'set_post_title_from_acf');
Замечание: Если мы вызываем wp_update_post() внутри хука save_post, это приведет к бесконечному циклу. Чтобы избежать этого, отключите функцию перед вызовом функции, а затем снова подключите ее, как в приведенном выше коде.
Ответ или решение
Генерация заголовка поста из полей ACF
Ваша задача по генерации заголовка поста из полей "имя" и "фамилия" может быть эффективно решена с использованием хука save_post
в WordPress и функций ACF (Advanced Custom Fields). Вы уже предприняли первые шаги, однако, чтобы избежать проблемы с бесконечным циклом при обновлении поста, необходимо внести определенные изменения в ваш исходный код.
Обновленный Код
Для начала, давайте рассмотрим обновленную версию вашего кода, которая внесет необходимые коррективы:
function set_post_title_from_acf($post_id) {
// Если это ревизия, получаем настоящий ID поста
if ($parent_id = wp_is_post_revision($post_id)) {
$post_id = $parent_id;
}
// Проверяем, является ли тип поста 'staff'
if (get_post_type($post_id) == 'staff') {
// Получаем значения полей имени и фамилии
$first_name = get_field('first_name', $post_id);
$last_name = get_field('last_name', $post_id);
// Формируем заголовок
$my_title = $first_name . ' ' . $last_name;
// Подготавливаем массив для обновления поста
$my_post = array(
'ID' => $post_id,
'post_title' => $my_title,
'post_name' => sanitize_title($my_title)
);
// Отключаем функцию, чтобы избежать бесконечного цикла
remove_action('save_post', 'set_post_title_from_acf');
// Обновляем пост
wp_update_post($my_post);
// Пере-регистрация функции
add_action('save_post', 'set_post_title_from_acf');
}
}
add_action('save_post', 'set_post_title_from_acf', 20);
Объяснение Изменений
-
Проверка на ревизию: В коде предусмотрено использование функции
wp_is_post_revision()
, чтобы получить реальный идентификатор поста, если текущий ID относится к ревизии. Это важно, чтобы избежать ситуации, когда ваш код применим к некорректному объекту. -
Создание и обновление заголовка: Заголовок формируется из полей
first_name
иlast_name
, после чего он сохраняется в массиве$my_post
, который затем используется для обновления поста. -
Избежание бесконечного цикла: Ваша проблема возникла из-за вызова
wp_update_post()
внутри хукаsave_post
, что создало бы бесконечный цикл. Использованиеremove_action()
перед обновлением иadd_action()
после позволяет избежать этой проблемы.
Рекомендации по Оптимизации
-
Валидация данных: Настоятельно рекомендуется добавить валидацию, чтобы убедиться, что оба поля (имя и фамилия) не пустые. Это можно сделать, проверив
empty($first_name)
иempty($last_name)
перед формированием заголовка. -
Ошибка обработки: Обратите внимание на возможные ошибки при вызове
wp_update_post
, чтобы избежать непредвиденных ситуаций. Вы можете рассмотреть возможность использования функцииis_wp_error()
.
Настоятельно рекомендуется использовать вышеприведенный код в вашей теме или плагине WordPress, что обеспечит корректную генерацию заголовков для ваших постов на основе ACF. Это метод не только эффективен, но и соответствует стандартам разработки WordPress, что гарантирует более стабильную и быструю работу вашего сайта.