Sử dụng save_post để thay thế tiêu đề của bài viết


16

Tôi đang sử dụng các bài đăng tùy chỉnh và trong số này, tôi không cần tiêu đề.

Điều này khiến Wordpress đặt tiêu đề bài viết của tôi thành "Bản nháp tự động".

Tôi muốn thay đổi giá trị của tiêu đề thành một thứ khác, được tính từ các trường khác trong bài viết của tôi.

Làm thế nào để tôi thực hiện điều đó bằng cách sử dụng save_post hoặc một số phương tiện khác?


Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm register_post_type()cuộc gọi của bạn .
Chip Bennett

Bạn đang cố gắng để đạt được chính xác là gì? Bạn hoàn toàn không muốn một tiêu đề bài viết cho CPT của mình hoặc bạn muốn nó được đặt từ một giá trị trường tùy chỉnh?
Rutwick Gangurde

1
Tôi hoàn toàn không muốn nó, nhưng trong danh sách bài viết tôi không thể xóa nó vì tôi sẽ không thể chỉnh sửa bài viết nữa. Điều này có nghĩa là tôi cần một cách để đặt tiêu đề "giả" của một số loại thay thế.
Tsahi Levent-Levi

1
Vì vậy, những gì bạn thực sự muốn làm là sửa đổi màn hình quản lý bài viết, để xuất các cột khác nhau cho loại bài đăng tùy chỉnh của bạn? Nếu vậy, đó có thể là một câu hỏi có lợi hơn để hỏi. :)
Chip Bennett

Đây là một phần. Một người hỏi loại câu hỏi "tác động" này bởi vì anh ta tìm kiếm một câu trả lời để giúp anh ta đạt được nhiều khía cạnh của một dự án. Tìm kiếm, tạo khuôn mẫu, v.v.
e4rthdog 14/2/2016

Câu trả lời:


16

Phương pháp đơn giản nhất này sẽ là chỉnh sửa dữ liệu tại điểm được chèn, thay vì cập nhật dữ liệu sau đó, sử dụng wp_insert_post_datathay vì save_post. Điều này hoạt động trên việc tạo một bài đăng mới hoặc cập nhật một bài đăng hiện có mà không thay đổi. Nó cũng tránh được nguy cơ tạo ra một vòng lặp vô hạn bằng cách kích hoạt update_postbên trong 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.
}

10

Tôi có cùng một nhu cầu, vì vậy tôi đã viết chức năng này - hoạt động. Sửa đổi nó theo nhu cầu của bạn. Hi vọng điêu nay co ich.

// 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 );

2

Hãy thử bộ lọc 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;
}

1
Giải pháp này không cho phép tạo tiêu đề "được tính từ các trường khác trong bài viết của tôi" - theo yêu cầu. Sẽ ổn thôi, nếu bạn có thể tạo một tiêu đề tự động cho tất cả các bài viết thuộc loại đó. Nhưng nếu bạn cần phụ thuộc vào một số biến động thì điều này sẽ không có ích.
Biranit Goren

1
@Biranit Goren "Tính toán từ các lĩnh vực khác trong bài viết của tôi" nghĩa là gì? Trường nào bạn đã bỏ lỡ trong đối tượng bài được lưu trữ trong $post? Xin vui lòng đọc câu hỏi ban đầu và các ý kiến ​​dưới đây. Một tiêu đề bài được tạo tự động không được yêu cầu. Chỉ cần một bài đăng giả mạo (thay thế cho "Bản nháp tự động" của WordPress) là cần thiết.
Ralf912

2

Đây là một giải pháp sử dụng một biến tĩnh để ngăn chặn một vòng lặp vô hạn. Điều này cho phép bạn gọi một cách an toàn wp_update_post()bên trong một chức năng được nối với 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' );

Lưu ý: Để giới hạn chức năng này ở một loại bài đăng nhất định, hãy sử dụng hook save_post _ {$ post-> post_type} thay vì save_post.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.