ใช้ save_post เพื่อแทนที่ชื่อโพสต์


16

ฉันใช้โพสต์ที่กำหนดเองและในเหล่านี้ฉันไม่ต้องการชื่อ

ทำให้ Wordpress ตั้งชื่อหนังสือของฉันเป็น "ร่างอัตโนมัติ"

ฉันต้องการเปลี่ยนค่าของชื่อเรื่องเป็นอย่างอื่นโดยคำนวณจากฟิลด์อื่นในโพสต์ของฉัน

ฉันจะทำเช่นนั้นโดยใช้ save_post หรือวิธีการอื่นได้อย่างไร


โปรดแก้ไขคำถามของคุณเพื่อรวมการregister_post_type()โทรของคุณ
Chip Bennett

คุณพยายามทำอะไรให้สำเร็จ คุณไม่ต้องการชื่อโพสต์สำหรับ CPT ของคุณเลยหรือคุณต้องการตั้งค่าจากค่าฟิลด์ที่กำหนดเอง
Rutwick Gangurde

1
ฉันไม่ต้องการเลย แต่ในรายการโพสต์ฉันไม่สามารถลบได้เพราะฉันจะไม่สามารถแก้ไขโพสต์ได้อีก ซึ่งหมายความว่าฉันต้องการวิธีการวางชื่อ "ปลอม" บางชนิดแทน
Tsahi Levent-Levi

1
ดังนั้นสิ่งที่คุณต้องการทำจริงๆคือแก้ไขหน้าจอจัดการโพสต์เพื่อส่งออกคอลัมน์ที่แตกต่างกันสำหรับประเภทโพสต์ที่คุณกำหนดเอง ถ้าเป็นเช่นนั้นอาจเป็นคำถามที่เป็นประโยชน์มากกว่าที่จะถาม :)
Chip Bennett

มันเป็นส่วนหนึ่งของ jsut หนึ่งถามคำถาม "กระทบ" ประเภทนี้เพราะเขาพยายามหาคำตอบเพื่อช่วยเขาดำเนินการหลายด้านของโครงการ ค้นหาเทมเพลต ฯลฯ
e4rthdog

คำตอบ:


16

วิธีที่ง่ายนี้จะสามารถแก้ไขข้อมูลที่จุดที่มันแทรกมากกว่าปรับปรุงมันหลังจากนั้นใช้แทนwp_insert_post_data save_postสิ่งนี้ใช้ได้กับการสร้างโพสต์ใหม่หรืออัปเดตโพสต์ที่มีอยู่โดยไม่มีการเปลี่ยนแปลง นอกจากนี้ยังหลีกเลี่ยงอันตรายจากการสร้างห่วงอนันต์โดยวิกฤติภายในupdate_postsave_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

ฉันมีความต้องการแบบเดียวกันดังนั้นฉันจึงเขียนฟังก์ชันนี้ - ซึ่งใช้งานได้ ปรับเปลี่ยนตามความต้องการของคุณ หวังว่านี่จะช่วยได้

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

ลองใช้ตัวกรอง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
โซลูชันนี้ไม่อนุญาตให้สร้างชื่อ "คำนวณจากเขตข้อมูลอื่นในโพสต์ของฉัน" - ตามที่ร้องขอ ไม่เป็นไรถ้าคุณสามารถสร้างชื่ออัตโนมัติสำหรับโพสต์ทั้งหมดของประเภทนั้น แต่ถ้าคุณต้องการตัวแปรแบบไดนามิกบางอย่างแล้วสิ่งนี้จะไม่ช่วย
Biranit Goren

1
@Biranit Goren "การคำนวณจากฟิลด์อื่น ๆ ในโพสต์ของฉัน" หมายถึงอะไร ซึ่งข้อมูลที่คุณไม่ควรพลาดในวัตถุที่เก็บไว้ในโพสต์$post? โปรดอ่านคำถามเริ่มต้นและความคิดเห็นด้านล่าง ไม่ขอโพสต์ titel ที่สร้างขึ้นโดยอัตโนมัติ ต้องการโพสต์ titel ปลอม (แทนที่ "WordPress แบบร่างอัตโนมัติ") เท่านั้นที่จำเป็น
Ralf912

2

นี่คือโซลูชันที่ใช้ตัวแปรแบบสแตติกเพื่อป้องกันการวนซ้ำไม่สิ้นสุด นี้จะช่วยให้คุณได้อย่างปลอดภัยโทรภายในของฟังก์ชั่นที่เป็นที่ติดยาเสพติดไปยังwp_update_post()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' );

หมายเหตุ: หากต้องการ จำกัด ฟังก์ชันนี้เฉพาะบางประเภทโพสต์ให้ใช้hook save_post _ {$ post-> post_type} hook แทน save_post

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.