【问题标题】:Overwriting a filter in plugin using WordPress使用 WordPress 覆盖插件中的过滤器
【发布时间】:2018-02-19 21:18:24
【问题描述】:

我在名为“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');

任何帮助将不胜感激。非常感谢!

【问题讨论】:

    标签: wordpress plugins filter overwrite


    【解决方案1】:

    您应该使用稍后的操作挂钩,例如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”类何时被钩住(如果它被钩住了)。如果它与init 挂钩,那么您需要稍后再与wp_loaded 挂钩。

    //if class 'JB_Package' is hooked at 'init'
    add_action('wp_loaded','remove_package');
    

    【讨论】:

    • 谢谢,这行得通。你对如何检查班级是否上钩有什么建议吗?我还是个新手,但我知道这是更好的做事方式。
    • 我已尝试按以下方式删除更多内容,但其余部分似乎不起作用anotepad.com/notes/csi3as
    • 你可以看看声明了 'JB_Package' 的插件文件,看看他们是挂了它还是以某种方式初始化了类。
    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2013-05-01
    • 1970-01-01
    • 2019-01-01
    • 2011-11-22
    • 2016-01-13
    • 2018-10-09
    • 2019-01-27
    相关资源
    最近更新 更多