web-dev-qa-db-ja.com

2つのメタフィールドから投稿タイトルを設定

カスタム投稿タイプでは投稿タイトルを無効にしていますが、投稿リストとスラッグではタイトルを "自動ドラフト"として表示しています。私は自動的に2つのpost-metaを取り、それからタイトルとスラッグを作りたいです。

私はこれでうまくいくと思ったが、それを実現することはできない:

function set_event_title( $data , $postarr ) {
  if($data['post_type'] == 'events') {
    $event_date = get_post_meta($post_id,'event_datetime',true);
    $event_venue = get_post_meta($post_id, 'venue_name' , true);
    $event_title = $event_venue . ' - ' . $event_date;
    $post_slug = sanitize_title_with_dashes ($event_title,'','save');
    $post_slugsan = sanitize_title($post_slug);

    $data['post_title'] = $post_title;
    $data['post_name'] = $post_slugsan;
  }
  return $data;
}

add_filter( 'wp_insert_post_data' , 'set_event_title' , '99', 2 );

誰かが私がどうやってそのことを正しくやるのかを知っていますか?

3
Eckstein

次の行で間違った変数を使用しています。

$data['post_title'] = $post_title;

次のように$ post_titleに$ event_titleを使用してください。

$data['post_title'] = $event_title;

$ postarrパラメータから投稿IDも取得します。

更新されたコード:

function set_event_title( $data , $postarr ) {
  if($data['post_type'] == 'events') {
    $event_date = get_post_meta($postarr['ID'],'event_datetime',true);
    $event_venue = get_post_meta($postarr['ID'], 'venue_name' , true);
    $event_title = $event_venue . ' - ' . $event_date;
    $post_slug = sanitize_title_with_dashes ($event_title,'','save');
    $post_slugsan = sanitize_title($post_slug);

    $data['post_title'] = $event_title;
    $data['post_name'] = $post_slugsan;
  }
  return $data;
}
add_filter( 'wp_insert_post_data' , 'set_event_title' , '10', 2 );

このフィルタの詳細については このページ をご覧ください。

3
Vinod Dalvi

コメントに記載されているように、前回の回答は既存の投稿を保存するときにのみ機能し、新しい投稿を保存するときには機能しないことがわかりました。以下は新しい投稿と既存の投稿に対して機能します。

// func that is going to set our title of our customer magically
function w2w_customers_set_title( $data , $postarr ) {

    // We only care if it's our customer
    if( $data[ 'post_type' ] === 'w2w-customers' ) {

        // get the customer name from _POST or from post_meta
        $customer_name = ( ! empty( $_POST[ 'customer_name' ] ) ) ? $_POST[ 'customer_name' ] : get_post_meta( $postarr[ 'ID' ], 'customer_name', true );

        // if the name is not empty, we want to set the title
        if( $customer_name !== '' ) {

            // sanitize name for title
            $data[ 'post_title' ] = $customer_name;
            // sanitize the name for the slug
            $data[ 'post_name' ]  = sanitize_title( sanitize_title_with_dashes( $customer_name, '', 'save' ) );
        }
    }
    return $data;
}
add_filter( 'wp_insert_post_data' , 'w2w_customers_set_title' , '99', 2 );

最初に$_POST変数のタイトルをチェックします。これは、ほとんどの場合そのタイトルです。そこにない場合は、クイック編集などの処理を行うpost_metaから取得します。

1
Jesse Pearson