save_postを使用して投稿のタイトルを置き換える


16

私はカスタム投稿を使用していますが、これらではタイトルは必要ありません。

これにより、Wordpressは私の投稿のタイトルを「自動ドラフト」に設定します。

タイトルの値を、投稿内の他のフィールドから計算された別の値に変更したいと思います。

save_postまたは他の手段を使用してこれを行うにはどうすればよいですか?


質問を編集してregister_post_type()通話を含めてください。
チップベネット

正確に何を達成しようとしていますか?CPTの投稿タイトルがまったく必要ないのですか、それともカスタムフィールド値から設定したいのですか?
ラトウィックガンガード

1
まったく必要ありませんが、投稿を編集できないため、投稿リストから削除できません。これは、代わりに何らかの「偽の」タイトルを配置する方法が必要であることを意味します。
ツァヒレヴェントレヴィ

1
だから、あなたが本当にやりたいことは、投稿の管理画面を変更して、カスタム投稿タイプのさまざまな列を出力することですか?もしそうなら、それは尋ねるより有益な質問かもしれません。:)
チップベネット

一部jsutです。このような「影響」の質問をするのは、プロジェクトの多くの側面を整理するのに役立つ答えを探すためです。検索、テンプレートなど
-e4rthdog

回答:


16

この最も簡単な方法は、のwp_insert_post_data代わりにを使用して、後で更新するのではなく、挿入されたポイントでデータを編集することですsave_post。これは、新しい投稿を作成するか、既存の投稿を変更せずに更新するときに機能します。また、update_post内でトリガーすることにより、無限ループを作成する危険を回避します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

私はまったく同じニーズを持っていたので、この関数を書いた-それは動作します。必要に応じて変更してください。お役に立てれば。

// 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か?最初の質問と以下のコメントを読んでください。自動生成された役職は要求されません。偽のポストタイトル(WordPress "Auto Draft"の代替)のみが必要です。
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' );

注:この機能を特定の投稿タイプに制限するには、save_postの 代わりにsave_post _ {$ post-> post_type}フックを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.