after_setup_theme始终运行


11

我正在为一些教职员工设置一个儿童主题,作为主题的一部分,我希望在激活主题时激活一些插件。因此,自然地,我使用了after_setup_theme动作并调用了我的设置函数。它运行良好,但它可以在每个请求(管理员和其他请求)上运行。我通过将其添加到设置功能的末尾来证明了这一点:

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

结果,每个管理员请求和每个前端请求都会收到一个JavaScript警报(我有一个网络设置,因此显然在该主题未处于活动状态的网站上,它没有运行该功能)

所以问题是,这是一个错误吗?我在某种程度上做错了吗?这是我正在使用的完整代码:

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>';
}

任何见解将不胜感激!


解决方案: after_switch_theme完全符合我的意图。在主题切换到主题后触发。下面提到的解决方案之一使用switch_theme。这没有理想的结果,因为它仅在切换主题时发生。引用此Trac评论
Aaron Wagner

请张贴它作为答案,而不是对您的问题的评论。:)
Chip Bennett 2012年

2
道歉。它不会让我这样做。我将其添加为答案。
亚伦·瓦格纳

Answers:


8

解决方案: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');
}

5

after_setup_theme操作旨在在每次WordPress加载时触发。这只是WordPress调用模板系统,确定主题的各种设置参数,然后继续进行后续处理(例如确定要显示的正确模板等)的过程的一部分。

换言之,在after_setup_theme表示在该点的WordPress设置当前主题,在该点的管理员 激活和/或配置的当前主题。

您正在寻找的是一个主题激活挂钩,该挂钩目前尚不可用,但正在考虑/开发中


这样,食典委条目链接就极具误导性。它说:“此挂钩在主题初始化期间被调用。” 对我而言,这意味着应在激活钩子时对其进行调用。我明白你在说什么。极具误导性。
亚伦·瓦格纳

5
init !== activation。通常,您__construct()在php中调用函数也是一个init函数。这意味着:初始化实例。
kaiser 2012年

火车票是7岁的,而且似乎还不能修复!
numediaweb 2015年

4

不幸的是,没有主题激活钩子。但是,这个问题确实提供了解决方法。

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

同样,这是一个更好的解决方案。两者本质上都使用switch_theme钩子。


根据OP注释和链接的追踪票 - 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
}

这些选项都不适合我。 switch_theme仅在停用主题后才有效。但是,after_switch_theme效果很好。
亚伦·瓦格纳

1
更新的答案:)
Stephen Harris

switch_theme似乎不再起作用。我认为是由于3.4激活中的更改。至少它对我不起作用。
2012年

after_switch_theme工作完美。这应该是公认的答案。我正在使用WP 3.5
Ardee Aram 2013年

0

更好的解决方案可能是使用Thomas Griffin的插件激活脚本。这将提示用户在使用主题时安装您选择的插件。我认为这是将插件与主题分离并仍然可以使用的好方法。

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

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



0

最好的解决方法是现在使用switch_theme钩子并过滤传递的'$ theme'参数,以查看是否为当前参数,否则返回;

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

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.