2009-07-22 77 views
1

你能告诉我你对此的看法,并可能看看你是否可以重新创建它?有两种情况:WordPress的古怪与破碎的图像(第2部分)

情景1(按预期工作)...

的$后> POST_CONTENT变量包含此(凭有效图像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_content变量现在包含:(带有INVALID图像src):

(string) "before [hw] <img src="/path/to/broken_image.gif" /> after" 

输出这个(STILL正确)...

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()功能似乎是运行自己TWICE,但只有当$post->post_content包含一个破碎的图像。

仅供参考,如果使用Firefox,您可以点击CTRL-R以重新载入网页源代码。重新加载源码时,没有问题。但是,当在浏览器选项卡(或任何浏览器)中重新加载网页时,出现上述警告。

我已经证实,只有在变量$ post-> post_content(或任何$ post变量,为您的WordPress专家)中存在破损的img src时才会出现这种奇怪现象。

任何机会,你可以重现这一点,并告诉我你的想法?我是PHP的新手,但我很确定发生了一些事情,这超出了我的理解。 :)

编辑:

我正要开始检查我的本地开发环境,但是一个朋友写信给我:

看着您的文章后,我想我 可以有想法是怎么回事。

我原以为你在谈论正在显示在浏览器 当你 加载有问题的网页,但您 后表示您所看到的PHP日志中 警告消息警告消息 改为 。是否只有出现在 的PHP日志中? YES

如果真是这样,那么考虑这个 解释....

在你的身体后 包含一个标签为有效 图像的话,那么你的代码正在运行 一次按预期生成页面。 浏览器看到渲染的页面,然后尝试加载图像 。 服务器直接找到图像并将其直接放置在 之上 - 这里没有什么意外。

在后机身 包含一个标签为无效 图像的话,那么你的代码正在运行 一旦生成页面,就像 之前。然后浏览器使得一个单独的HTTP连接 尝试加载图像 。通常情况下, 只会触发404错误,并且 浏览器会显示损坏的图像, 结尾。然而,如果破 图像URL是您 的WordPress安装目录下的东西,那么WordPress的 覆盖默认的Web服务器404 行为和菜肴了一个奇特的“404 未找到”页面,而不是网络 服务器的默认404页。这里是 踢球者 - WordPress的花哨404页 包括相同的页眉和页脚作为其所显示的所有其他页面 。所以 如果你有这个代码在 的头部,它会再次被 调用404页面,网页服务器发送 来响应浏览器请求的 浏览器丢失的图像。

你从来没有真正看到了404页 这种情况下,因为它是在响应中产生一个 要求 ,而不是一个页面请求,所以 浏览器只是对待响应为 不良形象,并展示了断图片 图标,但它实际上是 生成并发送的。

( 下一个有效的图片网址WordPress安装)比较:

http://www.example.com/foo.jpg

本(一 WordPress的安装目录下的图片网址无效):

http://www.example.com/foo.jpg

请注意,自定义404页面包括 返回的标题...?

And ...在404 的页面上,$ post对象不存在, 所以$ post-> post_content显然不是 的一个字符串。

我曾以为,警告消息 正在显示在浏览器上 原来的页面加载,这就是为什么我 没有真正考虑这个情况, 但如果它只是被输出到您的 PHP的日志,那么它非常有意义。

如果是这样的话,那么你就可以 要么忽略了警告,因为它确实 没有什么区别,或者你可以在你的代码的情况下测试 (如 的isset解决方法你提到 之前)。

没有其他的想法,让我知道,但是 似乎以适应我所知道的 它为止。

+1

谢谢你。这是一个非常有趣的练习:-) – Josh 2009-07-22 20:20:35

回答

2

难道出现在PHP日志?

是的。

好的。然后自定义404处理程序在请求丢失的图像上运行几乎肯定是什么导致警告。由于警告没有显示在任何地方,因此可以忽略,或者如果您不想让日志混乱,可以使用isset测试。无论如何,这确实是一个非问题,但至少现在你知道它来自哪里,并且这不是一个真正问题的迹象。

我不认为(DEV)环境应该与它有任何关系。它会在设置了真实DNS条目的实时服务器上以相同的方式运行。

1

我不敢相信我没有想到 - DUH !!!!你的朋友是100%正确的。这是Firefox加载破碎的图像,这是wordpress正在服务,从而运行你的代码两次。