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

Taa*_*ank 1 php arrays wordpress

我在 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

我试着问$args它是否是第 1 行中的数组。

$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
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是第 6 行仍然在网站上显示错误。我不知道如何处理那条线。

Kar*_*lis 7

您使用的似乎是过时的 wordpress 版本,该版本不再与 PHP 7 兼容。

请参阅有关变量处理的从 php 5.6 迁移到 php 7 部分

变量处理

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

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

最近的 wordpress 代码似乎也修复了这个问题。

要手动修复问题,只需替换代码:

$items[$k]->$args['output_key'] = $i++; // here is the error
Run Code Online (Sandbox Code Playgroud)

和:

$items[$k]->{$args['output_key']} = $i++; // problem solved :)
Run Code Online (Sandbox Code Playgroud)

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