Użycie save_post do zastąpienia tytułu postu

16

Używam niestandardowych postów, w których nie potrzebuję tytułu.

To powoduje, że Wordpress ustawia tytuły moich postów na „Auto Draft”.

Chciałbym zmienić wartość tytułu na coś innego, obliczonego z innych pól w moim poście.

Jak mogę to zrobić za pomocą save_post lub w inny sposób?

Tsahi Levent-Levi
źródło
Edytuj swoje pytanie, aby uwzględnić register_post_type()połączenie.
Chip Bennett
Co dokładnie próbujesz osiągnąć? Nie chcesz w ogóle tytułu postu dla swojego CPT, czy chcesz, aby był ustawiony na podstawie niestandardowej wartości pola?
Rutwick Gangurde
1
Nie chcę go wcale, ale na liście postów nie mogę go usunąć, ponieważ nie będę już mógł edytować postów. Oznacza to, że potrzebuję sposobu, aby zamiast tego umieścić „fałszywy” tytuł.
Tsahi Levent-Levi
1
Więc tak naprawdę chcesz zmodyfikować ekran zarządzania postami, aby wyświetlać różne kolumny dla niestandardowego typu postów? Jeśli tak, to może być bardziej korzystne pytanie. :)
Chip Bennett
To tylko część. Zadaje się tego rodzaju pytania dotyczące „wpływu”, ponieważ szuka on odpowiedzi, która pomoże mu zorganizować wiele aspektów projektu. Wyszukiwanie, tworzenie szablonów itp.
e4rthdog

Odpowiedzi:

16

Ta najprostsza metoda polegałaby na edycji danych w miejscu, w którym zostały wstawione, zamiast późniejszej aktualizacji, przy użyciu wp_insert_post_datazamiast save_post. Działa to na tworzenie nowego postu lub aktualizowanie istniejącego postu bez zmian. Pozwala to także uniknąć niebezpieczeństwa tworzenia nieskończonej pętli, wyzwalając ją update_postwewnątrz save_post.

add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Grabs the inserted post data so you can modify it.

function modify_post_title( $data )
{
  if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // If the actual field name of the rating date is different, you'll have to update this.
    $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
    $title = 'TV ratings for ' . $date;
    $data['post_title'] =  $title ; //Updates the post title to your new title.
  }
  return $data; // Returns the modified data.
}
SinisterBeard
źródło
10

Miałem dokładnie taką samą potrzebę, więc napisałem tę funkcję - która działa. Zmodyfikuj go do swoich potrzeb. Mam nadzieję że to pomoże.

// set daily rating title
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 ratings for ' . $date;
        $where = array( 'ID' => $post_id );
        $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
    }
}
add_action('save_post', 'set_rating_title', 12 );
Biranit Goren
źródło
2

Wypróbuj filtr default_title :

add_filter( 'default_title', 'my_default_title', 10, 2 );

function my_default_title( $post_title, $post ){

  $custom_post_type = 'my_awesome_cpt';

  // do it only on your custom post type(s)
  if( $post->post_type !== $custom_post_type )
    return $post_title;

  // create your preferred title here
  $post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );

  return $post_title;
}
Ralf912
źródło
1
To rozwiązanie nie pozwala na utworzenie tytułu „obliczonego z innych pól w moim poście” - zgodnie z żądaniem. W porządku, jeśli możesz wygenerować automatyczny tytuł dla wszystkich tego rodzaju postów. Ale jeśli musisz polegać na jakiejś zmiennej dynamicznej, to nie pomoże.
Biranit Goren
1
@Biranit Goren Co oznacza „wyliczony z innych pól w moim poście”? W którym polu brakowało zapisanego obiektu wpisu $post? Przeczytaj wstępne pytanie i komentarze poniżej. Automatycznie wygenerowany tytuł postu nie jest wymagany. Potrzebny jest tylko fałszywy tytuł postu (zamiennik WordPress „Auto Draft”).
Ralf912,
2

Oto rozwiązanie, które wykorzystuje zmienną statyczną, aby zapobiec nieskończonej pętli. Pozwala to bezpiecznie wywoływać wp_update_post()funkcję podpiętą do funkcji save_post.

function km_set_title_on_save( $post_id ) {

    // Set this variable to false initially.
    static $updated = false;

    // If title has already been set once, bail.
    if ( $updated ) {
        return;
    }

    // Since we're updating this post's title, set this
    // variable to true to ensure it doesn't happen again.
    $updated = true;

    $date           = get_post_meta( $post_id, 'rating_date', true );
    $date_formatted = date( 'l, d.m.Y', strtotime( $date ) );

    // Update the post's title.
    wp_update_post( [
        'ID'         => $post_id,
        'post_title' => 'TV ratings for ' . $date_formatted,
    ] );
}
add_action( 'save_post', 'km_set_title_on_save' );

Uwaga: Aby ograniczyć tę funkcjonalność do określonego typu postów, użyj haka save_post _ {$ post-> post_type} zamiast save_post.

Kellen Mace
źródło