サポート » 使い方全般 » 投稿者スラッグを自動で付加して記事のスラッグを作成したい

  • 解決済 NAOKING

    (@naoking)


    はじめまして。
    現在、会員制のポータルサイトを作成していて、投稿スラッグ(postname)に投稿者スラッグ(author)を接頭語として付加したうえで保存できないか悩んでおります。

    このサイトでは、記事(カスタム投稿)を複数の投稿者が投稿します。
    その際に、各投稿者が同じ投稿スラッグ(postname)を設定しようとすると、同一カスタム投稿内なので重複のため枝番が自動で振られてしまいます。

    パーマリンクの設定で、「%author%-%postname%」はやってみてましたが、URL上はできますが、やはり%postname%の重複は許されませんでした(当たり前ですね。)

    これの解決策として、
    「投稿者スラッグ(author)-任意のスラッグ(カスタムフィールドを用意します)」
    で投稿スラッグ(postname)を自動作成できないでしょうか。

    イメージとしては、
    投稿者aaaとbbbがそれぞれhogehogeという同じスラッグで記事を作りたい場合、
    「aaa-hogehoge」
    「bbb-hogehoge」
    で記事スラッグ(postname)を保存する。
    aaa-やbbb-の部分を手で書かせればよいのですが、ここを自動化できないだろうかというのがご相談の内容になります。

    よろしくお願いします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • mocomoco

    (@silent_dandy)

    wp_insert_post_dataフィルターをうまく使えばできそうな感じです。

    WordPressの投稿・更新内容をフックで強制変更する
    https://worklog.be/archives/2108

    function add_author_to_postname( $data, $postarr ) {
      if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $author_name = get_the_author_meta('user_nicename',$data['post_author']);
        $data['post_name'] = sanitize_title( $author_name.'-'.$data['post_title'] );
      }
    
      return $data;
    }
    add_filter( 'wp_insert_post_data', 'add_author_to_postname', 99, 2 );

    こんな感じでどうでしょうか?

    mocomocoさま
    ありがとうございます!イメージ通りのことができました。
    とても助かりました。

    ご報告と同じお悩みの方へのご参考までに、少し手を加えたものを載せておきます。

    function add_author_to_postname( $data, $postarr ) {
      if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $author_name = get_the_author_meta('user_nicename',$data['post_author']);
    	global $post;
    	$courseslug = get_post_meta( $post->ID,'customslug',true );
        $data['post_name'] = sanitize_title( $author_name.'-'.$customslug );
      }
    
      return $data;
    }
    add_filter( 'wp_insert_post_data', 'add_author_to_postname', 99, 2 );

    私はpostnameがどうしても日本語になってしまうので、別途カスタムフィールド「customslug」を作って使うようにしました。
    最初うまくいきませんでしたが、function.phpの中でカスタムフィールをの値を呼び出すために「global $post;」を追加することで解決できました。
    ただ、このやり方だと、「$post->ID」の部分で先にpostIDができていないとカスタムフィールドを参照しないため、初回投稿時にはauthor_nameのみで格納、同記事を一度更新すると「author_name-cutomslug」で格納されるという感じになります。
    あまりスマートではないですがこれは仕方ないですね。。

    改めまして、本当にありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「投稿者スラッグを自動で付加して記事のスラッグを作成したい」には新たに返信することはできません。