停用主题切换上的插件

时间:2018-06-02 作者:tsquez

我正在开发一个插件,我们称之为DahPlugin,它为我开发的免费主题提供了额外的定制选项。让我们把这个主题称为DahTheme(我不想无耻地在这里插入其中任何一个)。

所以我要做的是DahPlugin 将自动deactivated 当用户更改主题时DahTheme.

我在这里找到了以下代码片段:disable active plugins for specific theme, 如果您想在某个主题处于活动状态时禁用插件,那么这一点非常有效。

所以我决定聪明一点,在我的主题中运用它,并转换逻辑。所以我将比较运算符从==等于)!=不相等)。。。我的想法:如果当前主题名称不等于“DahTheme,然后停用DahPlugin“下面是它的样子:

if ( ! function_exists(\'disable_plugins\')) :
    function disable_plugins(){
        include_once(ABSPATH.\'wp-admin/includes/plugin.php\');
        $current_theme = wp_get_theme();
        $current_theme_name = $current_theme->Name;

        if($current_theme_name == \'DahTheme\'){
            if ( is_plugin_active(\'dahplugin/dahplugin.php\') ) {
                deactivate_plugins(\'dahplugin/dahplugin.php\');                          
            }
        }
    }
    add_action(\'after_switch_theme\',\'disable_plugins\');
endif;
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。。。英雄联盟当然,只要我觉得自己很聪明,这种情况就会发生。

因此,我一直在绞尽脑汁,四处寻找,试图找出它不起作用的原因,但我似乎也找不到。

谁能告诉我为什么它不起作用,为什么我的思路是错误的。我们将不胜感激。

提前感谢您的帮助。

4 个回复
SO网友:Nathan Johnson

我还没有对此进行测试,所以它可能无法正常工作,但您尝试做的本质是after_switch_theme 钩住并查看$old_name 是DahTheme。如果是,则意味着当前主题不是DahTheme,因此您希望停用插件。

function wpse_after_switch_theme( $old_name, $old_theme ) {
  if( \'DahTheme\' === $old_name ) {
    //* You may or may not need to include wp-admin/includes/plugin.php here
    deactivate_plugins( \'dahplugin/dahplugin.php\' );
  }
}
add_action( \'after_switch_theme\', \'wpse_after_switch_theme\', 10, 2 );

SO网友:Tom J Nowell

整个方法都是倒退的。问题不是在主题切换时停用,而是确保插件不可用,除非为其构建的主题处于活动状态。

因此,检查应该在插件中,而不是主题中

因此,让我们从确定哪个主题是活动的开始,我们可以通过wp_get_theme documented here

然后在上的插件中注册一个钩子admin_init:

add_action( \'admin_init\', function() {
    $theme = wp_get_theme();
} );
然后,如果主题不是预期的主题,请停用:

if ( $theme->headers[\'name\'] !== \'DahTheme\' ) {
    deactivate_plugins( plugin_basename( __FILE__ ) );
}
请注意,deactivate\\u plugins是复数形式,它需要一个绝对路径。因为使用__FILE__, 此检查必须在主插件文件中。

尽管如此,当切换回“DahTheme”时,这会使事情变得复杂,因为现在插件处于非活动状态,所以最好先进行检查,然后尽早返回,这样插件就什么都不做,而不是停用。这样,就不会为不兼容的主题提供自定义程序选项,并且在用户预览主题或切换回主题时也不会出现问题

SO网友:tsquez

我基本上通过使用is_plugin_active - 在我用插件加载其他面板和部分之前,当有人选择另一个主题时customize register 插件创建的主题仍然存在,当他们进入新的主题定制器时,生成了一个致命错误。

这纠正了问题。

SO网友:Deepak Rajpal

这并不是对所提问题的确切答案。然而,这将对许多人有所帮助who are looking to perform certain action after activation or deactivation of themes.

// Perform action when your theme is deactivated (actually switched to another)
add_action( \'switch_theme\', \'action_switch_theme\', 10, 1 ); 
function action_switch_theme( ) { 
    // deactivate your plugin
}; 

// Perform action after your theme is activated (switched from other theme)
add_action( \'after_switch_theme\', \'action_after_switch_theme\', 10, 1 ); 
function action_after_switch_theme( ) { 
    // activate your plugin
}; 

结束

相关推荐

插件放置在/wp-content/plugins内的文件夹中时不保存值

我得到了WordPRess插件的以下代码,它在每个页面/后期编辑屏幕上添加了两个自定义输入。然后将这些值保存并输出到前端页面的标题中。如果代码位于内部,则可以正常工作。php文件并直接放入“wp内容/插件”。然而,如果我把它放在插件(如“wp-content/plugins/myplugin”)中自己的文件夹中,那么在通过编辑屏幕保存帖子/页面时,输入字段不会保存。此外,它不会向前端页面html标题部分输出任何内容。这似乎是一个被放弃的项目,所以我无法与原始开发人员一起制定解决方案。然而,代码中的某些内容