Как я могу сохранить настраиваемое название поста и слаг с помощью настраиваемого поля?

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

Я использую Advanced Custom Fields и у меня есть пользовательский тип записей под названием ‘рецепт’.

Я использую следующий код, чтобы установить пользовательский заголовок записи, основываясь на пользовательском поле под названием recipe_name:

function my_post_title_updater( $post_id ) {

$my_post = array();
$my_post['ID'] = $post_id;

$recipe_name       = get_field('recipe_name');

if ( get_post_type() == 'recipe' ) {
  $my_post['post_title'] = get_field('recipe_name');
}

// Обновить запись в базе данных
wp_update_post( $my_post );

}
// выполняется после сохранения данных $_POST['fields'] ACF
add_action('acf/save_post', 'my_post_title_updater', 20);

Этот код работает отлично… но я пытаюсь также выяснить, как запустить функцию ниже дополнительно, но я не вижу, чтобы мои слаги записей обновлялись вообще. Они сохраняются как “auto-draft-4” и увеличиваются с этого.

function slug_save_post_callback( $post_ID, $post, $update ) {
// разрешить 'publish', 'draft', 'future'
if ($post->post_type != 'recipe' || $post->post_status == 'auto-draft')
    return;

// изменить слаг только когда запись создается (оба значения даты равны)
if ($post->post_date_gmt != $post->post_modified_gmt)
    return;

// используем заголовок, так как $post->post_name может иметь уникальные номера
$new_slug = sanitize_title( $post->post_title, $post_ID );
$subtitle = sanitize_title( get_field( 'subtitle', $post_ID ), '' );
if (empty( $subtitle ) || strpos( $new_slug, $subtitle ) !== false)
    return; // Нет подзаголовка или уже в слоге

$new_slug .= '-' . $subtitle;
if ($new_slug == $post->post_name)
    return; // уже установлено

// отключаем эту функцию, чтобы избежать бесконечного цикла
remove_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );
// обновляем слаг записи (WP обрабатывает уникальный слаг записи)
wp_update_post( array(
    'ID' => $post_ID,
    'post_name' => $new_slug
));
// повторно подключаем эту функцию
add_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );
}
add_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );

Я нашел код, который позволяет генерировать и Заголовок записи, и Слаг из данных пользовательских полей:

function recipe_update_title( $value, $post_id, $field ) {

$new_title = get_field( 'recipe_name', $post_id) . ' ' . $value;
$new_slug = sanitize_title( $new_title );

// обновляем запись
$recipe_postdata = array(
    'ID'          => $post_id,
    'post_title'  => $new_title,
    'post_name'   => $new_slug,
);  

if ( ! wp_is_post_revision( $post_id ) ){

    // отключаем эту функцию, чтобы она не зацикливалась бесконечно
    remove_action('save_post', 'recipe_update_title');

    // обновляем запись, что вызывает save_post снова
    wp_update_post( $recipe_postdata );

    // повторно подключаем эту функцию
    add_action('save_post', 'recipe_update_title');
}   

return $value;
}

add_filter('acf/update_value/name=recipe_featured_image', 'recipe_update_title', 10, 3);

Ответ или решение

Сохранение пользовательского заголовка и слага с помощью пользовательского поля в WordPress, особенно при использовании плагина Advanced Custom Fields (ACF), может представлять собой задача, требующую тщательной проработки кода. Рассмотрим, как эффективно реализовать это с помощью предложенного кода, обеспечив корректное обновление заголовков и слагов для пользовательского типа записи "рецепт".

1. Подход к решению задачи

Для достижения цели вам необходимо создать несколько функций, каждая из которых отвечает за определённые аспекты обновления заголовка и слага. Сначала мы сосредоточимся на функции, обновляющей заголовок, а затем на функции, которая будет заниматься слагом.

2. Обновление заголовка поста

Вы уже используете функцию my_post_title_updater, которая обновляет заголовок поста. Подобный подход можно оставить, но следует внести некоторые улучшения для лучшей обработки. Вот обновлённый код:

function my_post_title_updater( $post_id ) {
    // Проверка типа записи
    if ( get_post_type( $post_id ) != 'recipe' ) {
        return; 
    }

    // Получаем название рецепта из пользовательского поля
    $recipe_name = get_field('recipe_name', $post_id);

    // Если есть значение, обновляем заголовок поста
    if ( ! empty( $recipe_name ) ) {
        $my_post = array(
            'ID'         => $post_id,
            'post_title' => sanitize_text_field( $recipe_name ),
        );

        // Обновляем пост в базе данных
        wp_update_post( $my_post );
    }
}
add_action('acf/save_post', 'my_post_title_updater', 20);

3. Обновление слага поста

Функция slug_save_post_callback также нуждается в доработке. Мы можем оптимизировать обновление слага, чтобы гарантировать, что он соответствует обновлённому заголовку. Вот как это можно сделать:

function slug_save_post_callback( $post_ID, $post, $update ) {
    // Проверка типа записи и статуса
    if ( $post->post_type != 'recipe' || $post->post_status == 'auto-draft' ) {
        return;
    }

    // Получаем заголовок и создаем слаг
    $new_slug = sanitize_title( get_field('recipe_name', $post_ID) );

    // Проверяем, изменился ли слаг
    if ( $new_slug && $new_slug != $post->post_name ) {
        // Обеспечиваем отсутствие зацикливания
        remove_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );

        wp_update_post( array(
            'ID' => $post_ID,
            'post_name' => $new_slug
        ));

        // Восстанавливаем действие
        add_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );
    }
}
add_action( 'acf/save_post', 'slug_save_post_callback', 21, 3 );

4. Заключение

Следует заключить, что правильное обновление заголовка и слага поста является ключевым для удобства использования и SEO вашего сайта на WordPress. Создавая такие функции, как описанные выше, вы гарантируете, что заголовки и слаги будут актуальными и соответствующими содержимому ваших рецептов.

Оптимизация SEO

Не забывайте, что у вас есть возможность выполнить дополнительные действия для SEO-оптимизации, такие как использование мета-тегов, создание XML-карт и интеграция с плагинами SEO, такими как Yoast SEO. Это также увеличит видимость ваших записей в поисковых системах и поможет пользователям легче находить ваш контент.

Теперь вы готовы к работе с пользовательскими полями в ACF и оптимизации постов!

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

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