0

我使用 wordpress 开发了一个带有博客的网站。在我准备好主题后,网站所有者要求我使用他仅为网站博客购买的其他主题。

如何在不将其设置为选项表上的网站主题的情况下初始化第二个主题?

我可以做到定义TEMPLATEPATH常数wp-includes/default_constants.php

function 'wp_templating_constants':
define('TEMPLATEPATH', get_theme_root() . '/theme-name');

并设置过滤器:

pre_option_template, template, pre_option_current_theme, stylesheet_directory_uri,stylesheet_directory在主题的functions.php中。

但是,当然,我想在知道用户是否在博客页面上之后动态地执行此操作。有谁知道该怎么做?

4

1 回答 1

1

这是插件将主题设置为类别列表的代码,该类别列表不是数据库上定义的主题。

new SetTheme('[THEME_NAME]', array('[CAT_NAME]', [CAT_ID], [CAT_OBJECT]));

class SetTheme {
    private $theme_name = '';
    private $categories = array();

    public function __construct($theme_name, $categories) {
        // define original theme location for any reason
        define('ORIGTEMPLATEPATH', get_template_directory());
        define('ORIGTEMPLATEURI', get_template_directory_uri());

        // init class parameters
        $this->theme_name = $theme_name;

        foreach ($categories as $cat) {
            if (is_string($cat))
                $cat = get_category_by_slug($cat);

            $category = get_category($cat);
            $this->categories[$category->term_id] = $category;
        }

        // apply action to setup the new theme only on action 'setup_theme'
        // because some functions are not yet loaded before this action
        add_action('setup_theme', array($this, 'setup_theme'));
    }

    public function setup_theme() {
        // if the current post or category is listed, apply the new theme to be initialized
        if ($this->is_category_theme())
            $this->set_theme();
    }

    private function is_category_theme() {
        // get category from current permalink
        // and check if is listed to apply the new theme
        $current_cat = get_category_by_path($_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'], false);
        if (isset($this->categories[$current_cat->term_id])) return true;

        // get post from current permalink
        // and check if it belongs to any of listed categories
        $current_post = url_to_postid($_SERVER['REQUEST_URI']);
        $post_categories = wp_get_post_categories($current_post);
        foreach ($post_categories as $cat_id)
            if (isset($this->categories[$cat_id])) return true;

        return false;
    }

    private function set_theme() {
        // apply the filters to return the new theme's name
        add_filter('template', array($this, 'template_name'));
        add_filter('stylesheet', array($this, 'template_name'));
    }

    public function template_name() {
        // return new name
        return $this->theme_name;
    }
}

类的参数是主题名称和类别数组(ids、slugs 或类别对象)。

当然,这是我需要的,可能对于其他主题,函数“set_theme”中需要其他过滤器。

它需要是一个插件,因为插件是在主题之前甚至在 WP 类之前加载的。

使用这个插件,原始插件将永远不会被调用(至少在我的情况下)。

于 2013-01-21T15:12:28.287 回答