2009-07-22 91 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正在服務,從而運行你的代碼兩次。