web-dev-qa-db-fra.com

Service de modèle dynamique, changez racine_thème à l'aide de add_filter à partir du thème actuel

Certains plug-ins utilisent les 'template', 'option_template' et 'option_stylesheet' pour servir de manière dynamique des modèles wordpress alternatifs. Par exemple, la variable ServeDefaultToIESix de Nathan Rice. Par exemple -

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

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

Le code ci-dessus ne fonctionne que depuis un plugin wordpress. Ce dont j'ai besoin, est de passer à un autre modèle, situé dans l'un des sous-dossiers du thème actuel (modèle). Exemples: affichez un thème HTML5 alternatif, offrez aux utilisateurs mobiles une version minimale du site, etc.

J'ai essayé d'utiliser 'theme_root' et 'theme_root_uri' comme ci-dessous. Mais ça ne marche pas.

// 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';
}

Est-ce la bonne façon de le faire? Ou est-ce que quelqu'un connaît le moyen possible de le faire? Merci d'avance.

6
OpenOne

Généralement, les plugins et les thèmes ont les mêmes possibilités. Mais à certains moments, il y a une grande différence. Les thèmes viennent plus tard et ont donc moins de pouvoir. De plus, beaucoup de fonctions ne fonctionnent que pour les plugins.

Ce que vous essayez de faire, c'est de modifier le comportement de base. À certains endroits, core propose des crochets pour échanger même complètement certaines parties, et à d’autres, il offre des crochets pour extend sa fonctionnalité. Mais gardez à l'esprit que le noyau ne veut jamais vraiment que son comportement change vraiment lorsqu'il s'agit de thèmes (voir Sous-dossiers et get_template_part()). Je voudrais donc prendre du recul en changeant de thème 'à l'intérieur' d'un thème (c'est comme modifier la requête principale) et rechercher une autre approche:

// 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' );
}

C'est une approche très simple et basique, mais elle a plus de chances de fonctionner.

1
kaiser

J'ai découvert que add_filter('template', ...) et add_filter('stylesheet', ...) doivent être appelés en même temps pour que cela fonctionne ... du moins dans mon cas.

1
Lasse Bunk

Avez-vous essayé de connecter le filtre template_directory? Il existe également des points d'ancrage pour chacun des éléments de modèle individuels et stylesheet_directory.

0
AutoBlogged