it-swarm.com.de

Dynamisches Template-Serving. Ändern Sie theme_root mit add_filter vom aktuellen Theme

Einige Plugins verwenden den 'template', 'option_template' und 'option_stylesheet', um (alternative) WordPress-Vorlagen dynamisch bereitzustellen. Zum Beispiel Nathan Rices ServeDefaultToIESix. Zum Beispiel -

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

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

Der obige Code funktioniert nur mit einem WordPress-Plugin. Was ich brauche, ist zu einer alternativen Vorlage zu wechseln, die sich in einem der Unterordner befindet des aktuellen Themas (Vorlage). Beispiele: Anzeigen eines alternativen HTML5-Themas, Bereitstellen einer Minimalversion der Site für mobile Benutzer usw.

Ich habe versucht, 'theme_root' und 'theme_root_uri' wie folgt zu verwenden. Aber das geht nicht.

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

Ist das die richtige Vorgehensweise? Oder kennt jemand die Möglichkeit dazu? Danke im Voraus.

6
OpenOne

Generell haben Plugins und Themes die gleichen Möglichkeiten. Aber manchmal gibt es einen großen Unterschied. Themes kommen später und haben daher weniger Power. Plus: Viele Funktionen funktionieren nur für Plugins.

Sie versuchen, das Verhalten des Kerns zu ändern. An einigen Stellen bietet core Hooks an, um Teile davon sogar vollständig auszutauschen, und an anderen Stellen bietet core Hooks an, um extendseine Funktionalität) zu erweitern. Siehe Unterordner und get_template_part()). Also würde ich zurücktreten, wenn ich Themen 'innerhalb' eines Themas wechseln würde (es ist, als würde ich die Hauptabfrage modifizieren) und nach einem anderen Ansatz suchen:

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

Dies ist ein sehr einfacher und grundlegender Ansatz, der jedoch mit größerer Wahrscheinlichkeit funktioniert.

1
kaiser

Ich habe herausgefunden, dass add_filter('template', ...) und add_filter('stylesheet', ...) gleichzeitig aufgerufen werden müssen, damit es funktioniert ... zumindest in meinem Fall.

1
Lasse Bunk

Haben Sie versucht, den template_directory-Filter einzubinden? Es gibt auch Hooks für die einzelnen Vorlagenelemente und das Stylesheet-Verzeichnis.

0
AutoBlogged