WordPress MU(MS)多人版的路徑問題

  • 6324
  • 0
  • PHP
  • 2010-10-10

繼上一篇解決了Windows Live Writer(WLW)和WordPress MU(MS)的問題之後,嘗試著發表一篇圖文並茂的文章至部落格時,會發現內容雖然可以正確的發佈上去,但是文章內容中的圖片顯示卻出現了問題,依照之前的安裝設定,其中有一個步驟是需要在wp-content的資料夾中建立「blogs.dir」這個目錄,檢查了一下這個目錄會發現,上傳的圖片檔案是正常的存放在這個地方,但是再看看文章中圖片的連結位置赫然發現路徑竟然是www.xxx.tw/files/2010/10/image.png,依照目錄結構來看,所有上傳的檔案應該存放在www.xxx.tw/wp-content/blogs.dir/blogid/files/2010/10/image.png,其中blogid是每個不同部落格的編號,Google搜尋了一下,得到可能的結論:

繼上一篇解決了Windows Live Writer(WLW)和WordPress MU(MS)的問題之後,嘗試著發表一篇圖文並茂的文章至部落格時,會發現內容雖然可以正確的發佈上去,但是文章內容中的圖片顯示卻出現了問題,依照之前的安裝設定,其中有一個步驟是需要在wp-content的資料夾中建立「blogs.dir」這個目錄,檢查了一下這個目錄會發現,上傳的圖片檔案是正常的存放在這個地方,但是再看看文章中圖片的連結位置赫然發現路徑竟然是www.xxx.tw/files/2010/10/image.png,依照目錄結構來看,所有上傳的檔案應該存放在www.xxx.tw/wp-content/blogs.dir/blogid/files/2010/10/image.png,其中blogid是每個不同部落格的編號,Google搜尋了一下,得到可能的結論:

  1. .htaccess檔案不存在或URL Rewrite的設定沒設或不正確。
  2. Windows平台使用IIS架設WordPress。
  3. 因為是使用IIS,.htaccess檔案自然是無效的。
  4. 虛擬主機空間,網路上的解決方案都是利用ISAPI來解決Rewrite的問題,但是因為是虛擬主機空間,此方法無解。

提到URL Rewrite的問題也想到WordPress的自訂網址結構也是透過Rewrite的方式來達成,所以就測試了一下文章的連結,果然沒錯,如果自訂了網址的結構,那麼文章的連結點下去的時候就會出現問題。

所以最後要解決兩個問題:

  1. 自訂網址的連結問題。
  2. 圖片顯示路徑問題。

自訂網址的問題在網路上有許多不同的解法,然而因為架設在虛擬主機的空間裡,所以比較適合我的方式是利用設定404Error網頁的方式來解決這樣的問題,只要虛擬主機的設定可以指定404Error的檔案,那麼便可以利用指定到php網頁的方式來解決,以下是以IXWebhosting這個虛擬主機空間為例:

  1. 利用記事本或其它文字編輯器輸入下列的語法後另存成.php的網頁。(Ex:wp-404-handler.php)
    
          <?php
            $qs = $_SERVER['QUERY_STRING'];
            $_SERVER['REQUEST_URI'] = substr($qs, strpos($qs, ':80')+3);
            $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
            include('index.php');
            }
          ?>
        
  2. 上傳到WordPress的根目錄。
  3. 設定404 Error Document。
    image

這樣一來就可以解決文章自訂網址結構的連結問題。

接下來我們要解決的是圖片顯示路徑的問題,這個問題也是花了我一整天的時間在尋找,但是最後我決定先解決使用WLW發佈上去的圖片顯示路徑的問題,解決的步驟如下:

  1. 開啟xmlrpc.php檔案,尋找「mw_newMediaObject」這個函數。
  2. 在函數的最前面加上這行宣告
    
    global $current_site, $current_blog;
  3. 修改這個函數最後的回傳值,將原本的內容(在2832行)
    
          return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => $upload[ 'url' ], 'type' => $type ), 'upload' );
    修改成
    
          return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => str_replace('files/',"wp-content/blogs.dir/$current_blog->blog_id/files/",$upload[ 'url' ]), 'type' => $type ), 'upload' );
  4. 上傳覆蓋原本的檔案。

這樣就解決了利用WLW發佈內容後圖片無法正常顯示的問題。

不過其實別的地方還是有一些問題,像是在媒體庫裡面的檔案路徑依然是不正確的,這個部份因為並不是那麼緊急和重要,所以我就暫時不想花時間去解決這樣的問題,因為我覺得這個路徑的根本問題是需要找出取得(或傳回)上傳檔案的路徑的函數,並了解它的運作之後進行修改,但是因為我對於PHP並不是那麼的熟,也沒有開發過WordPress的外掛,更沒有好用的PHP偵錯工具,所以我目前只想先解決WLW發佈後圖片顯示的問題,剩下的就看看之後的版本更新會不會解決這樣的問題吧!

註1:微小夢想家這個部落格其實沒有以上這些問題,因為這是獨立架設個人版的來使用,所以這就讓我更懶得解決這樣的問題了。

註2:真的要解決的話,其實應該是在wp-includes/function.php裡面的wp_load_dir這個函數,不過這純屬我的猜測,有興趣繼續追下去的人可以從這邊去試試看,如果解決了也別忘了回來告訴我一聲,感謝。