Использование save_post для замены заголовка записи

21 нояб. 2012 г., 20:46:36
Просмотры: 27.6K
Голосов: 26

Я использую произвольные типы записей, и в них мне не нужен заголовок.

Из-за этого WordPress устанавливает заголовки моих записей как "Auto Draft".

Я хотел бы изменить значение заголовка на что-то другое, вычисляемое из других полей в моей записи.

Как мне это сделать, используя save_post или какой-либо другой способ?

5
Комментарии

Пожалуйста, отредактируйте ваш вопрос, включив в него вызов функции register_post_type().

Chip Bennett Chip Bennett
21 нояб. 2012 г. 20:54:17

Что именно вы пытаетесь достичь? Вы вообще не хотите иметь заголовок записи для вашего CPT или хотите, чтобы он устанавливался из значения произвольного поля?

Rutwick Gangurde Rutwick Gangurde
21 нояб. 2012 г. 21:01:04

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

Tsahi Levent-Levi Tsahi Levent-Levi
21 нояб. 2012 г. 21:28:54

Итак, что вы действительно хотите сделать — это изменить экран управления записями, чтобы выводить разные колонки для вашего пользовательского типа записи? Если да, то, возможно, это был бы более полезный вопрос. :)

Chip Bennett Chip Bennett
21 нояб. 2012 г. 21:38:42

Это лишь часть. Такие вопросы о "влиянии" задают, потому что ищут ответ, который поможет организовать многие аспекты проекта. Поиск, шаблоны и т.д.

e4rthdog e4rthdog
14 февр. 2016 г. 12:36:52
Все ответы на вопрос 4
0
24

Самый простой метод — редактировать данные в момент их вставки, а не обновлять их позже, используя 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; // Возвращает измененные данные.
}
11 авг. 2015 г. 11:09:48
0
12

У меня была точно такая же потребность, поэтому я написал эту функцию - она работает. Модифицируйте её под свои нужды. Надеюсь, это поможет.

// установка заголовка ежедневного рейтинга
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 );
21 нояб. 2012 г. 23:18:53
1

Вот решение, которое использует статическую переменную для предотвращения бесконечного цикла. Это позволяет безопасно вызывать 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.

1 сент. 2018 г. 07:29:35
Комментарии

Возможно, вам нужно добавить if ($_POST['post_type']!='rating')

samjco-com samjco-com
22 дек. 2021 г. 01:17:30
2

Попробуйте фильтр 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;
}
21 нояб. 2012 г. 23:16:03
Комментарии

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

Biranit Goren Biranit Goren
21 нояб. 2012 г. 23:45:16

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

Ralf912 Ralf912
22 нояб. 2012 г. 22:10:04