使用 WordPress 覆盖插件中的过滤器

Overwriting a filter in plugin using WordPress

我在名为 'JobBoard Package'

的 WordPress 插件中有以下过滤器
        function apply_job_validate($validate){
        $package  = jb_package_get_current_package();

        if(!$package){
            jb_notice_add(esc_html__('You need to purchase a package before applying job.', 'jobboard-package'), 'error');
            return true;
        }

        $applied  = JB()->candidate->count_applied_all();
        $limit    = get_post_meta($package->ID, '_apply', true);
        if($applied >= $limit){
            jb_notice_add(esc_html__('Apply job limited, you can update your package.', 'jobboard-package'), 'error');
            return true;
        }
        return $validate;
    }

在插件顶部被调用如下:

    private function actions(){
        add_action( 'wp_enqueue_scripts', array($this, 'add_scripts'));
        add_action( 'admin_menu', array ($this, 'get_menu_notice') , 100);
        add_action( 'admin_enqueue_scripts', array($this, 'add_admin_scripts'));
        add_action( 'save_post_jobboard-post-jobs', array($this, 'save_post'));

        add_filter( 'jobboard_query_endpoint_args', array($this, 'add_endpoint'));
        add_filter( 'jobboard_query_endpoint_package_title', array($this, 'add_endpoint_package_title'));
        add_filter( 'jobboard_query_endpoint_transactions_title', array($this, 'add_endpoint_transactions_title'));
        add_filter( 'jobboard_employer_navigation_args', array($this, 'add_endpoint_menu'));
        add_filter( 'jobboard_candidate_navigation_args', array($this, 'add_endpoint_menu'));

        add_action( 'jobboard_endpoint_employer_new', array($this, 'get_template_add_new'), 0);
        add_action( 'jobboard_endpoint_employer_package', array($this, 'get_template_package') );
        add_action( 'jobboard_endpoint_candidate_package', array($this, 'get_template_package') );

        add_filter( 'jobboard_form_handler_validate_add_job', array($this, 'add_new_job_validate'));
        add_filter( 'jobboard_form_handler_validate_apply_job', array($this, 'apply_job_validate'));
    }

我已尝试通过 functions.php 禁用 apply_job_validate 并作为插件使用以下代码及其变体,但没有成功,非常感谢您的帮助。

if( class_exists('JB_Package' ) ){
  //This should work in whatever case
  remove_filter('jobboard_form_handler_validate_apply_job', array( 'JB_Package', 'apply_job_validate'));
  //or Instantiating a new instance
  //remove_filter('jobboard_form_handler_validate_apply_job', array( new JB_Package(), 'apply_job_validate'));
  //or Targeting the specific instance, not tested
  //remove_filter('jobboard_form_handler_validate_apply_job', array( JB_Package::get_instance(), 'apply_job_validate'));
}

我也试过如下:

function remove_package() {
  if (class_exists('JB_Package')) {
    remove_filter('jobboard_form_handler_validate_apply_job', array( 'JB_Package', 'apply_job_validate'));
  }
}
add_action('plugins_loaded','remove_package');

如有任何帮助,我们将不胜感激。非常感谢!

您应该使用稍后的操作挂钩,例如 after_setup_theme。您正在连接到 plugins_loaded,它会在您的 functions.php 文件被解析之前触发。尝试:

function remove_package() {
  if (class_exists('JB_Package')) {
    remove_filter('jobboard_form_handler_validate_apply_job', array( 'JB_Package', 'apply_job_validate'));
  }
}
add_action('after_setup_theme','remove_package');

但是,您应该检查 'JB_Package' class 何时挂接(如果它完全挂接)。如果它在 init 处挂钩,那么您需要稍后挂钩到 wp_loaded.

之类的东西
//if class 'JB_Package' is hooked at 'init'
add_action('wp_loaded','remove_package');