web-dev-qa-db-ja.com

投稿を作成するときにパーマリンクをカスタマイズする

私はhousesという名前のカスタム投稿タイプがあります。カスタム投稿タイプの中には、ACFを使用して作成したカスタムフィールドがいくつかあります。

私がしなければならないのは、私が新しい投稿を作成するときにパーマリンクを変更することです。

パーマリンクをカスタマイズするためにコードtitleフィールドを使いたいのですが。 :

//code + post title
4563312-house-example-1

私はすべてを制御するプラグインを開発しています。

パーマリンクを更新するために投稿の作成を仲介する方法はありますか?

ありがとう。

1
Italo Borges

Cedonが私にくれた例、私は私が必要とするものに達することができました、いくつかの変更で。

Wp_insert_post_dataを使用しても、カスタム・フィールド値を取得できませんでした。そのためには、代わりにsave_postを使用する必要がありました。

function rci_custom_permalink($post_id) {
  $post = get_post($post_id);
  if($post->post_type !== 'houses') return;

  $code = get_field('code', $post_id);
  $post_name = sanitize_title($post->post_title);
  $permalink = $code . '-' . $post_name;

  // remove the action to not enter in a loop
  remove_action('save_post', 'rci_custom_permalink');

  // perform the update
  wp_update_post(array('ID' => $post_id, 'post_name' => $permalink));

  // add the action again
  add_action('save_post', 'rci_custom_permalink');
} 

add_action('save_post', 'rci_custom_permalink');

シモンズ:これらのフィールドはすべて必須なので、空かどうかを確認する必要はありませんでした。

Save_postアクションについては、 プラグインAPI /アクションリファレンス/ save post を参照してください。

2
Italo Borges

これはwp_insert_post_dataフックを使って行うことができます。

function house_post_slug( $data ) {
    if ( $data['post_type'] == 'houses' ) {
       $permalink = '';

       if ( isset ( $_POST['ACF Code Field'] ) ) {
          $permalink = $_POST['ACF Code Field'];
       }

       if ( isset ( $_POST['post_title'] ) ) {
          $permalink .= '-' . $_POST['post_title'];
       }

       $data['post_name'] = sanitize_title( $permalink )
    }

    error_log( '=== Filter $data ===');
    error_log( print_r($data, true) );
    return $data;

}
add_filter( 'wp_insert_post_data', 'house_post_slug' );

そのため、このフィルタが行うことはWordPressからの$dataをインターセプトすることです。post_typeフィールドがあなたのカスタム投稿タイプのものであるかどうかを確認して、その特定のCPTに対してのみ起動されるようにしてください。

その後、ACFコードフィールドが設定されているかどうかを確認します。そしてもしそうなら、それは `$ permalinkをその値に設定します。

私はACFを使ったことがないので、それらがどのような構造を使っているのかよくわかりません。あなたはこれを追加することによってダンプを見ることができます:

error_log( print_r ( $_POST, true ) );

次に、post_titleキーが設定されているかどうかを確認します。もしそうなら、それは-post_titleの値が何であれ何でも追加します。

最後に、post_name$dataキーを$permalinkのサニタイズされたバージョンに設定し、それを返します。

診断目的で$dataのダンプを見ることができるように、2つのerror_log()ステートメントを入れました。

3
Cedon