Yayının başlığını değiştirmek için save_post kullanma


16

Özel yayınlar kullanıyorum ve bunlarda başlığa ihtiyacım yok.

Bu, Wordpress'in gönderilerimin başlıklarını "Otomatik Taslak" olarak ayarlamasına neden olur.

Başlığın değerini, yayınımdaki diğer alanlardan hesaplanan başka bir şeye değiştirmek istiyorum.

Bunu save_post veya başka bir yöntemle nasıl yapabilirim?


Lütfen sorunuzu register_post_type()aramanızı içerecek şekilde düzenleyin .
Chip Bennett

Tam olarak ne elde etmeye çalışıyorsunuz? CPT'niz için bir gönderi başlığı istemiyor musunuz yoksa özel bir alan değerinden ayarlanmasını mı istiyorsunuz?
Rutwick Gangurde

1
Hiç istemiyorum, ancak yayınlar listesinde artık yayınları düzenleyemeyeceğim için kaldıramıyorum. Bu, onun yerine bir tür "sahte" bir başlık koymak için bir yola ihtiyacım olduğu anlamına gelir.
Tsahi Levent-Levi

1
Peki, gerçekten yapmak istediğiniz şey, yazıları yönet ekranını değiştirmek, özel yazı türünüz için farklı sütunlar çıkarmak mı? Eğer öyleyse, sormak daha faydalı bir soru olabilir. :)
Chip Bennett

Jsut bir parçadır. Biri bu tür "etki" soruları sorar, çünkü bir projenin birçok yönünü düzenlemesine yardımcı olmak için bir cevap arar. Arama, şablonlama vb.
e4rthdog

Yanıtlar:


16

Bu en basit yöntem, daha doğrusu sonradan güncellenmesi daha kullanarak o takılı bulunuyor noktada verileri düzenlemek olacaktır wp_insert_post_datayerine save_post. Bu, yeni bir yazı oluşturma veya mevcut bir yayını değişiklik yapmadan güncelleme üzerinde çalışır. Ayrıca, update_postiçinde tetikleyerek sonsuz bir döngü oluşturma tehlikesini de önler 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

Aynı ihtiyacı vardı, bu yüzden bu işlevi yazdım - işe yarıyor. İhtiyaçlarınıza göre değiştirin. Bu yardımcı olur umarım.

// 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 filtresini deneyin :

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
Bu çözüm, istendiği gibi "yazımdaki diğer alanlardan hesaplanan" başlık oluşturulmasına izin vermiyor. Bu tür tüm yayınlar için otomatik bir başlık oluşturabilirseniz sorun yok. Ancak, bazı dinamik değişkenlere ihtiyacınız varsa, bu yardımcı olmaz.
Biranit Goren

1
@Biranit Goren "Yazımdaki diğer alanlardan hesaplanan" ne anlama geliyor? Saklanan posta nesnesindeki hangi alanı kaçırdınız $post? Lütfen ilk soruyu ve aşağıdaki yorumları okuyun. Otomatik oluşturulan sonrası Filmler edilir değil istedi. Yalnızca sahte bir mesaj başlığı (WordPress "Otomatik Taslak" yerine geçmesi) gerekir.
Ralf912

2

Sonsuz bir döngüyü önlemek için statik bir değişken kullanan bir çözüm. Bu wp_update_post(), bağlanan bir fonksiyonun içinde güvenle arama yapmanızı sağlar 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' );

Not: Bu işlevi belirli bir gönderi türüyle sınırlamak için, save_post yerine save_post _ {$ post-> post_type} kancasını kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.