コンテンツの条件によってテーマを差し替える。

要件はサイトの一部のページでデザインを変えたいとのこと

一部のページによって、やり方はいろいろとあると思う。

また、変更となる部分によっても、やり方は異なる。

背景色が違うとか配色が違うだけなら、読み込むCSSを切り替えればいい。

パラメータは、is_singleとか、is_archiveとか、is_post_typeとか、WordPressに用意されている関数で条件分岐できるなら、それを使えばいい。

もし、CSSだけで対応できずに、HTML要素も変更しないといけないなら、それ用のテンプレートを作ればいい。

任意の固定ページのみ、だったら ページ専用のテンプレート

任意のアーカイブなら、それ専用のテンプレート

のように、WordPressのテンプレート階層のルールを使えば、それ専用のテンプレートは作れる。

次のような場合はどうだろう?

1つのWordPressの中に、目的の違うサイトが2つあるような場合。今回の要件はこのような感じだった。一部のページやアーカイブだけのデザインを変えるというより、2つサイトがあるということ。

普通に考えるなら、マルチサイトを使えばよい。

テーマを切り替える

is_singleとかis_archiveとかは、$wp_queryがセットされないと機能しない。

テーマの切り替え判断をするのは、$wp_queryがセットされるよりも前。

なので、is_singleとかis_archiveとかのis_系関数や、get_post_typeとかは使えない。

なので、URIで判断することになる。

そして、そのコードをthemeのfunctions.phpに書いてはダメだ。もし、切り替え対象の全てのthemeのfunctions.phpに書かないといけない。

それは、面倒だからプラグインを作ってそこに書く。URIを取得して条件分岐するので、以下のようなコードになる。

<?php
/*
Plugin Name:My Plugin
*/

if ( str_starts_with($_SERVER["REQUEST_URI"],"/category/") ) {
	switch_theme( '', 'twentytwentytwo' );
} else {
	switch_theme( '', 'lionblog' );
}

?>