Вопрос или проблема
Я использую 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 и оптимизации постов!