您的代码有几个问题。让我们从头开始。。。
Adding hooks
All 您的挂钩将添加到后端。即使是那些在
if((is_admin))
树枝在钩子应该工作的地方明确添加钩子:
if (is_admin()){
// do this on backend (admin side)
/* load plugin functions */
add_action(\'add_meta_boxes\', \'myplugin_add_meta_box\');
add_action(\'save_post\', \'myplugin_save_meta_box\');
} else {
// if we are NOT on backend (admin side) we have to be on frontend, because there is only frontend and backend.
/* load page theme */
add_filter( \'option_template\', \'my_plugin_get_page_theme\');
add_filter( \'template\', \'my_plugin_get_page_theme\');
add_filter( \'option_stylesheet\', \'my_plugin_get_page_theme\');
}
In the loop or not?
get_the_ID()
必须在循环内。钩子(“option\\u模板”、“template”和“option\\u样式表”)在哪里完成?在查询完成之前或之后(表示:在循环内还是在循环外)?两行代码给出了答案:
global $post;
var_dump( $post );
如果
$post
为空(null),我们在循环之外。我们很早就迷上了。查询完成后,我们需要一个钩子。“init”钩子是一个奇怪的钩子。让我们稍微修改一下代码,让插件正常工作:
if (is_admin()){
/* load plugin functions */
add_action(\'add_meta_boxes\', \'myplugin_add_meta_box\');
add_action(\'save_post\', \'myplugin_save_meta_box\');
} else {
add_action( \'init\', \'my_template_hooks\', 5, 0 );
}
function my_template_hooks(){
/* load page theme */
add_filter( \'option_template\', \'my_plugin_get_page_theme\');
add_filter( \'template\', \'my_plugin_get_page_theme\');
add_filter( \'option_stylesheet\', \'my_plugin_get_page_theme\');
}
现在,我们的挂钩位于循环中,插件工作正常。
Deprecated function
在您使用的插件代码的第28行
$themes = get_themes();
.
get_themes()
已弃用,应替换为“wp\\u get\\u themes()”。
Development
请启用WP调试(在WP config.php中将WP\\u DEBUG设置为TRUE)。调试消息将对您有很大帮助。
您可以在上找到完整的修改代码Github