web-dev-qa-db-ja.com

動的テンプレート提供、現在のテーマからadd_filterを使用してtheme_rootを変更

プラグインの中には、'template''option_template'、および'option_stylesheet'を使用して、(代替の)ワードプレステンプレートを動的に提供するものがあります。例えば、Nathan RiceのServeDefaultToIESixです。例えば ​​-

add_filter('template', 'change_theme');
add_filter('option_template', 'change_theme');
add_filter('option_stylesheet', 'change_theme');

function change_theme() 
{
    // Alternate theme
    return 'AwesomeTheme';
}

上記のコードはワードプレスプラグインからのみ動作します。私が必要としているのは、現在のテーマ(テンプレート)の代替テンプレート、のいずれかのサブフォルダーに切り替えることです。例:代替のHTML5テーマを表示し、モバイルユーザーに最小限のバージョンのサイトを提供するなど。

以下のように 'theme_root'と 'theme_root_uri'を使おうとしました。しかし、それはうまくいきません。

// Extra lines to change the theme's root.
add_filter('theme_root', 'change_theme_root');
add_filter('theme_root', 'change_theme_root_uri');
//
add_filter('template', 'change_theme');
add_filter('option_template', 'change_theme');
add_filter('option_stylesheet', 'change_theme');

function change_theme() 
{
    // Display Alternate theme
    return 'AwesomeTheme';
}

function change_theme_root()
{
    // Return the new theme root
    return WP_CONTENT_DIR . 'themes/OrigTheme/lib/AltThemes';
}

function change_theme_root_uri()
{ 
     // Return the new theme root uri
     return get_bloginfo('wpurl') . '/wp-content/themes/OrigTheme/lib/AltThemes';
}

これは正しいやり方ですか?それとも可能な方法を誰かが知っていますか?前もって感謝します。

6
OpenOne

一般的にプラグインとテーマは同じ可能性があります。しかしいくつかの点で、大きな違いがあります。テーマは後でやってきて、それ故に力が少なくなります。プラス:多くの機能はプラグインに対してのみ機能します。

あなたがやろうとしているのは、コアビヘイビアを変更することです。ある場所ではcoreはそれの一部を完全に交換するためのフックさえ提供しますそして他の場所でそれは extend その機能性へのフックを提供します。しかし、テーマに関しては、コアがその振る舞いを本当に変更したくないことを決して忘れないでください(サブフォルダーとget_template_part()を参照)。そのため、テーマをテーマの「内側」に切り替えること(メインクエリを変更するようなもの)から撤退して、他の方法を探します。

// inside one of your template files:
do_action( 'main_nav_hook' );

// inside your functions.php
define( 'THEME_DESKTOP_DIR', user_trailingslashit( get_stylesheet_directory().'/desktop' ) );
define( 'THEME_MOBILE_DIR',  user_trailingslashit( get_stylesheet_directory().'/mobile' ) );
define( 'THEME_TABLET_DIR', user_trailingslashit( get_stylesheet_directory().'/tablett' ) );

function add_main_nav_desktop()
{
    // do stuff
    require_once( THEME_DESKTOP_DIR.'template_nav.php' );
}
function add_main_nav_mobile()
{
    // do stuff
    require_once( THEME_MOBILE_DIR.'template_nav.php' );
}
function add_main_nav_tablett()
{
    // do stuff
    require_once( THEME_TABLET_DIR.'template_nav.php' );
}

// Hook the actions
if ( is_condition_mobile() )
{
    add_action( 'main_nav_hook', 'add_main_nav_mobile' );
}
elseif ( is_condition_tablet() )
{
    add_action( 'main_nav_hook', 'add_main_nav_tablet' );
}
else
{
    add_action( 'main_nav_hook', 'add_main_nav_desktop' );
}

これは本当に単純で基本的なアプローチですが、うまくいく可能性があります。

1
kaiser

add_filter('template', ...)add_filter('stylesheet', ...)が機能するためには同時に呼び出さなければならないことがわかりました…少なくとも私の場合は。

1
Lasse Bunk

Template_directoryフィルタをフックしてみましたか?個々のテンプレート要素とstylesheet_directoryそれぞれにもフックがあります。

0
AutoBlogged