web-dev-qa-db-ja.com

ポストパブリッシュのtitle_save_pre

私は、投稿カスタムフィールド内の値を使用してカスタム投稿のタイトルを作成しようとしています。問題は、title_save_preの使用は、投稿を更新したときにのみ実行され、作成したときには実行されないことです。

投稿を作成すると、タイトルが付けられます。(タイトルなし)編集して保存すると、正しいタイトルが付けられます。

バックエンドで正しいタイトルを取得する必要があります。

これは私のコードです:

function update_phone_title($title) {

global $post;

$type = get_post_type($post->ID);

if ( 'phone' == $type) {
    $title = get_post_meta($post->ID, 'manufacturer', TRUE);
    $title .= ' '.get_post_meta($post->ID, 'model', TRUE);
    $title .= ' '.get_post_meta($post->ID, 'memory', TRUE);
} 

return $title;
}
add_filter ('title_save_pre', 'update_phone_title');

Wp_insert_post_data .Iを使って修正されました。

function filter_handler( $data , $postarr )
{
  global $post;
  $id = $post->ID;

  if('phone' == $data['post_type'] && isset($data['post_type']))
    if($id) {
        $title = $_POST['fields']['field_4fd2897fc0bfe']. ' ' . $_POST['fields']['field_4fd2897fc2328'] . ' ' .$_POST['fields']['field_4fd2897fc273a'];
        $data['post_title'] = $title;
    }
  return $data;
}

add_filter( 'wp_insert_post_data' , 'filter_handler' , '99', 2 );
3
Bdesign

フィルタtitle_save_preは、投稿がデータベースに書き込まれる前、およびその投稿メタのいずれかがデータベースに保存される前にも実行されます。そのため、この時点でのget_post_metaは最初の実行では空白になり、常に「古い」データを返します。

これを修正するには、save_postにフックしてそこから投稿を更新します。 save_postは、投稿がデータベースに保存され、組み込みの「カスタムフィールド」が保存された後に実行されます。

これを行うには、 wp_update_post を使用できます。ただし、注意が必要です。

Save_postにフックされたアクション(例えばカスタムメタボックス)によって実行されると、wp_update_post()は無限ループを作成する可能性があります。これは、(1)wp_update_post()によってsave_postが起動され、(2)リビジョンが有効になっているとき(最初にリビジョンを作成するとき、次に元の投稿を更新するとき)に2回呼び出されるために発生します。

Save_postによって呼び出されたコードから投稿を更新する必要がある場合は、post_typeが 'revision'に設定されていないこと、および$ postオブジェクトを更新する必要があることを確認してください。

これを回避する1つの方法は、ここで示されているように 、コールバック内のフックからsave_postコールバックを削除することです

3
Stephen Harris