網站是用wordpress做的嗎?

最近在幫朋友找 wordpress 佈景主題,所以在找是不是有工具可以分析網站,取得資訊。

結果就找到這篇:How to Discover Which WordPress Theme a Site is Using – GreenGeeks

這篇文章介紹了四個方法,其中一個方法是借助 IsItWP 這個網站。這個網站除了可以偵測網站是否用 wordpress 做的之外,也可以分析裡面用到的 plugin 或是 theme,真的是很方便。

其他兩個網站分別是

使用方法都很簡單,貼上要分析的網址就可以了。

最後一個萬不得已的方法就是看網頁原始碼了。

WordPress 升級以後無法登入後台

Embed from Getty Images

才想說趕緊要把電影流水帳寫一寫,結果就遇到 WordPress 無法登入後台,查了 php-fpm slow log,發現是 media-deduper plugin 問題,使用 wp-cli 去 deactivate 以後,就可以登入了。

wp plugin deactivate media-deduper –path=’/var/www/wp’ –network

有人回報這問題了:https://wordpress.org/support/topic/504-bad-gateway-3/

但是登入以後,編輯器進不去… 見鬼了,後來發現是 MySQL的 CPU使用率超高,用 show processlist 去看,有 Waiting for table level lock 的情況。
查了以後才知道是因為 table 是 MyISAM 格式的關係。 (可以用這指令看 SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = ” AND ENGINE IS NOT NULL; ),而主因則是 media-deduper 所導致的。

要改可以用 alter table 來改 engine,可以先用下面這組指令一次產生出所有需要改格式的 alter table 敘述,再用 source 來執行。

 SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND ENGINE = 'MyISAM'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY table_name DESC;

不過修改以後,media-deduper 還是會引起 MySQL 的 CPU 使用率超高,再去 media-deduper 的論壇找,找到這篇:Urgent: New Update Release (of 3 hours ago) broke my Website! 裏面講的,其實跟前面有人回報的問題 (504 bad gateway) 一樣,只是最後作者說有修正了,並且建議先移除 plugin 之後,再重新裝即可。於是我照著做就解決問題了。

wordpress 出現 Invalid post type 錯誤

今天進 wordpress ,選 All posts 後,就出現 Invalid post type. 的錯誤。先試著開啟 wordpress wp-admin/edit.php 看,發現一開始的檢查 $typenow 就導致錯誤 了,$typenow 是空的。

根據程式碼,試著在網址列加上 ?post_type=post ,能進入 All posts 了,但文章列表是空的。

  1. 上網找了一些文章,說是要移除 plugin ,但我試著移除了,沒有用。
  2. 對照目前的程式碼跟網路下載的 wordpress 4.8 程式碼,也幾乎是一樣的。
  3. 試著直接連線到資料庫看,資料表格一切正常,權限也都是正確的。
  4. 直接在 wp-config.php 裡加入
    define('WP_DEBUG', true);
    define('WP_DEBUG_DISPLAY', false);
    define('WP_DEBUG_LOG', true);
    

    ,然後看 wp-content/debug.log ,終於找到一點蛛絲馬跡。

看來是因為 wp-include/vars.php 有問題,裏面用 preg_match 檢查 _SERVER[‘PHP_SELF’] 時,因為 match 不到而出錯,猜想這可能連到影響到後續的 $typenow 有問題。根據這個線索去推敲,PHP 應該沒問題,察看了 php-fpm 的設定,也沒問題。後來找到這篇:php – Wrong SCRIPT_FILENAME in Apache 2.4.26 – Stack Overflow,再循線看到這篇:php – Wrong SCRIPT_FILENAME in Apache 2.4.26 – Stack Overflow才知道可能是 Apache 問題,察看了 pacman 的 log,果然前幾天有更新,但是因為沒有重新啟動,所以都沒發現問題。在設定裡補上

ProxyFCGIBackendType GENERIC

以後,重新啟動 Apache 就沒問題了。

WordPress 的維護模式

本來以為 wp-cli 提供的 wp 指令應該可以用來指定 wordpress 進入或離開 maintenance mode 才對,結果發現沒提供這功能。原來是因為很簡單的關係:wp cli – wp-cli Enabling Maintainance Mode

只要在 wordpress 安裝目錄下增加或是移除 .maintenance 檔案就可以進入或離開 maintenance mode 了。

PHP Cannot create references to/from string offsets

之前在自家的 wordpress 上用了 muki-tag-cloud ,在翻 apache log 時,發現常會出現這錯誤:

PHP Fatal error: Cannot create references to/from string offsets nor overloaded objects in wp-content/plugins/muki-tag-cloud/widget.php on line 230

今天發狠找出原因了,首先還是要先瞭解 PHP 的 reference 是幹嘛的,我覺得這篇 PHP Reference 測試 不錯,裡面沒什麼解說,就是幾個範例與執行結果,看完大概可以了解到 PHP 的 reference 的行為是什麼。

接著就是試著寫小程式複製出錯誤。

可以複製出來之後,就知道問題在哪裡了 (好吧,我知道 log 的訊息其實很清楚,但我對 PHP 不熟,所以…),PHP 不允許建立字串中字元的參考。知道問題了,就可以解決了,後來就簡單加上判斷,如果發現 $widget[‘callback’] 是字串的話,就跳過,不建立 $widget[‘callback’][0] 的參考,如此一來就解決問題了。

順手發了 pull request 給作者,希望是會改,要不然每次更新這 plugin 時,都要再改一次。