如何在插件中解除类内操作/过滤器的挂钩

时间:2019-11-10 作者:CRyan

我有一个度假屋租赁的商业网站,其中WordPress主题有自己的预订系统,仅用于房屋预订,非常棒!

我还可以预订旅游/服务(不是房屋),但我使用WooCommerce/WooCommerce预订插件,而不是房屋预订系统。

一切都很好!

但最近,主题更新为家庭预订系统引入了WooCommerce结账选项,这在更新之前从未存在过。虽然我关闭了themes WooCommerce签出选项,但代码仍在themes的核心插件中执行。几周来,我一直拿着主题提供商的开放式支持票来回奔波,让他们在用户关闭选项时提出不运行新代码的条件声明,但我不知道何时或是否会这样做。现在的情况是,主题的核心插件正在操纵WooCommerce结账,在我之前一直单独使用WooCommerce的任何旅游/服务的最后一步下单后,现在下单后超时,并在后端生成1000多个额外的“幻影”结账页面。

Bottom line: 当主题的核心插件文件中有3行(第27-29行)被注释掉时,一切正常。但我不想在每次插件更新后都要注释掉这3行。

//add_action( \'woocommerce_thankyou\', array($this,\'order_attach\') );

//add_filter( \'woocommerce_checkout_fields\', array($this,\'custom_override_checkout_fields\') );

//add_filter(\'woocommerce_create_account_default_checked\', \'__return_true\');
以下是完整代码(注释掉第27-29行):https://pastebin.com/jqtBpCpA

我尝试了以下两页上的说明,但都没有成功:https://mekshq.com/remove-wordpress-action-filter-class https://github.com/herewithme/wp-filters-extras

我在函数中插入了以下内容。php文件

METHOD 1:

global $Wpestate_Global_Payments; //get access to the class object instance

remove_action( \'woocommerce_thankyou\', array($Wpestate_Global_Payments,\'order_attach\') );
remove_filter( \'woocommerce_checkout_fields\', array($Wpestate_Global_Payments,\'custom_override_checkout_fields\') ); 
remove_filter(\'woocommerce_create_account_default_checked\', \'__return_true\');
然后使用插件,如下所示:https://github.com/herewithme/wp-filters-extras 我尝试了两种方法:

METHOD 2:

remove_filters_with_method_name( \'woocommerce_thankyou\', \'order_attach\' );
remove_filters_with_method_name( \'woocommerce_checkout_fields\', \'custom_override_checkout_fields\' );
remove_filters_with_method_name( \'woocommerce_create_account_default_checked\', \'__return_true\' );
方法3:

remove_filters_for_anonymous_class( \'woocommerce_thankyou\', \'Wpestate_Global_Payments\', \'order_attach\' );
remove_filters_for_anonymous_class( \'woocommerce_checkout_fields\', \'Wpestate_Global_Payments\', \'custom_override_checkout_fields\' );
remove_filters_for_anonymous_class( \'woocommerce_create_account_default_checked\', \'Wpestate_Global_Payments\', \'__return_true\' );
remove_filters_with_method_name( \'woocommerce_thankyou\', \'order_attach\' );
remove_filters_with_method_name( \'woocommerce_checkout_fields\', \'custom_override_checkout_fields\' );
remove_filters_with_method_name( \'woocommerce_create_account_default_checked\', \'__return_true\' );
 是否有人可以提供有关如何插入remove\\u操作的见解(&U);删除函数中每个函数的\\u过滤器。php删除/取消挂接插件文件中我当前已注释掉的3个操作/过滤器?

1 个回复
SO网友:Tom J Nowell

您按添加方式将其解开。

在这种情况下,您需要通过callable 与添加的内容匹配。通常这是函数名,例如。\'my_function\', 但对于对象中的非静态方法,它必须是[ $object, \'method_name\' ] 哪里$object 是对对象的引用。

然而,你是如何获得参考资料的,这是一个更为模糊的问题。一些插件使用单例,并且instance 将获取对象的方法。一些插件new ClassName(); 在文件末尾创建匿名对象,这使得大多数开发人员几乎不可能获得对象引用。有些使用全局变量等。

请参阅您正在使用的插件的文档,询问他们的开发人员支持,记住,第三方插件在WP Stack Exchange上是非主题的。

相关推荐

如何清理wp-content/plugins/wordpress-seo中不必要的文件?

我目前维护Wordpress网站7年。磁盘使用率最近已满,因此我需要定期检查自动备份并保存这些备份,然后将其从服务器中删除。当我检查时,插件文件夹中的wordpress seo文件夹(这是Yoast seo默认插件文件夹)占用了太多空间。据我所知,它充满了各种版本的插件文件。确切地说,它位于wordpress seo插件的js/dist文件夹中。它包含几种类型的小型javascript,每个名称的末尾都有某种序列或版本号,总容量约为250-300 MB。我可以清理这些文件吗?如果是,是否安全?如果我从以前