我有以下代码:
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
中获取数据并仍然可以访问我的钩子?
答案 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
的某些属性和方法(例如私有/受保护的方法和属性),并且您无法执行任何操作,因为您的函数永远不会成为另一个插件的类范围。