【问题标题】:How to PREVENT a plugin to run on a SPECIFIC PAGE?如何防止插件在特定页面上运行?
【发布时间】:2020-02-25 20:16:37
【问题描述】:

我正在寻找一种不会在单页上激活某个插件的解决方案。

我尝试使用随附的代码(由@Kamil Grzegorczyk 在Wordpress Disable Plugin on Specific Pages/Posts 上提供)但没有成功。

add_filter( 'option_active_plugins', 'lg_disable_cart66_plugin' );

 function lg_disable_cart66_plugin($plugins){

      if(strpos($_SERVER['REQUEST_URI'], '/store/') === FALSE AND strpos($_SERVER['REQUEST_URI'], '/wp-admin/') === FALSE) {
         $key = array_search( 'cart66/cart66.php' , $plugins );
         if ( false !== $key ) unset( $plugins[$key] );
      }

     return $plugins;
 }

我也尝试过使用我们的插件管理器,但它没有帮助在单个页面上激活某个插件。

顺便说一句,如果有人通过在帖子/页面上追踪他们的简码来获得只能激活某些插件的代码,例如联系表格 7,那将是非常棒的! 如果 x 页面/帖子有一个包含“第 7 号联系表格”的简码,则激活第 7 号联系表格插件,否则不要激活。

无论如何,在这个阶段,一个简单的解决方案就可以了:)

谢谢。

【问题讨论】:

  • 你能不能先解释一下为什么你想要这个?我不认为总是尝试启用/禁用插件是一个好主意。
  • 我的猜测是他想尽量减少脚本的负载 - 因此,如果该页面上有联系表格,则仅加载 CF7s 脚本。 - 但是将它们全部停用并再次激活它们似乎是个坏主意。 - 想象一下如果网站上有多个用户 - 用户 A 告诉 DB 停用 CF7,而用户 B 告诉 DB 激活它。好像很麻烦
  • 但是如果存在短代码则可以加载脚本,并且已在姊妹网站上回答:wordpress.stackexchange.com/a/191512/82677
  • 您好,感谢您的回复。我需要停用您在此页面屏幕左下方看到的插件:worldpronet.com/123
  • 嗨 Stender,感谢您的链接,我已经检查过了,这是一个好的开始,但它并没有完全回答我的问题,因为它就像一个特定的主题,与插件无关。目前我需要一个全局插件停用的解决方案,而不是基于短代码的插件。我的建议是针对每种情况都有一个解决方案。

标签: php wordpress plugins shortcode contact-form-7


【解决方案1】:

“顺便说一句,如果有人通过在帖子/页面上跟踪他们的简码来获得只能激活某些插件的代码,例如联系表格 7,那将是很棒的!就像 x 页面/帖子的简码包含'联系表格 7' 然后激活联系表格 7 插件,否则不要激活。” - 这是不可能的。阅读源代码 wp-blog-header.php 应该清楚这一点。

$wp_did_header = true;

// Load the WordPress library.
require_once( dirname( __FILE__ ) . '/wp-load.php' );

// Set up the WordPress query.
wp();

// Load the theme template.
require_once( ABSPATH . WPINC . '/template-loader.php' );

插件由 wp-settings.php 加载,而 wp-load.php 则由 wp-load.php 加载。请求的发布内容由函数 wp() 调用的 WP::query_posts() 从数据库中检索。因此,在从数据库中检索帖子内容之前,插件就已经加载完毕。

你把代码放在哪里了

add_filter('option_active_plugins', 'lg_disable_cart66_plugin');

这不能放在常规插件中,因为它必须在加载插件之前执行。 (你不能告诉插件不要加载已经加载的代码。)它也不能放在functions.php中,因为functions.php是加载AFTER插件加载的。你读过关于 mu-plugins 的评论吗? “必须使用”插件在常规插件之前加载。所有这些都可以在 wp-settings.php 中找到 - 我强烈建议阅读它 - 它很容易阅读,您将了解 WordPress 如何自我初始化。

【讨论】:

  • 感谢您的详细回复。这绝对是我在这里读到的最专业的答案之一。我确实按照指示将代码放在了 mu-plugins 目录中。据我了解,该目录在插件运行之前有效。那么在插件生效之前可以在这个目录中扫描短代码吗?无论如何,当前的代码对我没有帮助,因为它限制插件在单个页面上工作,就我而言,我需要插件不能在单个页面上工作,因为我的插件是全球性的(会员注册和登录,谷歌翻译,隐私政策并向上滚动)。
  • "那么在插件生效之前可以在这个目录中扫描短代码吗?" - 是的,但这意味着您必须检索将在 WordPress 解析请求之前显示的帖子的帖子内容。换句话说,您基本上需要乱序进行查询处理。现在您有责任解析请求并执行 SQL 查询,WordPress 稍后将再次重复这项工作。这可能不是一个好主意 - 由于代码重复,它不容易做到并且效率不高。
  • “我不需要插件在单个页面上工作,因为我的插件是全局的(会员注册和登录” - 过滤器“option_active_plugins”允许您编辑活动插件列表。您可以编写自己的条件有条件地选择将从该列表中省略哪些插件。不幸的是,这些条件必须基于原始 URL,因为此时 WordPress 尚未解析 URL,并且尚不知道匹配的帖子/页面..跨度>
  • 谢谢,Magenta Cuda。您能否与我分享一个示例代码,例如:URL www.worldpronet.com/123/Electric cabines China-Israel (Page Id 11269) 要省略的插件名称:to-top,使用过滤器“option_active_plugins”?
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2021-03-27
  • 2017-04-16
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多