網頁

2015年6月28日 星期日

無法重新定義pluggable function: wp_notify_postauthor()

最近接了個維護案,做了更新後,重新啟動plugin,卻出現底下的訊息

Fatal error: Cannot redeclare wp_notify_postauthor() (previously declared in /ae/wp-includes/pluggable.php:1003) in /ae/wp-content/plugins/ae-menu-pages/ae-menu-pages.php on line 120

本以為是更新後造成問題,但查半天發現主要是重新定義wp_notify_postauthor造成的,這個function是個pluggable function,讓開發者可以在plugin中重新定義的,看半天並不覺得有任何問題,直到查到這篇How to Override a Pluggable Function

原文解說如下:
the reason it needs to be wrapped in function_exists is because within the context of a plugin activation, the function does already exist. This is due to the way WordPress activates plugins in a sandbox, which is necessary to enable it to recover from fatal errors in the activated plugin. Technically, once the plugin is activated the function_exists check would not be necessary, but you'd never be able to activate that plugin via conventional means without it. –  Milo Sep 24 '12 at 15:57

試了後確定是這個問題,總之,不管是否這個function是在wordpress載入預設的同名function前就宣告了,就是一定要加入function_exists這個判斷如下:
if( !function_exists() ):
    function wp_notify_postauthor() {
        //執行內容
    }
endif;


參考網址:
How to Override a Pluggable Function
Customizing the new user email with a pluggable function

2015年6月26日 星期五

不同的系統(mac及linux)間的網站檔案移動,最好別用tar打包上傳

今天的移機學到一項很重要的事,若是不同的作業系統的網站檔案做移動,別使用tar做打包後。

因為現今大家大多都使用虛擬空間,替人做案子時,測試機及正式上線機是不同虛擬空間廠商也是有可能的事,可能出現類似底下的樣子

Linux(CentOS) -> Mac OS X(我的機器) -> Linux(Ubuntu)

常發生的問題就是無法讀取檔案,推測的原因是跟SELinux有關,簡單講就是檔案除了本身權限,有些支援SELinux的OS(如:CentOS)有另外的安全設定,以我的經驗來講Mac似乎是沒有或是關閉,所以若是下載完,用Mac做tar,然後再放上有開啟SELinux的主機中,然後untar,就會發生Apache無法讀取,但權限卻沒問題的狀況,最好的方法是一個個檔案上傳,系統會自行建立相關的資訊,就不會有這問題了,但另外的問題就是傳很久.....

2015年6月24日 星期三

定義jQuery的change、click等event的function時,能傳入參數

一般在使用jQuery的click或change等事件定義時,我總會使用如下的方式:

$('#target').change(function(){
    //執行想要的程式
});

若是有n個,我都會很偷懶的複製n次,在這行業混了十來年,這做法一直沒變,很少需要改(難怪有人講老狗玩不出新把戲 @@)

不過今天正好就遇到需要的狀況,兩個不同的target,要傳入的預設值不同,動作幾乎一樣,這樣定義兩次實在很蠢,所以查了下jQuery.change,截部分如下:

Description: Bind an event handler to the "change" JavaScript event, or trigger that event on an element.
看起來是change([資料], function),其中eventData帶入資料

所以如下使用
$('#targetA').change({target: 'A'},demo);
$('#targetB').change({target: 'B'},demo);

function demo(event){
    alert(event.data.target);
}

這樣由targetA啟動change就會alert出A,由targetB啟動change就會alert出B了

參考網址:
jQuery.change
How to use a function that takes arguments with jQuery's change() method?

2015年6月2日 星期二

Henplus下複製整個Table資料到新的資料庫

前陣子寫了Henplus下使用Alert Table,但想到最好是能下個SQL(使用Henplus的關係)直接複製整個table的資料,最好連建table都不用,看半天後沒想到真的有,只要利用SELECT INTO
henplus> select * into database_name.new_table from old_table;
affected 47186 rows (547 msec) //成功

這麼簡單就搞定建table及放入所有資料。

不過官網文字有個注意事項
WARNING! Be careful about running select into across databases if you have column names that exist in both databases, as this may cause problems.

另外,以官網Back Up Data to a New Table所記載,最好是先用sp_spaceused查詢下資料庫或資料表的使用空間,不過使用henplus只會看到如下的回覆文字,得使用DbVisualizer或其他方式吧,有發現再做更新。
sp_spaceused old_table;
affected 1 rows (50 msec)

注意事項:做這之前要先設定auto-commit為on,否則會一直出現FAILURE: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'xxxx' database.
henplus>set-session-property auto-commit on;

參考網址:
Back Up Data to a New Table
SQL SELECT INTO 语句

2015年6月1日 星期一

強制刪除目錄下特定名稱的檔案或目錄

今天處理個舊專案,原本是用svn,現在要改用git,要先將每個目錄下原關於svn的目錄都刪除掉,以前都傻傻一個個刪除,想想沒有這麼笨吧,找了下相關資料,只要使用底下的shell script即可搞定

cd 你的目錄
find . -type d -name '.svn' <--先確認檔案
find . -type d -name '.svn' | while read f;do rm -rf "$f"; done <-- 全部強制刪除

這樣就ok了,若要刪除檔案,type後的d就改成f

參考網址:
Linux: remove file extensions for multiple files