サポート » 使い方全般 » 特定のURL、固定ページのみ「theme」を切り替える

  • 解決済 sensensen

    (@sensensen)


    いつもお世話になっております。

    標題の通り、
    特定のURL、固定ページのみ「theme」を切り替える
    にはどのようにしたら良いでしょうか。

    現在、Multi Device Switcherでユーザーエージェントを見て、
    themeを分けているのですが、

    ある固定ページ(URL)のみ、
    themeを切り替えたくないのです。

    何か良いアイデアがありましたら教えて下さい!!

    どうぞよろしくお願いします。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • その特定の固定ページだけ、固定ページのテンプレートを変えればいいのではないですか?他方のテーマの固定ページテンプレートと同じにすれば、テーマが切り替わっても同じデザインに見えるはずです。

    モデレーター Takuro Hishikawa

    (@hissy)

    かんたんにできそう!と思ったんですが、意外とすんなりと解決できないですね、これ…。

    ‘stylesheet’ と ‘template’ のフィルターでテーマを切り替えるのはモバイルでテーマを切り替える系統のプラグインでよく行われていると思うのですが、タイミングが早すぎてまだWordPressのメインクエリーがセットされていないので、 is_page(‘about’) といった条件分岐タグが使えません。仕方ないので REQUEST_URI で判別すればとりあえず動きますが…。これしか無いかな〜

    // "/about/" というURLにアクセスした時だけ Twenty Ten に切り替える
    function my_theme_switcher($theme){
    	if ( $_SERVER['REQUEST_URI'] == '/about/' ) {
    		$overrideTheme = wp_get_theme('twentyten');
    		if ( $overrideTheme->exists() ) {
    			return $overrideTheme['Template'];
    		} else {
    			return $theme;
    		}
    	}
    	return $theme;
    }
    
    add_filter('stylesheet', 'my_theme_switcher', 50);
    add_filter('template', 'my_theme_switcher', 50);

    そのURL用に単独インストールしたWordPressにする… ということでは、ダメでしょうか?

    page-about.phpの内容を完全オリジナルにし、wp_enqueue_style()系でstyle.cssを他のCSS差し替えれば可能ではないでしょうか。

    トピック投稿者 sensensen

    (@sensensen)

    pluto1234さん、bren_boss
    私の言葉が足らず申し訳ございません!!

    現在、themeはPC用のtheme、スマホ用のthemeが存在し、
    pluto1234さんのやり方だと、
    PC用のthemeで見せるテンプレート、
    スマホ用のthemeで見せるテンプレート
    2つのテンプレートを作らないといけない
    ↑現状はこのようになっている

    bren_bossさんのやり方だと
    URL用に単独にWordpressをインストールは少し煩雑?

    要するにユーザーエージェントを見て、
    スマホ用のthemeへ切り替えてくれるのはとてもありがたいのですが、
    どうしてもあるURLはPCのthemeのテンプレートを見て欲しいのです。

    できるだけ一つのファイルを編集して済む形がスマートだと思った次第です。

    もしかしたらhissyさんの案だと要件が叶いそうなのでやってみようと思います!!

    どうもありがとうございました!

    モデレーター Takuro Hishikawa

    (@hissy)

    テーマのfunctions.phpではタイミングが遅いので、プラグインにしましょう。こんな感じで
    https://gist.github.com/4547967

    Multi Device Switcher のコードを見たことが無いのですが、Multi Device Switcher の方が実行タイミングが遅いと意味がなくなってしまいます。もし動かない場合は add_filter の2つめの引数の優先度を調整してください

    トピック投稿者 sensensen

    (@sensensen)

    hissyさん、
    頂いたプラグインを試してみて
    /about/
    のページが当サイトにはないので、

    if ( $_SERVER['REQUEST_URI'] != '/about/' ) {
    		$overrideTheme = wp_get_theme('twentyten');
    		if ( $overrideTheme->exists() ) {
    			return $overrideTheme['Template'];
    		} else {
    			return $theme;
    		}
    	}

    として、
    期待していた動作は、
    サイトを開くとテーマがtwentytenとなって表示されると思ったのですが、

    サーバーエラー
    となって表示されます。

    何故でしょうか、、、

    ご連絡お待ちしております!!

    モデレーター Takuro Hishikawa

    (@hissy)

    お使いのWordPressのバージョンを教えてください。

    横から失礼いたします。

    hissyさんの方法で私も、
    特定のURL、固定ページのみ「theme」を切り替える方法に成功しました。

    基本的なことをお伺いするようで申し訳ないのですが、

    if ( $_SERVER['REQUEST_URI'] != '/about/' ) {
    		$overrideTheme = wp_get_theme('twentyten');
    		if ( $overrideTheme->exists() ) {
    			return $overrideTheme['Template'];
    		} else {
    			return $theme;
    		}
    	}

    上記の関数では、’/about/’だけがthemeの切り替え対象となっていますが、

    例えば、’/about/’&’/news/’&’/blog/’
    のように複数のURLを対象とする場合はどのように記述すればいいんでしょうか?

    自分なりに調べて分かったことは、
    上記の記述では、
    $_GETで取得すると、上書きされて最後の’/blog/’しか値を取る事ができず、
    parse_urlで、「id=A&id=B&id=C」を取得

    explodeで、「&」で分割してパラメータを得る
    という方法がある、と知った程度です。

    具体的に parse_url、explodeを使ってどのように関数を組めばいいかわかりません。

    よろしくお願いいたします。

    switch 文を使えば簡単ですね。

    // REQUEST_URL から一番上の階層を取り出す
    $cat = preg_replace('#^/([^/]+)/?.*$#', '$1', $_SERVER['REQUEST_URI']);
    
    // abaout, news, blog によって、テーマを変更する
    $overrideTheme = false;
    switch ($cat) {
        case 'about':
    		$overrideTheme = 'twentyten';
    		break;
        case 'news':
    		$overrideTheme = 'twentyeleven';
    		break;
        case 'blog':
    		$overrideTheme = 'twentytwelve';
    		break;
    }
    
    // テーマのオーバーライド
    if ( $overrideTheme  ) {
        $overrideTheme = wp_get_theme($overrideTheme);
        if ( $overrideTheme->exists() ) {
            return $overrideTheme['Template'];
        } else {
            return $theme;
        }
    } else {
        return $theme;
    }
    <?php
    /*
    Plugin Name: Hardcode theme switcher
    Plugin URI: http://ja.forums.wordpress.org/topic/13483
    Author: Takuro Hishikawa
    Version: 0.1
    */
    // REQUEST_URL から一番上の階層を取り出す
    $cat = preg_replace('#^/([^/]+)/?.*$#', '$1', $_SERVER['REQUEST_URI']);
    
    // abaout, news, blog によって、テーマを変更する
    $overrideTheme = false;
    switch ($cat) {
        case 'about':
    		$overrideTheme = 'twentyten';
    		break;
        case 'news':
    		$overrideTheme = 'twentyten';
    		break;
        case 'blog':
    		$overrideTheme = 'twentyten';
    		break;
    }
    
    // テーマのオーバーライド
    if ( $overrideTheme  ) {
        $overrideTheme = wp_get_theme($overrideTheme);
        if ( $overrideTheme->exists() ) {
            return $overrideTheme['Template'];
        } else {
            return $theme;
        }
    } else {
        return $theme;
    }
    
    add_filter('stylesheet', 'my_theme_switcher', 50);
    add_filter('template', 'my_theme_switcher', 50);

    このような記述にしたところ、動作確認が取れませんでした。。。
    動作させるには、どこを変更すればいいでしょうか。
    wokamotoさん、ご教授お願いいたします。

    それでは、ダメです。
    プラグインにするなら、いかのような感じになると思います。
    https://gist.github.com/4679580

    あと、この課題はすでに「解決済み」でしたね。
    本来であれば、別課題を建てていただいた方が良いと思います。

    無事出来ました!
    本当にありがとうございます!

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「特定のURL、固定ページのみ「theme」を切り替える」には新たに返信することはできません。