如何修复WordPress 5.5中的管理菜单页边距错误?

时间:2020-08-12 作者:Braza

我最近将WordPress实例从5.4更新到了5.5,最终在管理区域的菜单上方出现了一个恼人的页边空白。

enter image description here

我停用了所有插件,切换了主题,做了一些检查,最后得到了一些发现。

导致边距顶部的CSS类是.php-error, 附加到#adminmenuwrap 当应该显示php错误时。

/* in load-styles.php */
.php-error #adminmenuback, .php-error #adminmenuwrap {
    margin-top: 2em;
}

/* the menu wrapper */
<div id="adminmenuwrap"></div> 

/* the php script in /wp-admin/admin-header.php line 201 */
// Print a CSS class to make PHP errors visible.
if ( error_get_last() && WP_DEBUG && WP_DEBUG_DISPLAY && ini_get( \'display_errors\' ) ) {
    $admin_body_class .= \' php-error\';
}

/* print_r(error_get_last()) outputs */
Array ( 
[type] => 8 
[message] => unserialize(): Error at offset 11857 of 11895 bytes 
[file] => .../wp-includes/functions.php 
[line] => 624
)

/**
 * Unserialize data only if it was serialized.
 *
 * @since 2.0.0
 *
 * @param string $data Data that might be unserialized.
 * @return mixed Unserialized data can be any type.
 */
function maybe_unserialize( $data ) {
    if ( is_serialized( $data ) ) { // Don\'t attempt to unserialize data that wasn\'t serialized going in.
        return @unserialize( trim( $data ) );
    }

    return $data;
}

这很正常WP_DEBUG && WP_DEBUG_DISPLAY && ini_get( \'display_errors\' ) 是真的(因为我实际上正在调试),但问题是没有显示php错误。

此实例(有bug)正在联机托管服务器上运行。但我也有这个实例在localhost上运行的完全相同的副本,只是它没有这个bug。

有人遇到过这种情况吗?你有什么建议?

------- EDIT (Fix) --------

下面的操作确实解决了问题,但我仍然不确定其来源或;“真实”;错误背后的原因。尽管如此,这是序列化数据中的一个计算错误,更准确地说,在我的例子中,它来自隐私策略页面示例(WordPress的教程)的内容。

我是这样做的:

// Edit the function in /wp-includes/functions.php on line 624 and include some 
// error logging. 
// DO NOT FORGET TO REVERT BACK TO THE ORIGINAL CODE ONCE DONE DEBUGGING!

/**
 * Unserialize data only if it was serialized.
 *
 * @since 2.0.0
 *
 * @param string $data Data that might be unserialized.
 * @return mixed Unserialized data can be any type.
 */
function maybe_unserialize( $data ) {
    if ( is_serialized( $data ) ) { // Don\'t attempt to unserialize data that wasn\'t serialized going in.
        error_log( "DATA DEBUGGING START ---------- \\r");
        error_log( "TRIMED: ");
        error_log( trim( $data ) );
        error_log( "UNSERIALIZED: ");
        error_log( print_r(unserialize( trim( $data ) ), true));
        error_log( "DATA DEBUGGING END ---------- \\r\\n");
        return unserialize( trim( $data ) );
    }

    return $data;
}

这将在调试中记录所有序列化和未序列化的值。日志或错误。根据您使用的方法记录。我正在使用默认的WordPressdefine( \'WP_DEBUG_LOG\', true ); 在w配置中。php,它在文件调试中记录错误。在/wp content/下登录。

这样做可以检测出数据库中导致问题的确切行。问题来自错误的计数计算。

a:3:{s:11:"plugin_name";s:9:"WordPress";s:11:"policy_text";s:11789:".....
我对那个键的内容进行了字符/字节计数,结果是11799而不是11789。

中的值s:11789 必须是s:11799 就我而言。所以我在数据库中更改了它,一切都很好。我也在编辑器中编辑了页面并保存了它,然后重新检查,一切都正常。

这解决了问题,但我想在某个时候出了问题。很可能是在我将本地数据库导入到另一个实例时。

我希望这有帮助!

4 个回复
SO网友:RJR

我也遇到了这个问题,结果是因为实际上有一个错误没有显示出来。一旦我纠正了潜在的错误,最高利润问题就消失了。

这在wp admin/admin标题中。php:

// Print a CSS class to make PHP errors visible.
if ( error_get_last() && WP_DEBUG && WP_DEBUG_DISPLAY && ini_get( \'display_errors\' ) ) {
    $admin_body_class .= \' php-error\';
}
因此,我临时将该error\\u get\\u last()输出的显示添加到我的一个插件中:

$debug = print_r(error_get_last(),true);
echo \'<p>php-error: \'.esc_attr($debug).\'</p>\';
这告诉了我潜在的错误在哪里。我修好了,问题解决了!

SO网友:squarecandy

您还可以设置WP_DEBUGfalse 在您的wp-config.php 文件,这将不再显示(将不再生成.php错误类)。无论如何,这是您应该在任何生产站点上设置它的方式。

如果调试模式打开,并且您在打印到屏幕时出错,有时前30-40个字符会被固定位置的左侧管理菜单覆盖,因此我认为这是一个新添加的;解决方案;对于这个问题。

但是,正如罗伯特所说,是的,最好的解决方案是修复错误。但有时,如果只是第三方插件或主题发出的通知或警告,您就无法做到这一点,所以只需确保调试已在生产中关闭,您就可以了。

SO网友:Braza

This is a fix, not a solution

下面的操作确实解决了问题,但我仍然不确定其来源或;“真实”;错误背后的原因。尽管如此,这是序列化数据中的一个计算错误,更准确地说,在我的例子中,它来自隐私策略页面示例(WordPress的教程)的内容。

我是这样做的:

// Edit the function in /wp-includes/functions.php on line 624 and include some 
// error logging. 

/**
 * Unserialize data only if it was serialized.
 *
 * @since 2.0.0
 *
 * @param string $data Data that might be unserialized.
 * @return mixed Unserialized data can be any type.
 */
function maybe_unserialize( $data ) {
    if ( is_serialized( $data ) ) { // Don\'t attempt to unserialize data that wasn\'t 
serialized going in.
        error_log( "DATA DEBUGGING START ---------- \\r");
        error_log( "TRIMED: ");
        error_log( trim( $data ) );
        error_log( "UNSERIALIZED: ");
        error_log( print_r(unserialize( trim( $data ) ), true));
        error_log( "DATA DEBUGGING END ---------- \\r\\n");
        return unserialize( trim( $data ) );
    }

    return $data;
}

DO NOT FORGET TO REVERT BACK TO THE ORIGINAL CODE ONCE DONE DEBUGGING!

这将在调试中记录所有序列化和未序列化的值。日志或错误。根据您使用的方法记录。我正在使用默认的WordPressdefine( \'WP_DEBUG_LOG\', true ); 在w配置中。php,它在文件调试中记录错误。在/wp content/下登录。

这样做将有助于检测导致问题的数据库中的确切行。这里的问题来自错误的计数计算。

a:3:{s:11:"plugin_name";s:9:"WordPress";s:11:"policy_text";s:11789:".....
我对那个键的内容进行了字符/字节计数,结果是11799而不是11789。

中的值s:11789 必须是s:11799 就我而言。所以我在数据库中更改了它,一切都很好。我也在编辑器中编辑了页面并保存了它,然后重新检查,一切都正常。

这解决了问题,但我想在某个时候出了问题。很可能是在我将本地数据库导入到另一个实例时。

我希望这有帮助!

SO网友:Tom Groot

进一步阐述布拉萨的答案。如果某个数据库值中存在长度不匹配,可以track it down 通过执行正则表达式搜索并检查字符串长度是否匹配。

我扩展了Braza的代码,使之更容易:

/**
 * Unserialize data only if it was serialized.
 *
 * @since 2.0.0
 *
 * @param string $data Data that might be unserialized.
 * @return mixed Unserialized data can be any type.
 */
function maybe_unserialize( $data ) {
    if ( is_serialized( $data ) ) { // Don\'t attempt to unserialize data that wasn\'t serialized going in.
        preg_match_all(\'/s:([0-9]*):"/\', $data, $matches, PREG_OFFSET_CAPTURE);
        foreach ($matches[1] as $match) {
            $string = substr($data, (intval($match[1]) + strlen(strval($match[0])) + 1), (intval($match[0]) + 2));
            if (substr($string, -1) != \'"\') {
                error_log(\'LENGTH MISMATCH!!! \\r\');
                error_log($string);
                error_log(\'CHANGE THIS VALUE: \\r\');
                error_log($data);
            }
        }
        return unserialize( trim( $data ) );
    }

    return $data;
}

相关推荐

MAMP上的Live to Local,不工作,正在输出函数。php代码

这是一个较旧的自定义主题。在live server上,我更新了WP的最新版本,更新了包括ACF在内的所有插件。下载了所有文件、DB并重命名为本地URL。我已经在各种构建中多次这样做,从来没有遇到过问题。运行MAMP时,浏览器将从函数中输出PHP代码。php文件。不是标题或任何CSS,我看到HTML在此之后正在加载。也无法访问/wp admin,结果相同。在live server 7.3.11上运行的PHP,在MAMP上最接近的是7.39有什么建议吗?我不是最初的主题开发人员。这太令人恼火了,因为我只需要重