【发布时间】:2009-07-22 16:09:31
【问题描述】:
您能告诉我您对此的看法,并可能看看您是否可以重新创建它?有两种情况:
场景 1(按预期工作)...
$post->post_content 变量包含以下内容(带有 VALID 图像 src):
(string) "before [hw] <img src="/path/to/valid_image.gif" /> after"
这段代码放在主题header.php的顶部...
1: echo test_out();
2:
3: function test_out() {
4: global $post;
5: error_log( 'stage_1' );
6: $str = $post->post_content;
7: error_log( 'stage_2' );
8: var_dump( isset( $str ) );
9: error_log( 'stage_3' );
10: $str = test_core_wp( 'test_shortcode', $str );
11: error_log( 'stage_4' );
12:
13: return $str;
14: }
15:
16: function test_shortcode( $content ) {
17: return str_replace( '[hw]', 'Hello World!', $content );
18: }
19:
20: function test_core_wp( $function, $a = NULL ) {
21: $wrap = array ( 'test_shortcode' => 'test_shortcode' );
22:
23: if ( isset( $a ) ) $args[] = $a;
24:
25: return call_user_func_array( $wrap[ $function ], $args );
26: }
输出这个(正确)...
bool(true)
before Hello World! <img src="/path/to/valid_image.gif" /> after
在 PHP 日志中(正确)...
[22-Jul-2009 11:49:36] stage_1
[22-Jul-2009 11:49:36] stage_2
[22-Jul-2009 11:49:36] stage_3
[22-Jul-2009 11:49:36] stage_4
场景 2(出现问题的地方)...
$post->post_content 变量现在包含:(带有无效图像 src):
(string) "before [hw] <img src="/path/to/broken_image.gif" /> after"
输出这个(仍然正确)...
bool(true)
before Hello World! <img src="/path/to/broken_image.gif" /> after
在 PHP 日志中(这是问题)...
[22-Jul-2009 11:56:11] stage_1
[22-Jul-2009 11:56:11] stage_2
[22-Jul-2009 11:56:11] stage_3
[22-Jul-2009 11:56:11] stage_4
[22-Jul-2009 11:56:11] stage_1
[22-Jul-2009 11:56:11] stage_2
[22-Jul-2009 11:56:11] stage_3
[22-Jul-2009 11:56:11] PHP Warning: Missing argument 1 for test_shortcode() in
/path/to/header.php on line 16
[22-Jul-2009 11:56:11] stage_4
test-out() 函数似乎运行了两次,但仅当 $post->post_content 包含损坏的图像时。
仅供参考,使用 Firefox,您可以通过点击 CTRL-R 重新加载网页源代码。重新加载源时,没有问题。但是,在浏览器选项卡(或任何浏览器)中重新加载网页时,我收到上面显示的警告。
我已经确认,只有在变量 $post->post_content(或任何 $post 变量,对于您的 WordPress 专家)中存在损坏的 img src 时才会发生奇怪的情况。
你有没有机会复制这个并告诉我你的想法?我是 PHP 新手,但我很确定正在发生的事情超出了我的知识范围。 :)
编辑:
我正要开始检查我的本地开发环境,但一位朋友给我写信:
看了你的帖子,我觉得我 可能知道发生了什么。
我以为警告信息 你说的是 当您在浏览器中显示 加载了相关页面,但您的 帖子表明您正在查看 PHP 日志中的警告消息 反而。是只出现在 PHP 日志? 是
如果是这样,那么考虑一下 解释....
在您发布正文的情况下 包含一个有效的标签 图像,然后您的代码正在运行 一次按预期生成页面。 浏览器看到渲染的页面并且 然后尝试加载图像。这 服务器找到图像并对其进行处理 直接向上 - 这里没有惊喜。
在帖子正文的情况下 包含一个无效标签 图像,然后您的代码正在运行 一次生成页面,就像 前。然后浏览器生成一个 单独的 HTTP 连接以尝试 加载图像。通常,它会 只需触发 404 错误,然后 浏览器会显示损坏的图像, 故事结局。但是,如果断了 图片 URL 指向您下面的内容 Wordpress 安装,然后是 Wordpress 覆盖默认的 Web 服务器 404 行为和菜肴花哨的“404 未找到”页面而不是网络 服务器的默认 404 页面。这是 kicker -- Wordpress 的精美 404 页面 包含相同的页眉和页脚 它显示的所有其他页面。所以 如果您在顶部有此代码 你的标题,它会被再次调用 Web 服务器发送的 404 页面 作为对丢失图像的回应,您的 从它请求的浏览器。
您从未真正看到过 404 页面 这种情况,因为它正在 响应于生成 请求,而不是页面请求,所以 浏览器只是将响应视为 图像不好并显示损坏的图像 图标,但实际上是 生成并发送。
比较这个(一个有效的图像 URL 下 Wordpress 安装):
http://www.example.com/foo.jpg
对此(a 下的无效图像 URL Wordpress 安装):
http://www.example.com/foo.jpg
注意自定义 404 页面,包括 返回的标头...?
并且...在 404 的上下文中 页面,$post 对象不存在, 所以 $post->post_content 显然不是 一个字符串。
我以为警告信息 正在浏览器中显示 原始页面加载,这就是为什么我 没有真正考虑到这种情况, 但如果它只是输出到您的 PHP日志,那么它就很有意义了。
如果是这样的话,那么你可以 要么忽略警告,因为它真的 没有区别,或者你可以测试 对于您的代码中的这种情况(例如 您提到的 isset 解决方法 之前)。
任何其他想法,请告诉我,但是 这似乎符合我所知道的 到目前为止。
【问题讨论】:
-
谢谢。这是一个非常有趣的练习:-)
-
哈哈,好东西,乔希!我只玩了四天,直到有人通过电子邮件向我发送了正确答案。直接到我的收件箱。 ;)