首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在WordPress插件上使用构造函数重写类?

如何在WordPress插件上使用构造函数重写类?
EN

Stack Overflow用户
提问于 2017-05-02 14:43:18
回答 2查看 2.7K关注 0票数 1

我试图在WordPress插件上覆盖一个插件类。下面是最初的插件类:

代码语言:javascript
运行
复制
class WCV_Vendor_Dashboard
{
       /**
        * __construct()
        */
        function __construct()
        {
            add_shortcode( 'wcv_shop_settings', array( $this, 'display_vendor_settings' ) );
            add_shortcode( 'wcv_vendor_dashboard', array( $this, 'display_vendor_products' ) );

            add_action( 'template_redirect', array( $this, 'check_access' ) );
            add_action( 'init', array( $this, 'save_vendor_settings' ) );
        }

        public function save_vendor_settings(){
               //some codes here
        }
 }

下面是我正在尝试的(在functions.php中),但是它不起作用:

代码语言:javascript
运行
复制
$wcv_vendor_dashboard = new WCV_Vendor_Dashboard();
global $wcv_vendor_dashboard;
remove_action( 'init', array( $wcv_vendor_dashboard , 'save_vendor_settings' ) );

如何正确删除它,如何创建替换?

附加信息:在WooCommerce内核上做了类似的事情。当我想重写一个类/函数时,我使用这个(例如):

代码语言:javascript
运行
复制
remove_action( 'template_redirect', array( 'WC_Form_Handler', 'save_account_details' ) );
function new_save_account_details() {
  //custom code here
}
add_action( 'template_redirect', 'new_save_account_details' );

它在WooCommerce核心上正常工作。我在WCV_Vendor_Dashboard上尝试过类似的东西,但它不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-02 17:46:51

为什么它与woocommerce合作,但在这种情况下却不起作用?

当将函数附加到特定的操作时,WoredPress为该回调创建唯一的id,并将其存储在全局$wp_filter数组中(实际上,它以前是一个数组,但现在它是一个对象)。对于对象方法回调(如array( $this, 'save_vendor_settings' ) ),id是使用spl_object_hash php函数生成的。对于上面的例子,

代码语言:javascript
运行
复制
spl_object_hash( $this ) . 'save_vendor_settings'

,看起来像000000001c0af63f000000006d7fe83asave_vendor_settings

要“合法地”使用remove_action()删除object方法,您首先需要访问用于附加函数的原始对象。如果对象存在于全局命名空间中:

代码语言:javascript
运行
复制
global $wcv;
remove_action( 'init', array( $wcv, 'save_vendor_settings' ) );

创建另一个类实例将无法工作,因为生成的id对于每个对象都是唯一的,即使它们是同一个类的实例。

在WooCommerce的例子中,我猜是关于静态类方法的。使用不同的逻辑为静态类方法生成is,函数和静态方法回调只是作为字符串返回。就你的例子而言,应该是:

代码语言:javascript
运行
复制
'WC_Form_Handler' . '::' . 'save_account_details'

你知道为什么它对一种情况有效,但对另一种情况无效。

通过在全局$wp_filter对象中直接替换它们来替换附加的函数是有问题的,但它并不是100%可靠的。因为我们没有对原始对象的访问权限,所以我们只能根据函数的名称过滤$wp_filter,如果同一个动作有相同的名称,它将替换错误的处理程序。

代码语言:javascript
运行
复制
global $wp_filter;
foreach ( $wp_filter['init']->callbacks as $priority => &$callbacks ) {

    foreach ( $callbacks as $id => &$callback ) {

        if ( substr( $id, -strlen( 'save_vendor_settings' ) ) === 'save_vendor_settings' ) {
            // replace the callback with new function
            $callback['function'] = 'new_save_vendor_settings';
        }
    }
}

我希望它能起作用,问候。

票数 0
EN

Stack Overflow用户

发布于 2017-05-02 14:55:15

子类示例

代码语言:javascript
运行
复制
class WCV_Vendor_Dashboard_Child extends WCV_Vendor_Dashboard
{
   /**
    * __construct()
    */
    function __construct()
    {
        parent::__construct();
    }

    public function new_save_vendor_settings(){
           //some codes here
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43740789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档