Вопрос или проблема
Я хотел бы сгенерировать заголовок поста из двух пользовательских полей: ‘job’, который является таксономией, и ‘date’, который является выбором даты, а не датой поста. Это для пользовательского типа постов под названием ‘job-updates’.
Я также хотел бы скрыть поле заголовка в редакторе.
С помощью сообщества ACF у меня есть следующий код, который я добавил в “Code Snippets”, но он, похоже, не работает. Есть мысли?
// выполняем функцию после обновления полей acf
add_action('acf/update_post', 20);
function title_from_fields($post_id) {
// проверяем ваш тип поста
if (get_post_type($post_id) != 'job-updates') {
return;
}
// получаем пост
$post = get_post($post_id);
// получаем поле таксономии
$terms = get_field('job', $post_id);
// поля таксономии возвращают массив, используем первый термин
$term = $terms[0];
// получаем поле даты
$date = get_field('date', $post_id);
// устанавливаем заголовок/slug поста
$title = $term->name.' '.$date;
$post->post_title = $title;
$post->post_name = sanitize_title($title);
// убираем этот фильтр, чтобы избежать бесконечного цикла
remove_filter('acf/update_post', 20);
// обновляем пост
wp_update_post($post);
// снова добавляем этот фильтр
add_action('acf/update_post', 20);
}
Вы можете использовать действие save_post
wordpress для обновления title
с помощью пользовательских полей по вашему усмотрению. Вот простой пример, который я использовал сам –
add_action( 'save_post', 'custom_post_type_title' );
function custom_post_type_title ( $post_id ) {
global $wpdb;
if ( get_post_type( $post_id ) == 'job-updates') {
$terms = get_field('job', $post_id);
// поля таксономии возвращают массив, используем первый термин
$term = $terms[0];
// получаем поле даты
$date = get_field('date', $post_id);
// устанавливаем заголовок/slug поста
$title = $term->name.' '.$date;
$where = array( 'ID' => $post_id );
$wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
}
}
Ответ или решение
Для решения вашей задачи по автоматическому созданию заголовка поста из двух пользовательских полей ("job" и "date") для пользовательского типа записи "job-updates" и скрытию поля заголовка в редакторе, рекомендуется использовать следующий код. Этот код будет эффективнее, так как он будет использовать хук save_post
, который срабатывает при сохранении записи.
- Код для автоматического создания заголовка:
add_action('save_post', 'custom_post_type_title');
function custom_post_type_title($post_id) {
// Проверка, что это не автосохранение и что тип поста правильный
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверка типа поста
if (get_post_type($post_id) != 'job-updates') {
return;
}
// Получаем значения пользовательских полей
$terms = get_field('job', $post_id);
$date = get_field('date', $post_id);
// Если существует хотя бы один термин и дата
if ($terms && !empty($date)) {
// Используем первый термин из массива
$term = $terms[0];
// Формируем заголовок
$title = $term->name . ' ' . $date;
// Обновляем заголовок и слаг
$post_data = array(
'ID' => $post_id,
'post_title' => $title,
'post_name' => sanitize_title($title),
);
// Обновляем пост
remove_action('save_post', 'custom_post_type_title'); // предотвращение зацикливания
wp_update_post($post_data);
add_action('save_post', 'custom_post_type_title'); // переактивация хука
}
}
- Скрытие поля заголовка в редакторе:
Чтобы скрыть поле заголовка в редакторе, вы можете добавить следующий код в файл functions.php
вашей темы:
function hide_title_field() {
global $post_type;
if ($post_type == 'job-updates') {
echo '<style type="text/css">#titlewrap { display: none; }</style>';
}
}
add_action('admin_head', 'hide_title_field');
Объяснение кода:
-
Функция
custom_post_type_title
: Срабатывает при сохранении записи. Проверяет, что сохранение не является автосохранением и что тип поста – этоjob-updates
. Затем получает значения пользовательских полей и формирует заголовок. Использует функциюwp_update_post
для обновления заголовка и слага. -
Функция
hide_title_field
: Добавляет CSS стиль, который скрывает обертку заголовка в редакторе для пользовательского типа записиjob-updates
.
Примечания:
- Убедитесь, что у вас правильно установлены и активированы необходимые плагины, такие как Advanced Custom Fields (ACF).
- После добавления кода, протестируйте его, создав или обновив запись типа
job-updates
. Заголовок должен автоматически обновляться согласно значениям из кастомных полей.
Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!