使用wordpress插件的钩子

时间:2016-02-10 22:28:57

标签: php wordpress

我有以下代码:

class IPT_FSQM_Form_Creation_Hook {
public function __construct() {
    add_action( 'ipt_fsqm_form_created', array( $this, 'hook_into_form_creation' ), 10, 1 );
}
   function hook_into_form_creation( $data ) {
   // Global config and db variables
   global $wpdb, $ipt_fsqm_info;
      $wpdb->insert( $ipt_fsqm_info['form_table'], array(
        'name' => 'I did this',
      ) );
   }  
}

插件中创建的钩子如下:

$return_id = $wpdb->insert_id;
do_action( 'ipt_fsqm_form_created', $return_id, $this );

我的自定义钩子没有被触发我是如何拥有它的。我知道它没有被触发,因为没有任何东西插入到数据库中。当我将代码更改为以下内容时,它会插入数据但我无法访问$this变量中的任何数据:

add_action( 'ipt_fsqm_form_created', 'hook_into_form_creation' );
function hook_into_form_creation( $data ) {
// Global config and db variables
global $wpdb, $ipt_fsqm_info;
  $wpdb->insert( $ipt_fsqm_info['form_table'], array(
  'name' => 'I did this',
  ) );
}

如何在$this中获取数据并仍然可以访问我的钩子?

1 个答案:

答案 0 :(得分:1)

原来问题是该类没有被初始化,因此该函数从未附加到该动作。

我认为你正以错误的方式接近这一点。在类的非静态方法中可用的range变量始终指向当前类的实例。因此,在方法中使用for in in np.range(...): # do something 实际上会指向$this类实例,而不是指向触发操作的类的实例。

由于你没有将这个类用于其他任何事情,因此制作该课程并不重要。相反,您可以创建常规功能并将其附加到操作,就像您已经做过的那样。但是只有一个区别:

$this

请注意IPT_FSQM_Form_Creation_Hook的最后一个参数: 2 。这定义了回调函数期望的参数数量,默认为1.另请注意,我现在已在函数中添加了add_action( 'ipt_fsqm_form_created', 'hook_into_form_creation', 10, 2 ); function hook_into_form_creation( $data, $object ) { // Global config and db variables global $wpdb, $ipt_fsqm_info; $wpdb->insert( $ipt_fsqm_info['form_table'], array( 'name' => 'I did this', ) ); } 参数。使用此功能就像在函数中使用add_action()一样 - 它将是另一个插件类的实例。

请注意,您可能无法访问$object的某些属性和方法(例如私有/受保护的方法和属性),并且您无法执行任何操作,因为您的函数永远不会成为另一个插件的类范围。