cwd*_*cwd 13 php arrays wordpress object data-structures
直到大约3.3beta1项WP_Admin_Bar Object可以使用这种类型的语法访问,例如更改现有菜单项之一的CSS类:
$wp_admin_bar->menu->{'wp-logo'}['meta']['class'] = 'new-class';
运行print_r($wp_admin_bar)输出时看起来像这样:
WP_Admin_Bar Object
(
    [menu] => stdClass Object
        (
            [my-account] => Array
                (
但是,围绕版本3.3beta2,上面用于更改菜单项的CSS类的语法不再有效,并且输出print_r($wp_admin_bar)显示该对象的不同结构:
WP_Admin_Bar Object
(
    [nodes:WP_Admin_Bar:private] => Array
        (
            [my-account] => stdClass Object
                (
                    [id] => my-account
                )
我意识到Wordpress可能不希望我以这种方式摆弄菜单,如果有更标准化的方法来做到这一点,我很乐意使用它,但据我所知,只有两个功能可用于修改管理栏,add_menu_item和remove_menu_item,这些不能灵活地执行更改现有菜单项的属性等操作.
为了确认,我看到wp-includes/class-wp-admin-bar.php很明显Wordpress已经改变了他们定义变量的方式.
老班
class WP_Admin_Bar {
    var $menu;
    var $proto = 'http://';
    var $user;
新课程
class WP_Admin_Bar {
    private $nodes = array();
    private $root = array();
    public $proto = 'http://';
    public $user;
所以我的问题是,如果我有权访问该global $wp_admin_bar对象,我是否可以访问其中的对象nodes:WP_Admin_Bar:private?如果没有,是否有另一种方法来获取这些对象,例如创建一个扩展WP_Admin_Bar类的新类,然后从那里访问对象?
ps:我试图在不改变核心Wordpress文件的情况下克服这一挑战......
链接到该文件:http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-includes/class-wp-admin-bar.php.source.html
Gor*_*don 12
如果您不想触摸核心文件,那么您必须使用Reflection:
$adminBar = new WP_Admin_Bar();
$reflector = new ReflectionObject($adminBar);
$nodes = $reflector->getProperty('nodes');
$nodes->setAccessible(true);
print_r($nodes->getValue($adminBar));
hackish替代方案是将对象转换为数组,然后执行:
$adminbar = (array) new WP_Admin_Bar;
$nodes = $adminbar[chr(0) . 'WP_Admin_Bar' . chr(0) . 'nodes'];
print_r($nodes);
将它们更改为受保护的成员变量并扩展该类.
无论是谁与私人成员一起撰写课程,都会使课程"最终".这表明你应该总是把你的成员写成受保护的,除非有一个真正的,非常好的理由不这样做.
希望有帮助......
| 归档时间: | 
 | 
| 查看次数: | 9222 次 | 
| 最近记录: |