这是插件将主题设置为类别列表的代码,该类别列表不是数据库上定义的主题。
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 类之前加载的。
使用这个插件,原始插件将永远不会被调用(至少在我的情况下)。