マルチサイトで「Custom Post Type Permalink」[WordPress]
マルチサイト化したWordPressで「Custom Post Type Permalink」プラグインの「wp_get_archives()」でカスタム投稿タイプのアーカイブリストを表示するとリンク先がおかしくなってしまう場合の対処法です。
まえがきが若干ながいので必要なければ飛ばしてください。
次項:マルチサイトでも『Custom Post Type Permalinks』の「wp_get_archives()」を正常に機能させる
まえがき
カスタム投稿タイプを一つのコンテンツとして利用する場合、必ずと言っていいほど必要になってくる『Custom Post Type Permalinks』というプラグインがあります。
主な機能としては「wp_get_archives()」関数でカスタム投稿タイプ別の月別アーカイブリストを表示できるようになったり、タクソノミーのアーカイブページのパーマリンクをいい感じに最適化してくれたりします。
『Custom Post Type Permalinks』の詳しい使い方は下記記事を参考にしてください。
カスタム投稿タイプのパーマリンクを変更する『Custom Post Type Permalinks』
この『Custom Post Type Permalinks』には一つ問題があります。
例えばマルチサイト化したWordPressで全ブログのサイドバーに「wp_get_archives()」関数でカスタム投稿タイプ別の月別アーカイブリストを表示しようとすると、カスタム投稿タイプを追加したブログ以外のページで「wp_get_archives()」関数が出力したアーカイブリストのリンク先がおかしくなります。
普通は
http://kotori-blog.com/サイト名/投稿タイプ名/date/2014/03
のような形式でリンクがはられます。
しかし、カスタム投稿タイプを追加したブログ以外のページ上では
http://kotori-blog.com/サイト名/2014/03
のような形式でリンクがはられるため404エラーとなってしまいます。
ちょうどこの記事を書いている一か月前くらいに『Custom Post Type Permalinks』がバージョンアップされたのですがこの現象には対応されていないようでした。
しかし先日、どうしてもマルチサイト上で『Custom Post Type Permalinks』で「wp_get_archives()」でカスタム投稿タイプの月別アーカイブリストを全ブログに表示しなければならない状況に追い込まれたため、頑張って正常にリンクがはられるように修正しました!
かなりの力技ですが笑
折角なのでその方法を紹介したいと思います。
functions.phpにコードを追加する形です。
マルチサイトでも『Custom Post Type Permalinks』の「wp_get_archives()」を正常に機能させる
ここからは『Custom Post Type Permalinks』プラグインがインストールされていて有効化してあることを前提に進めていきます。
因みに有効化するのはカスタム投稿タイプを追加したブログのみでOKだと思いますが、うまく行かない場合はネットワークで有効化しちゃってください。
『Custom Post Type Permalinks』プラグインを有効化したら
このコードをお使いのテーマのfunctions.phpに追加してください。
function multi_wp_get_archives($cpt,$sitedir){ ob_start(); wp_get_archives("type=monthly&post_type=$cpt"); $output = ob_get_contents(); ob_end_clean(); if(strstr($output,"$sitedir/$cpt/date/")){ $output = str_replace($sitedir."/", $sitedir."/".$cpt."/date/", $output); } return $output; }
やっていることは文字列置換だけです。
因みにこのコードは月別アーカイブリストを表示すること前提ですが、もし年別とかにしたい場合は3行目の
「wp_get_archives(“type=monthly&post_type=$cpt”);」
を
「wp_get_archives(“type=yearly&post_type=$cpt”);」
とかに変更してください。
出力
functions.phpにコードを追加できたらカスタム投稿タイプのアーカイブリストを表示したい箇所にこのコードを記述します。
<?php switch_to_blog(ブログID); ?> <ul> <?php echo multi_wp_get_archives('投稿タイプ名','カスタム投稿タイプを追加したブログのパス'); ?> </ul> <?php restore_current_blog(); ?>
まず「switch_to_blog()」でカスタム投稿タイプを追加したブログIDを指定します。
基本ですね。
次にfunctions.phpに追加した「multi_wp_get_archives()」関数の呼び出しです。
引数で「投稿タイプ名」と「カスタム投稿タイプを追加したブログのパス」を指定します。
若干分かりづらいのが、引数に指定するブログのパスなのです。
2つほど例を挙げて説明します。
例えば「http://kotori-blog.com」というサイトをWordPressのマルチサイトで構築する場合、親サイト(ブログIDが1のサイト)のURLはもちろん「http://kotori-blog.com」となるはずです。この親サイトにカスタム投稿タイプ「kotoridiary」を追加した場合、引数の指定はこうなります。
<?php switch_to_blog(1); ?> <ul> <?php echo multi_wp_get_archives('kotoridiary','kotori-blog.com'); ?> </ul> <?php restore_current_blog(); ?>
次の例です。
先ほどの親サイト「http://kotori-blog.com」に子サイト(ブログIDは2)を追加します。子サイトのURLは「http://kotori-blog.com/pandy」としましょう。この子サイトにカスタム投稿タイプ「pandydiary」を追加して全ブログに月別アーカイブを表示する場合の引数の指定はこのようになります。
<?php switch_to_blog(2); ?> <ul> <?php echo multi_wp_get_archives('pandydiary','pandy'); ?> </ul> <?php restore_current_blog(); ?>
注意点
マルチサイト化した際に親サイトのURLに勝手に「/blog」が付くウザい現象があるかと思いますが、「/blog」が入ると親サイトに追加したカスタム投稿タイプのアーカイブリストのURLが正常に作られないので404になります。
なので親サイトの「/blog」は消してください。
親サイトの「/blog」を消す方法は下記記事を参考にしてください。
親サイトのパーマリンクの「/blog」を消す方法[マルチサイト,WordPress]
まとめ
みなさん月別アーカイブリストは正常に表示されましたか??
今回はちょっと説明がややこしくなってしまいました笑
ちゃんと伝わるか不安です。
とりあえずKoToRiの環境では、この記事で紹介したコードでバッチリ動作しましたが
もし、うまくいかない人がいたらコメントくださいな!
これで超便利プラグイン『Custom Post Type Permalinks』に死角は無くなったかと思います笑
といってもこれは応急処置のような形なので、正式に対応されることを願っておきましょう。