从wordpress woothemes插件中删除(条件)动作

时间:2017-03-28 15:23:50

标签: php wordpress woocommerce hook-woocommerce

我只想使用functions.php删除一个消息块。 这是我想删除的动作:

    if( empty( $active_ids ) ){    
                    add_action( 'sensei_loop_course_inside_before', 
                    array( $this, 'active_no_course_message_output' ) );        
    }

所以我想我必须先参考课程才能访问它我希望删除它的功能,所以我做了:

function remove_no_active_courses_message(){
    //classname where the function i want to remove is:
    //class Sensei_Shortcode_User_Courses implements Sensei_Shortcode_Interface 

    remove_action( 'sensei_loop_course_inside_before', array( 'Sensei_Shortcode_User_Courses', 'active_no_course_message_output' ) ); 
    remove_action( 'sensei_loop_course_inside_before', array( $Sensei_Shortcode_User_Courses, 'active_no_course_message_output' ) ); 

}
add_action('sensei_loop_course_inside_before', 'remove_no_active_courses_message'); 

但是这两个都不起作用,有什么建议吗?

修改 来源类:https://github.com/Automattic/sensei/blob/master/includes/shortcodes/class-sensei-shortcode-user-courses.php

编辑2 (注意:当我尝试对类对象进行全局化时,它会在此类上转储null,因此可能问题是我无法访问它的全局元素?woothemes sensei对象工作正常,我可以从那里打印东西。但不能通过类对象实例访问该函数) 我尝试了一些建议的答案:

    function remove_no_active_courses_message(){
        //classname where the function i want to remove is:
        //class Sensei_Shortcode_User_Courses implements Sensei_Shortcode_Interface 

        global $Sensei_Shortcode_User_Courses; //DOESNT SEEM TO INSTANTIATE?
        global $woothemes_sensei; //WORKS FINE AND CAN ACCES IT'S OBJECTS HERE

        //var_dump($Sensei_Shortcode_User_Courses); //PRINTS NULL
        //var_dump($woothemes_sensei); //PRINTS THE ENTIRE THINGY SUCCESFULLY

        remove_action( 'sensei_loop_course_inside_before', array( $Sensei_Shortcode_User_Courses, 'active_no_course_message_output' ), 99 );

}   
    add_action('wp_footer', 'remove_no_active_courses_message');    

2 个答案:

答案 0 :(得分:0)

试试这个。 我没有测试过它。但它应该工作。

  

如果已在某个类中添加了某个操作,例如a   插件,删除它将需要访问类变量。

function remove_my_class_action()
{
    global $my_class; // your class name
    remove_action( 'sensei_loop_course_inside_before', array( $my_class, 'active_no_course_message_output' ) );
}
add_action( 'wp_head', 'remove_my_class_action' );

修改:如果无效,请尝试添加优先级或更改挂钩。

  

值得注意的是,您可能需要优先删除   添加操作后发生的挂钩操作。你不能   在添加动作之前成功删除。

解决方案1:调整优先级

function remove_my_class_action()
{
    global $my_class; // your class name
    remove_action( 'sensei_loop_course_inside_before', array( $my_class, 'active_no_course_message_output', 99 ) );
}
add_action( 'wp_head', 'remove_my_class_action' );

解决方案2:使用wp_footer

function remove_my_class_action()
{
    global $my_class; // your class name
    remove_action( 'sensei_loop_course_inside_before', array( $my_class, 'active_no_course_message_output', 99 ) );
}
add_action( 'wp_footer', 'remove_my_class_action' );

答案 1 :(得分:0)

问一下,有没有办法在functions.php之后调用这些文件?

这很难看,但试试吧,

  1. 创建一个返回并清空字符串的函数:

       function emptyString(){
          return ' ';
       }
    
  2. 然后添加到钩子

     add_action('sensei_loop_course_inside_before', 'emptyString', 11)
    
  3. 让我们这样做并检查是否有事情发生