如何在WordPress父主题中重写不可插入和不可挂钩的函数?

时间:2018-02-07 作者:user2183282

我的父主题在一个函数中有一些bug,我想在子主题中重写它。问题是它既不可插拔也不可挂接。定义如下:

// no if(!function_exists())
function parentThemeFunction() {
   //some bad coding
}
// no add_action
仅此而已。它未在函数中定义。php,但在“parentTheme/directory/file.php”中

所以我听说了“runkit\\u function\\u redefine”和“runkit\\u function\\u rename”,但这意味着我必须在服务器上实现“runkit”库。

到目前为止,我唯一的选择是在父主题中编辑原始函数。有可能在下一次主题更新时看到我的代码被覆盖。

以下是不同的呼叫:

// parentTheme/includes/profiles.php
class Fre_ProfileAction extends AE_PostAction {
    function __construct( $post_type = \'fre_profile\' ) {
        // some unrelevant code

        $this->add_ajax( \'ae-profile-sync\', \'sync_post\' );
    }
    function sync_post() {
        // bad coding that i have to override
    }
}

// parentTheme/functions.php
class ET_FreelanceEngine extends AE_Base {
    function __construct() {

        // some unrelevant code
        $this->profile_action = new Fre_ProfileAction();
    }
}

global $et_freelance;
add_action( \'after_setup_theme\', \'et_setup_theme\' );
function et_setup_theme() {
    global $et_freelance;
    $et_freelance = new ET_FreelanceEngine();
    // some unrelevant code
}
Fre\\u ProfileAction扩展了AE\\u PostAction,它扩展了自身的AE\\u基类。

class AE_Base {
    public function add_ajax($hook, $callback, $priv = true, $no_priv = true, $priority = 10, $accepted_args = 1) {
        $this->add_action(self::AJAX_PREFIX . $hook, $callback, $priority, $accepted_args);
    }

    public function add_action($hook, $callback, $priority = 10, $accepted_args = 1) {
        add_action($hook, array(
            $this,
            $callback
        ) , $priority, $accepted_args);
    }
}
有什么想法吗?

1 个回复
最合适的回答,由SO网友:mmm 整理而成

要重新定义AJAX操作,可以尝试

add_action(AE_Base::AJAX_PREFIX . "ae-profile-sync", function () {

    $profile_action = $GLOBALS["et_freelance"]->profile_action;


    // remove base action

    remove_action(
        AE_Base::AJAX_PREFIX . "ae-profile-sync"
        ,
        [
            $profile_action,
            "sync_post",
        ]
        , 10
    );


    // add new AJAX action

    add_action(
        AE_Base::AJAX_PREFIX . "ae-profile-sync"
        , function () {

            // new code here


        }
    );


}, 1); // priority 1 to launch this before the method sync_post

结束

相关推荐

初学者问题:通过管理Web界面访问Functions.php以导入自定义帖子类型?

是否可以访问这些功能。php文件仅仅使用管理web界面?我正在尝试访问以前创建的(手动编码的)自定义帖子类型,我不得不跳过很多障碍,因为我无法访问函数中的代码。php文件。我已经浏览了很多帮助页面,但建议的步骤似乎总是涉及到函数。php文件(我无法访问)或使用插件中的导入/导出工具,该插件首先创建了自定义帖子类型(据我所知,没有使用任何插件)。这似乎是一个非常基本的问题,但我一辈子都想不出来。任何帮助都将不胜感激!