wordpress 如何修复nav_menu.php中的“非法字符串偏移'output_key'”

nhjlsmyf  于 2022-11-22  发布在  WordPress
关注(0)|答案(2)|浏览(109)

我在WordPress上有一个网站,我的团队中有人更新了一些东西,现在该网站上有一个错误:
Warning: Illegal string offset 'output_key' in /.../wp-includes/nav-menu.php
我禁用了调试消息,现在网站运行正常。我想这不是最好的解决方案。数小时的谷歌搜索和寻找这里的东西带给我一个事实,我必须告诉脚本'output_key'是一个数组元素。

$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
        'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );
    $args = wp_parse_args( $args, $defaults );
    $args['include'] = $items;

if ( ARRAY_A == $args['output']) {
        $GLOBALS['_menu_item_sort_prop'] = $args['output_key'];
        usort($items, '_sort_nav_menu_items');
        $i = 1;
        foreach( $items as $k => $item ) {
            $items[$k]->$args['output_key'] = $i++; //here is the error
        }
    }

我尝试在第1行询问$args是否为数组。

$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
        'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );
    $args = wp_parse_args( $args, $defaults );
    $args['include'] = $items;

if ( ARRAY_A == $args['output'] && is_array($args) ) {
        $GLOBALS['_menu_item_sort_prop'] = $args['output_key'];
        usort($items, '_sort_nav_menu_items');
        $i = 1;
        foreach( $items as $k => $item ) {
            $items[$k]->$args['output_key'] = $i++; //here is the error
        }
    }

但是第6行仍然显示网站上的错误。我不知道该怎么处理这一行。

zbwhf8kr

zbwhf8kr1#

似乎您使用的是过时版本的WordPress,它不再与PHP 7兼容。
参见从php 5.6迁移到php 7一节中关于变量处理的内容。

这意味着表达式$items[$k]->$args['output_key']被解释为:

  • PHP 5中的$items[$k]->{$args['output_key']}
  • PHP 7中的($items[$k]->$args)['output_key']

这个问题似乎也在recent wordpress code中得到了修复。
要手动修复此问题,只需替换代码:

$items[$k]->$args['output_key'] = $i++; // here is the error

与:

$items[$k]->{$args['output_key']} = $i++; // problem solved :)

您还应该考虑升级整个wordpress安装,以确保其余的代码与PHP7兼容。

ql3eal8s

ql3eal8s2#

好吧,让我们简单地过一遍:
1.点击鼠标右侧的紫色方框,你会看到“检查”选项。

1.点击inspect选项,你会在顶部看到一堆代码。

1.单击突出显示的代码旁边的三个点。

1.单击“删除元素”,操作就完成了!

相关问题