Генерировать заголовок поста из полей ACF

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

Я хочу сгенерировать заголовок поста из имени и фамилии, которые являются двумя полями. Посты создаются в 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);

Объяснение Изменений

  1. Проверка на ревизию: В коде предусмотрено использование функции wp_is_post_revision(), чтобы получить реальный идентификатор поста, если текущий ID относится к ревизии. Это важно, чтобы избежать ситуации, когда ваш код применим к некорректному объекту.

  2. Создание и обновление заголовка: Заголовок формируется из полей first_name и last_name, после чего он сохраняется в массиве $my_post, который затем используется для обновления поста.

  3. Избежание бесконечного цикла: Ваша проблема возникла из-за вызова wp_update_post() внутри хука save_post, что создало бы бесконечный цикл. Использование remove_action() перед обновлением и add_action() после позволяет избежать этой проблемы.

Рекомендации по Оптимизации

  • Валидация данных: Настоятельно рекомендуется добавить валидацию, чтобы убедиться, что оба поля (имя и фамилия) не пустые. Это можно сделать, проверив empty($first_name) и empty($last_name) перед формированием заголовка.

  • Ошибка обработки: Обратите внимание на возможные ошибки при вызове wp_update_post, чтобы избежать непредвиденных ситуаций. Вы можете рассмотреть возможность использования функции is_wp_error().

Настоятельно рекомендуется использовать вышеприведенный код в вашей теме или плагине WordPress, что обеспечит корректную генерацию заголовков для ваших постов на основе ACF. Это метод не только эффективен, но и соответствует стандартам разработки WordPress, что гарантирует более стабильную и быструю работу вашего сайта.

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

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