after_setup_theme always runs

时间:2012-04-26 作者:Aaron Wagner

我正在为我的一些教员设置一个儿童主题,作为主题的一部分,我希望在主题激活时激活一些插件。因此,很自然地,我使用了after\\u setup\\u主题操作并调用了我的setup函数。它工作得很好,除了在每个请求上运行(管理和其他)。我通过在设置函数的末尾添加以下内容来证明这一点:

echo \'<script type="text/javascript">alert("This action was run")</script>\';

因此,在每个管理请求和每个前端请求上都会收到一个javascript警报(我有一个网络设置,所以很明显,在这个主题不活动的站点上,它没有运行该功能)

所以问题是,这是一个bug吗?我是不是做错了什么?以下是我使用的完整代码:

add_action( \'after_setup_theme\', \'fwp_setup\' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER[\'DOCUMENT_ROOT\'].\'/wp-admin/includes/plugin.php\');
    activate_plugin(\'enable-media-replace/enable-media-replace.php\');
    activate_plugin(\'seo-image/seo-friendly-images.php\');
    activate_plugin(\'w3-total-cache/w3-total-cache.php\');
    echo \'<script type="text/javascript">alert("This action was run")</script>\';
}
如有任何见解,将不胜感激!

5 个回复
SO网友:Aaron Wagner

解决方案:after_switch_theme 这正是我想要的。它在主题切换到您的主题后激发。以下提到的解决方案之一使用switch_theme. 这并没有达到预期的效果,因为它只发生在从主题切换时。

以下是我找到的一篇参考文章:http://core.trac.wordpress.org/ticket/7795#comment:29

这是我修改过的代码

add_action( \'after_switch_theme\', \'fwp_theme_setup\' );
function fwp_theme_setup(){ 
    require_once($_SERVER[\'DOCUMENT_ROOT\'].\'/wp-admin/includes/plugin.php\');
    activate_plugin(\'enable-media-replace/enable-media-replace.php\');
    activate_plugin(\'seo-image/seo-friendly-images.php\');
    activate_plugin(\'w3-total-cache/w3-total-cache.php\');
}

SO网友:Chip Bennett

这个after_setup_theme 操作是intended 在每一个WordPress负载上开火。这只是WordPress调用模板系统,确定主题的各种设置参数,然后继续后续处理过程的一部分,例如确定要显示的正确模板等。

换句话说after_setup_theme 表示WordPress 设置当前主题,而不是administrator 激活和/或配置当前主题。

你要找的是一个主题activation 钩子,当前不可用,但is under consideration/development.

SO网友:Stephen Harris

不幸的是,没有主题激活挂钩。但是this question 确实为此提供了一种变通方法。

只需使用“主题激活挂钩”即可激活插件。

一个更好的解决方案is this one. 两者基本上都使用switch_theme


根据OP意见和linked trac ticket - after_switch_theme 是否需要挂钩。

这将旧主题的名称作为参数传递。然而,如果这是在您的functions.php (应该是…)只有当主题被激活时,回调才会触发。

add_action( \'after_switch_theme\', \'wpse50298_setup\' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}
类似地,将回调添加到switch_theme 将仅在主题停用时调用。

add_action( \'switch_theme\', \'wpse50298_deactivate\' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}

SO网友:Jeff Sebring

更好的解决方案可能是使用Thomas Griffin\'s plugin activation script. 这将提示用户在使用主题时安装您选择的插件。我认为这是一个很好的方法,可以将插件从主题中分离出来,并且仍然可以使用它。

在您的主题中,在使用插件的功能之前,请检查插件是否处于活动状态。这将允许用户更多的选择和控制。

您可以使用轻松设置激活脚本Knapsack.

SO网友:numediaweb

您最好的修复方法是现在使用switch_theme 钩住并过滤传递的“$主题”参数,查看它是否是当前参数,如果不是,则返回;

function nw_update_network($theme) {
   if ($theme !== \'my_theme_name\') return;

   // Your code here
}

add_action(\'switch_theme\', \'nw_update_network\');

结束