未定义的偏移量:0 in> […] /wp-includes/capabilities.php,行1067


8

嘿,我在本地主机设置中收到此错误消息,但仅在启用Genesis Framework的情况下;WordPress 21可以正常工作。当我要创建新帖子时会发生这种情况。如果我刷新页面,该错误将重复出现,但帖子本身会创建,并且一切似乎都正常。

有谁知道是什么原因造成的?

Notice: Undefined offset: 0 in /var/www/secret/htdocs/wp-includes/capabilities.php on line 1067
Notice: Undefined offset: 0 in /var/www/secret/htdocs/wp-includes/capabilities.php on line 1067
Warning: Cannot modify header information - headers already sent by (output started at /var/www/secret/htdocs/wp-includes/capabilities.php:1067) in /var/www/secret/htdocs/wp-includes/pluggable.php on line 876

这是一个新安装的未修改的Genesis Framework。

Answers:


12

您已发现Genesis中的错误。

您的Xdebug堆栈将罪魁祸首归为该genesis_save_custom_fields()函数,该函数current_user_can()使用单个功能(edit_post和edit_page)进行调用,该功能还需要一个附加参数,在这种情况下,缺少帖子ID。

current_user_can()电话has_cap()这就要求map_meta_cap()其确实在功能名的switch语句。请参阅capabilities.php的第1067行。这2个未定义的偏移量通知来自$ args [0],这不是一个数组,因为Genesis中current_user_can调用中缺少发布ID。

Cannot modify header information - headers already sent警告来自Xdebug打印出PHP声明。实际上,如果您没有使用Xdebug,除非您检查了日志,否则您甚至都不会看到PHP通知,因为该错误位于save_post附带的函数中,并且页面会刷新,从而阻止了警告/通知/错误显示在页面上即使WP_DEBUG设置为true。

固定:

在lib / functions / options.php的第234行更改:

/** Check the user allowed to edit the post or page */
if ( ( 'page' == $post->post_type && ! current_user_can( 'edit_page' ) ) || ! current_user_can( 'edit_post' ) )
    return;

至:

/** Check the user allowed to edit the post or page */
if ( ! current_user_can( 'edit_post', $post->ID ) )
    return;

另外要注意的是,由于edit_pageedit_post可以互换,因此无需检查post_type 。


啊,这解释了为什么在测试本地主机apache2(没有xdebug)时,在我测试过的Webhost上,为什么我的笔记本电脑都没有出现任何错误。感谢您对这个问题的深入研究,我对所有这些“复杂”的东西不知所措;)。我现在发现了起源中的各种错误,当然应该使用xdebug和WP_DEBUG对其进行测试。例如,发现起源中缺少esc_html。他们多次聘请wp核心开发人员Mark Jaquirth对其进行安全审核,并在广告语中引用他的话说他的安全性,我现在质疑Genesis Framework的整体质量
James Mitch

0

这是Mark Jaquith在审核中于1.17修正的。我已经提交了可能的1.9.2版本的票证。

我个人认为这是一个WordPress问题,因为map_meta_cap()不会检查或清理$ args [0]。因此,我因此向WordPress核心提交了一张票


“ 1.17上的中继”是什么?创世记1.1.7?为什么在1.9.1中如此?即使是wordpress的问题,他们也会发布一个稳定的框架,您甚至可以发布一个完全停止页面加载的烦人的错误。WTF?上面解释了@Chris_O,可以通过为其指定参数来轻松地修复它。我使用$ post_id而不是§post-> ID,因为它也可以作为创世函数的参数,我不知道这是否明智,我也很好奇是否将其简化为正义if ( ! current_user_can( 'edit_post', $post_id ) )并跳过其他。
James Mitch

我的意思是说,即使没有做简单的动作(例如WP_DEBUG和xdebug),对于开发人员来说,是否应该将其稳定发布而不进行测试?我不是这方面的专家,但我会说,如果他们做错了。更不用说它们是自称为“ wordpress框架的行业标准”。应该不会是在堆栈溢出(我和@Chris_O)检测和修复他们的蹩脚的代码2个家伙!
James Mitch

抱歉,请不要将此归咎于wordpress核心!不是,即使这是位于其下的核心错误。而且我不会告诉我在哪里找到缺少esc_html 的安全漏洞的原因有两个。1.不想冒险贫穷的网站所有者!2.他们的工作是找到价格超过$ 80的东西!实际上,它应该在几年前修复!很高兴我从github下载了它,而不是为此付费。
James Mitch

詹姆斯,哇。太生气了。首先,按照正常步骤使用WP_DEBUG测试Genesis。当我注意到它致力于作为修复程序时,它于1月17日提交。此外,正如Jaquith所指出的,这并不是Genesis或WordPress中的安全漏洞。
特拉维斯·史密斯

因此,请告诉我他们是否确实检查了为什么为什么未能检测到这种难以检测的错误(如我所说的那样停止执行),而不是将您重定向到帖子编辑器,让您每次执行帖子/页面时都盯着一个怪异的xdebug消息?让我猜想他们“测试了”它,但是他们的测试程序不涉及执行或编辑ROFLMAO!说出您想要的内容,随心所欲地捍卫他们(因为偏见非常有偏见),这是事实,他们没有通过popper测试!
詹姆斯·米奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.