商品のパーマリンク設定について

2015 年 8 月 7 日

ホーム フォーラム 使い方全般 商品のパーマリンク設定について

このトピックには10件の返信が含まれ、4人の参加者がいます。1 年、 9 ヶ月前 nanbu さんが最後の更新を行いました。

11件の投稿を表示中 - 1 - 11件目 (全11件中)
  • 投稿者
    投稿
  • #75286

    yousan
    Participant

    こんにちは!
    Welcartをありがたく使わせてもらっています。

    Welcartを導入したサイトにおいて、商品個別ページのパーマリンクを設定したいと思っています。

    例) http://www.example.com/shop/123/
    としたいです。
    現在は標準のパーマリンク設定を
    http://www.example.com [/shop/%post_id%]
    としています。

    ですがこれですと他のカスタム投稿タイプが
    http://www.example.com/shop/blog/123
    のようになってしまいます。

    ですので
    標準のパーマリンク設定を
    http://www.example.com [/%post_id%]
    として、ウェルカートの商品についてのパーマリンクを
    [/shop/%post_id%]
    としようと思っているのですが、何か良い案などはありますでしょうか〜?

    ——————————————-
    WordPress のバージョン:WordPress 4.2.4
    Welcart のバージョン: 1.4.20
    ご利用のテーマ:独自テーマ
    症状を確認したブラウザ:safari, chrome
    サーバー(会社名、サービス名):gmo
    SSLの利用: no
    WordPress のパーマリンク設定:カスタム [/shop/%post_id%]
    ——————————————–

    #75398

    nanbu
    Participant

    こんにちは。

    私はそれができないと思っているのですが、どなたか経験のある方がいらっしゃいましたら教えていただけると助かります。

    #75421

    Mizuho Ogino
    Participant

    Custom Post Type Permalinksというプラグインをつかって、標準のパーマリンクを[/shop/%post_id%]に設定して、カスタム投稿ごとのパーマリンクを[/%post_id%]に設定すれば、ご希望の表示を実現できるのではないでしょうか。

    #75423

    kitamuuu
    Participant

    私も気になったので試してみました。
    Mizuho Ogino様が言うようにCustom Post Type Permalinksを使って設定しようとしたところ、標準のパーマリンクを[/shop/%post_id%]に設定すると、カスタム投稿タイプのパーマリンクにも/shop/が入ってしまうと思うのですが私だけでしょうか。

    #75429

    Mizuho Ogino
    Participant

    「Custom Post Type Permalinks」ダメでしたか^^;
    記憶違いですね、失礼いたしました。

    残った手としては、投稿タイプ「post」をカスタム投稿タイプとして再度レジストしてrewrite設定をするという手があります。「register_post_type」をfunctions.phpに追加します。

    add_action( 'init', 'my_new_default_post_type', 1 );
    function my_new_default_post_type() {
        register_post_type( 'post', array(
            'labels' => array(
                'name_admin_bar' => _x( 'Post', 'add new on admin bar' ),
            ),
            'public'  => true,
            '_builtin' => false, 
            '_edit_link' => 'post.php?post=%d', 
            'capability_type' => 'post',
            'map_meta_cap' => true,
            'hierarchical' => false,
            'rewrite' => array( 'slug' => 'myslug' ),
            'query_var' => false,
            'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
        ) );
    }

    これで 「example.com/myslug/投稿スラッグ」というパーマリンクになります。しかしカスタム投稿と同じく既存のパーマリンク設定が効かないはず。ですので、上記設定後、改めてregister_post_typeした後で「Custom Post Type Permalinks」をインストールする、という手もあると思います(未検証です)。あと、「post」のパーマリンクだけを変えたいなら、以下をfunctions.phpに記述するだけでいけるのではないかと思います。

    
    add_filter('post_type_link', 'my_new_default_post_type_link', 1, 3);
    function my_new_default_post_type_link( $post_link, $post = 0, $leavename = false ) {
        if ($post->post_type == 'post') return home_url( 'myslug/' . $post->ID );
        else return $post_link;
    }
    
    add_action( 'init', 'my_new_default_rewrites_init' );
    function my_new_default_rewrites_init(){
        add_rewrite_rule( 'myslug/([0-9]+)?$', 'index.php?post_type=post&p=$matches[1]', 'top' );
    }

    以上、welcart込みで検証していませんので、動作は保証し兼ねます^^;

    #75437

    yousan
    Participant

    こんにちはー! 近年はカスタム投稿タイプの導入が増えてますし、みなさんお困りだったりするんですね〜。

    実はその後リリースに向けて調整をしましてなんとか解決しました。
    報告が遅くなってしまって申し訳ないです。

    Mizuho OginoさんのおっしゃるCustom Post Type Permalinksと組み合わせて解決しました。

    カスタムパーマリンク: http://www.example.com/ [/%category%/%post_id%]
    
    Custom Post Type Permalinksの設定で
    blog	http://www.example.com/blog  [/%post_id%]
    event http://www.example.com/event  [/%post_id%]
    

    というふうに設定しました!

    商品はすべて「shop」というスラッグのカテゴリに入れてあります。
    こうすることで [%category%] をでshopが出てくるようになりました。

    この [%category%] の仕組みについては

    %category%
    投稿のカテゴリーを取得します。サブカテゴリーは入れ子にされたディレクトリとして取得されます。

    また

    複数カテゴリにした投稿の %category% と %tag%
    一つの投稿に複数カテゴリを指定していても、パーマリンクには一つしか表示できません。一番小さいカテゴリ ID(カテゴリ管理 参照)が使われます。アクセスはどのカテゴリからでも普通にできます。
    パーマリンク構造に %tag% を使用している場合も、同様です。

    http://wpdocs.osdn.jp/パーマリンクの使い方

    とのことでした。
    ですのでスラッグが「shop」のカテゴリにサブカテゴリを作らないようにすることと、shopのIDを若いものに設定することが肝要かと思います 🙂
    (ちなみに今回の案件ではすでに「shop」の下に「新商品」「おすすめ商品」というカテゴリがあったので、それらは階層を一つ上げました。 ((でもサブカテゴリに指定されていても仕様通りのnestedなカテゴリは出力されなかったんですが…))

    どなたかのお役に立てれば幸いです。

    #75443

    kitamuuu
    Participant

    「post」ってカスタム投稿タイプにできてしまうんですね。WordPressとしては問題ないのでしょうか?

    最初に貼っていただいた記述をテーマのfunctions.phpに記述した後、カスタム投稿タイプ「post」のパーマリンクを設定するため、Custom Post Type Permalinksをインストールしましたが、”post”をカスタム投稿タイプと判定してくれないためなのか、カスタム投稿タイプ「post」のパーマリンク設定ができませんでした。

    ですので、後述された2つの記述を使ってカスタム投稿タイプ「post」のときのリンクとリライトルールを指定しました。
    Custom Post Type Permalinksを有効化していると、

    add_filter(‘post_type_link’, ‘my_new_default_post_type_link’, 1, 3);

    の記述の実行順序が1では早すぎて上書きされてしまうため、以下のように11に変更しました。

    add_filter(‘post_type_link’, ‘my_new_default_post_type_link’, 11, 3);

    これでURLはyousan様が希望された形で商品登録から購入までうまく動いている感じですが、やはり「post」をカスタム投稿タイプとしたことで動作に何かしらの影響があるのではないかと気になります。

    #75444

    nanbu
    Participant

    Mizuho Ogino さん

    情報ありがとうございます。

    if ($post->post_type == ‘post’) return home_url( ‘myslug/’

    の部分

    if ($post->post_type == ‘post’ && $post->post_mime_type == ‘item’) return home_url( ‘myslug/’

    とすると商品だけスラッグを変えられるかもしれませんね。

    #75445

    nanbu
    Participant

    yousan さん

    カテゴリーを使うのは最も簡単でいいですね。
    ただ、後から設定しようと思った場合は shop のIDを一番若くするのはちょっと難しいですね。

    因みに私の開発環境の商品詳細ページは、/%category%/%post_id% で以下の様なURLになっています。
    http://****.com/item/632

    そして、shopと言うカテゴリを新たに作って、「商品(item)」カテゴリの親をshopにしてみたところこの様なリンクになりました。
    http://****.com/shop/item/632

    カテゴリー階層によるカスタマイズをしていないのだったら、また、shop/item といった形になっても良いのだったら、こういう手もあるかも知れませんね。

    #75482

    Mizuho Ogino
    Participant

    >yousanさん
    解決されたようで何よりです。いろいろいい加減な記憶と未検証の意見を勢いで書いてしまい申し訳有りません。一助になったならば幸いです。

    >kitamuuuさん
    都度チェックしていただきありがとうございます^^;
    言葉の綾というか、私の表現がまずかったですね。postと他のカスタム投稿とは原則posttype名で区分されているだけですので、おそらく通常の使用では問題は起きにくいと思ってます。変更してるのはrewriteの項目だけですしね。いずれにせよ、アップデート時にチェックする要素を増やすことには間違いないので、ウェブショップのような環境下では一層慎重になるべきかな、と私も思います。

    >nanbuさん
    post_type_linkは出力されるリンクしか変更してくれないので、register_post_typeのrewriteで予め同じパーマリンクを設定していないと404になります。この場合、post_mime_typeがitemのものは表示されるが、それ以外の投稿は404になると思われます。itemとpostのパーマリンクを区別する方法は考えてみたのですが、現状思いつきません。

    #75486

    nanbu
    Participant

    Mizuho Ogino さん

    こんな感じで、URLを分けることはできました。新規登録や更新もできています。
    ただ、やはりビルトインのpostを上書きしている事、パーマリンク設定が無視される事など考えると、個別の環境での検証が必要になってくるかと思います。

    add_action( ‘init’, ‘my_new_default_post_type’, 1 );
    function my_new_default_post_type() {
    register_post_type( ‘post’, array(
    ‘labels’ => array(
    ‘name_admin_bar’ => _x( ‘Post’, ‘add new on admin bar’ ),
    ),
    ‘public’ => true,
    ‘_builtin’ => false,
    ‘_edit_link’ => ‘post.php?post=%d’,
    ‘capability_type’ => ‘post’,
    ‘map_meta_cap’ => true,
    ‘hierarchical’ => false,
    ‘rewrite’ => array( ‘slug’ => ‘myslug’ ),
    ‘query_var’ => false,
    ‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘trackbacks’, ‘custom-fields’, ‘comments’, ‘revisions’, ‘post-formats’ ),
    ));
    }

    add_filter(‘post_type_link’, ‘my_new_default_post_type_link’, 1, 3);
    function my_new_default_post_type_link( $post_link, $post = 0, $leavename = false ) {

    if ( $post->post_type == ‘post’ && $post->post_mime_type == ‘item’ ){
    $post_link = home_url( ‘myslug/’ . $post->ID );
    }else{
    $post_link = home_url( ‘/’ . $post->ID );
    }
    return $post_link;
    }

    add_action( ‘init’, ‘my_new_default_rewrites_init’ );
    function my_new_default_rewrites_init($aa){
    add_rewrite_rule( ‘myslug/([0-9]+)?$’, ‘index.php?post_type=post&p=$matches[1]’, ‘top’ );
    add_rewrite_rule( ‘([0-9]+)?$’, ‘index.php?post_type=post&p=$matches[1]’, ‘top’ );
    }

    ※このコードを有効にするには、WordPress の 管理画面から、「設定」->「パーマリンク設定」を選択し、何も変更せずに「変更を保存」をクリックする必要があります。

    ※CSV一括登録の検証は行っていません。

11件の投稿を表示中 - 1 - 11件目 (全11件中)

このトピックに返信するにはログインが必要です。