Использование save_post для замены заголовка записи
Я использую произвольные типы записей, и в них мне не нужен заголовок.
Из-за этого WordPress устанавливает заголовки моих записей как "Auto Draft".
Я хотел бы изменить значение заголовка на что-то другое, вычисляемое из других полей в моей записи.
Как мне это сделать, используя save_post или какой-либо другой способ?

Самый простой метод — редактировать данные в момент их вставки, а не обновлять их позже, используя wp_insert_post_data
вместо save_post
. Этот способ работает как при создании нового поста, так и при обновлении существующего без изменений. Он также позволяет избежать опасности создания бесконечного цикла, который может возникнуть при вызове update_post
внутри save_post
.
add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Перехватывает данные вставляемого поста для их модификации.
function modify_post_title( $data )
{
if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // Если фактическое название поля даты рейтинга отличается, его необходимо обновить здесь.
$date = date('l, d.m.Y', strtotime($_POST['rating_date']));
$title = 'TV рейтинги за ' . $date;
$data['post_title'] = $title ; // Обновляет заголовок поста на новый.
}
return $data; // Возвращает измененные данные.
}

У меня была точно такая же потребность, поэтому я написал эту функцию - она работает. Модифицируйте её под свои нужды. Надеюсь, это поможет.
// установка заголовка ежедневного рейтинга
function set_rating_title ($post_id) {
if ( $post_id == null || empty($_POST) )
return;
if ( !isset( $_POST['post_type'] ) || $_POST['post_type']!='rating' )
return;
if ( wp_is_post_revision( $post_id ) )
$post_id = wp_is_post_revision( $post_id );
global $post;
if ( empty( $post ) )
$post = get_post($post_id);
if ($_POST['rating_date']!='') {
global $wpdb;
$date = date('l, d.m.Y', strtotime($_POST['rating_date']));
$title = 'TV рейтинги за ' . $date;
$where = array( 'ID' => $post_id );
$wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
}
}
add_action('save_post', 'set_rating_title', 12 );

Вот решение, которое использует статическую переменную для предотвращения бесконечного цикла. Это позволяет безопасно вызывать wp_update_post()
внутри функции, подключенной к хуку save_post
.
function km_set_title_on_save( $post_id ) {
// Изначально устанавливаем переменную в false.
static $updated = false;
// Если заголовок уже был установлен ранее, выходим.
if ( $updated ) {
return;
}
// Поскольку мы обновляем заголовок этого поста,
// устанавливаем переменную в true, чтобы избежать повторного выполнения.
$updated = true;
$date = get_post_meta( $post_id, 'rating_date', true );
$date_formatted = date( 'l, d.m.Y', strtotime( $date ) );
// Обновляем заголовок поста.
wp_update_post( [
'ID' => $post_id,
'post_title' => 'Рейтинги ТВ за ' . $date_formatted,
] );
}
add_action( 'save_post', 'km_set_title_on_save' );
Примечание: Чтобы ограничить эту функциональность определенным типом записи, используйте хук save_post_{$post->post_type} вместо save_post.

Попробуйте фильтр default_title:
add_filter( 'default_title', 'my_default_title', 10, 2 );
function my_default_title( $post_title, $post ){
$custom_post_type = 'my_awesome_cpt';
// выполняем только для вашего типа записи (custom post type)
if( $post->post_type !== $custom_post_type )
return $post_title;
// создаем предпочитаемый заголовок здесь
$post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );
return $post_title;
}

Это решение не позволяет создать заголовок, "вычисляемый из других полей в моей записи" - как запрошено. Оно подходит, если вам нужно генерировать автоматический заголовок для всех записей такого типа. Но если вам нужно зависеть от какой-то динамической переменной, то это не поможет.

@Biranit Goren Что означает "вычисляемый из других полей в моей записи"? Какое поле вам не хватило в объекте записи, хранящемся в $post
?
Пожалуйста, прочтите первоначальный вопрос и комментарии ниже. Автоматически сгенерированный заголовок записи не запрашивается. Нужен только фальшивый заголовок записи (замена для WordPress "Auto Draft").
