我不确定这是一个PHP问题(适用于StackOverflow)还是WordPress问题(适用于StackExchange),但是自从我的问题appears 与add_action()
函数,我把问题放在这里。
下面是一些导致相同问题的简化代码(以避免重新发布我的数百行插件):
<?php
$class = new MyClass();
add_action(\'init\', array($class, \'init\'));
class MyClass {
public static function init() {
$this->core();
}
public static function core() {
echo "I never get this far...";
}
}
?>
我得到以下错误:
Fatal error: 在中不在对象上下文中使用$this/home/coupon/public_html/wp-content/plugins/test.php 在线7
如果我的add_action()
而调用的是:
add_action(\'init\', \'MyClass::init\');
然后我会理解这个错误(因为函数是静态调用的,没有DEMenu的实例
$this
但我不明白为什么会发生这种情况,因为我使用了一个数组并传递了该类的一个实例。
我的具体问题实际上与这个问题有关。我创建了一个自定义Walker类,然后使用wp_nav_menu_args
筛选以通过我的自定义Walker。我在中获取此错误class-wp-walker.php
在线185. 该行尤其是:
$id_field = $this->db_fields[\'id\'];
有什么想法吗?
编辑-
test.php
现在运行正常,但原始问题尚未解决。。。因此,这里是我的插件索引。php文件(简化):
$DEMenu = new DEMenu();
class DEMenu {
function DEMenu() {
if (is_admin()) {
add_action(\'admin_menu\', array(&$this, \'admin\'));
} else {
add_action(\'init\', array(&$this, \'core\'));
}
}
public function admin() {
/* Not important */
}
public function core() {
add_filter(\'wp_nav_menu_args\', array(&$this, \'add_walker\'));
}
public function add_walker( $args ) {
$args[\'walker\'] = \'DEMenu_Walker\';
return $args;
}
}
class DEMenu_Walker extends Walker_Nav_Menu {
function __construct() {
die("We made it to the constructor!");
}
}
如上所述,我得到以下错误:
Fatal error: 在中不在对象上下文中使用$this/home/coupon/public_html/wp-includes/class-wp-walker.php 在线185
自上述test.php
正在失败Walker_Nav_Menu
类通常不会出现此错误(直到我添加了插件),我想问题出在我的add_action()
或add_filter()
呼叫。然而,由于它仍然失败,我不能完全确定问题在哪里。。。
最终编辑-
仔细重读walk_nav_menu_tree()
函数,我发现我的walker类存在问题。。。
function walk_nav_menu_tree( $items, $depth, $r ) {
$walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
$args = array( $items, $depth, $r );
return call_user_func_array( array(&$walker, \'walk\'), $args );
}
自
$walker
正在设置为
$r->walker
它是一个字符串,而不是类的实例。因此,类方法是静态调用的,而不是通过类的实例调用。而不是:
$args[\'walker\'] = \'DEMenu_Walker\';
我应该:
$args[\'walker\'] = new DEMenu_Walker();
<小时>
Task: 调用类方法作为WordPress插件的挂钩,以便
$this
变量未断开