openone
  • 0
Новичок

Динамический показ шаблонов, изменение theme_root с помощью add_filter из текущей темы

  • 0

Некоторые плагины используют 'template', 'option_template' и 'option_stylesheet' для динамического обслуживания (альтернативных) шаблонов WordPress. Например, Натан Райс 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';
}

Приведенный выше код работает только с плагином WordPress. Что мне нужно, так это переключиться на альтернативный шаблон, расположенный в одной из подпапок текущей темы (шаблона). Примеры: отображать альтернативную тему 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';
}

Это правильный способ сделать это? Или кто-нибудь знает о возможных способах сделать это? Заранее спасибо.

Share
  1. Как определить, с каких устройств пользователи получают доступ к вашему блогу?

    • 0
    • Это делается с помощью скриптов PHP, JS и строки пользовательского агента. Обнаружение браузера PHP поддерживается обнаружением объекта JS (поскольку пользовательский агент ненадежен, а обнаружение браузера не рекомендуется).

      • 0
    • Спасибо. Дополнительный вопрос: рекомендуется ли использовать OO php для большей части кода тем WordPress?

      • 0
    • @OpenOne Да, ООП — это хорошая практика. У меня есть несколько классов в моей структуре, которые генерируют мою базу при инициализации. Расширение легко, если мне нужны некоторые дополнения для конкретной темы, и мне не нужно заботиться о написании базовой функциональности снова и снова (возможность повторного использования). Кроме того, классы легче переносятся и сохраняют чистоту пространства имен. Я использую публичные функции только для тегов шаблона. И большинство тегов шаблона не делают ничего, кроме вызова функций класса.

      • 0
    • Спасибо. Я думаю о расширении текущих объектов для документов устройств (настольных/мобильных) и настроек (HTML4/5). Я хотел бы использовать классы для вывода всего. Результат выглядит очень чистым, но я не уверен, что делаю его слишком сложным (для пользователя).

      • 0
    • @OpenOne Взгляните на это: sencha.com/products/touch — это бесплатно для разработчиков и выглядит неплохо. Если вы хотите, чтобы я взглянул, я дам вам свой адрес электронной почты, и вы можете отправить его мне.

      • 0
  2. Вы также можете написать свою собственную простую функцию псевдонима get_template_part:
    Следующее позволяет использовать 3 подпапки для частей шаблона, которые находятся в корневой папке темы с именем devices.

    <?php
    // STYLESHEETS
        function print_device_styles( $client = 'desktop' ) 
        {
            $client = apply_filters( 'set_theme_client', $client );
            wp_enqueue_style( $client.'-css' );
        }
        add_action( 'wp_head', 'print_device_styles', 11 );
    
    // TEMPLATE PARTS
        function get_device_template_part( $args = array( 'file' => NULL, 'suffix' => 'default', 'client' => 'desktop', 'media' => 'screen' ) 
        {
            if ( ! $args['file'] )
                wp_die( sprintf( __('You have to specify a file name if you want to load a template part with the %1$s function.', 'textdomain', '<pre>get_device_template_part()</pre>' );
    
            $template_path = user_trailingslashit( get_stylesheet_directory().'/devices/templates-'.$args['client'] );
            $ui_path = user_trailingslashit( get_stylesheet_directory().'/ui/css-'.$args['client'] );
            $ui_suffix = '.css'; // could be switched between '.dev.css' & '.css'
    
            // add styles & template directory
            if ( is_condition_mobile() ) 
            {
                $args['client'] = 'mobile';
                $args['screen'] = 'handheld';
            }
            elseif ( is_condition_tablet() )
            {
                $args['client'] = 'tablet';
                $args['screen'] = 'handheld';
            }
    
            // register styles
            // wp_register_style( 'mobile-css', /theme_root/ui/css-mobile/mobile.css, false 'handheld' );
            wp_register_style( $args['client'].'-css', $ui_path.$args['client'].$ui_suffix, false, $args['screen'] );
    
                // Requires PHP 5.3+ (for lower versions, use a plain function).
            add_filter( 'set_theme_client', function('set_theme_client') { return $args['client'];} );
    
                // {$template}-{$suffix}.php
            if ( file_exists( $template_path.$args['file'].'-'.$args['suffix'].'.php' ) )
            {
                require( $template_path.$args['file'].'-'.$args['suffix'].'php' );
            }
                // {$template}.php
            elseif ( file_exists( $template_path.$args['file'].'.php' ) )
            {
                require( $template_path.$args['file'].'.php' );
            }
                // {$template}-default.php
            elseif ( file_exists( $template_path.$args['file'].'-default.php' ) )
            {
                require( $template_path.$args['file'].'-default.php' );
            }
        }
    
    // CALL THEM in a template file
    // This will require a file named {$template}-{$suffix}.php from your devices folder
    // based on your conditional functions that detect your devices
    // If not found, it will search for a file named {$template}.php
    // and if it wasn't found it will search for a file named {$template}-default.php
        get_device_template_part( array( 'file' => 'nav', 'suffix' => 'main' ) );
    ?>
    


    Не стесняйтесь добавлять условное обнаружение устройства по адресу:
    https://gist.github.com/886501.

    • 0

Оставить ответ

You must login to add an answer.