Автоматическая генерация заголовка поста из 2 пользовательских полей

Вопрос или проблема

Я хотел бы сгенерировать заголовок поста из двух пользовательских полей: ‘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, который срабатывает при сохранении записи.

  1. Код для автоматического создания заголовка:
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'); // переактивация хука
    }
}
  1. Скрытие поля заголовка в редакторе:

Чтобы скрыть поле заголовка в редакторе, вы можете добавить следующий код в файл 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. Заголовок должен автоматически обновляться согласно значениям из кастомных полей.

Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...