WordPressで、1つの投稿を2つのフォーマットで出力(URLも別)とかできたりしないだろうか。

パラメータでシングルページのテンプレートを変更

WordPressで、1つの投稿を2つのフォーマットで出力(URLも別)とかできたりしないだろうか。WordPress で与えられたパラメータによって、シングルページで適用するテンプレートを変更する方法。
Eri さんが、こんなことを言っていたのでサクッと作りました。
話を聞くと、通常の表示ページの他に印刷用のページを用意して、見た目をガラッと変えたいとのこと。

例えば、パーマリンクが http://example.com/archives/1 の場合、http://example.com/archives/1?type=print にアクセスすると、テンプレートとして single.php を読み込む代わりに single-print.php を読み込ませたい。
これは single_template というフィルターフックを利用して、通常とは違うテンプレートを読み込むようにすることで対応できます。

以下のコードをテーマの functions.php に追記してあげましょう。

function single_template_switch($template) {
	$new_template = $template;
	if (isset($_GET['type'])) {
		$new_template = 'single-' . esc_html($_GET['type']) . '.php';
		if (is_array($template)) {
			$new_template = array(
				$new_template,
				isset($template[1]) ? $template[1] : 'single.php'
				);
		} else {
			$new_template = preg_replace('/[^\/]+\.php$/i', $new_template, $template);
			if (!file_exists($new_template)) {
				$new_template = $template;
			}
		}
	}
	return $new_template;
}
add_filter('single_template', 'single_template_switch');

以下にデモを置いておきます。

WordPress には、アクションフックやフィルターフックという仕組みがあるため、こんなことも簡単にできちゃいますね。

パラメータでシングルページのテンプレートを変更」への6件のフィードバック

  1. zarumath

    ご教授いただいたfilter hookを
    custom post typeのsingleテンプレートに使ってみようしましたが
    上手く効きません。
    やむを得ず、singleのカスタムポストタイムをリネームして
    single.phpにsingle-1.php等を付けて書き出していいます。
    custom post type templateへのfilter hookの際は
    filterへの登録等が必要なのでしょうか?
    add_filter(‘single_template’の部分をいろいろ変えてやってみましたが効きませんでした。
    ご教授いただけると幸いです。

    返信
    1. sib

      “パラメータでシングルページのテンプレートを変更”したくてここへたどりつきました。
      僕もzarumathさんと同様、カスタムポストタイプの記事に対して適用したいと考えています。
      仮に、”aaa”というポストタイプのテンプレート”single-aaa.php”で表示される記事に、
      印刷ボタンを設置して、別の印刷用テンプレートを使用して、レイアウトの違う印刷ページを
      表示したいと考えています。
      zarumathさん同様、カスタムポストタイプの”single-aaa.php”への対応をどのようにしていいか
      わからないでいます。
      どうかお力添えいただけないでしょうか。
      よろしくお願いします。

      返信
  2. Hajime

    いつも参考にさせていただいてます。
    質問なのですが、私のサイトの場合、http://example.com/archives/1.htmlとなっているのですが、この場合どのようにすればうまく複数のシングルページをもてるようになりますか?

    よろしくおねがいいたします。

    返信
  3. eisuke

    すみません、自己解決しました。
    ●フィルターフックの変更
    ●パーマリンク設定の変更で対応できました(変える前はこんなふうにつなげて使っていました ⇒ /?p=15&type=***)
    お手数をおかけしました。ありがとうございます。
    少額ではありますが振込を致します。

    返信
    1. をかもと 投稿作成者

      eisuke さん、はじめまして。

      自己解決されたようで良かったです。
      この例はシングルページのテンプレートを変更するためのフィルターフック single_template について書いてありますが、他のテンプレートについても同様のフィルターフックを使って変更することができます。
      # アーカイブページなら archive_template、固定ページなら page_template …
      色々と試してみてください!

      少額ではありますが振込を致します。

      ありがとうございます!確認しました。

      返信
  4. eisuke

    はじめまして、えいすけといいます。
    リンク別にページのhtmlを変更したくてたどりつきました。
    とても参考になりました。
    ありがとうございます。

    サンプルは投稿記事単体のテンプレートの変更ですがアーカイブテンプレートなどの場合は
    どのように変更を加えればいいのでしょうか?
    フィルターフックを変更してみましたが、うまく表示されませんでした。
    よろしくお願いします。

    返信

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください