Wordpressのwp-config.phpファイルの場所をドキュメントルート以外のディレクトリへ変更する

セキュリティ上、ドキュメントルート以下にwp-config.phpをおいておくのは怖い…
ここではドキュメントルートの2つ以上上位階層への移動の方法を示す。(直上階層まではデフォルトで可能)

まずは、wp-load.phpを編集します。

if ( file_exists( ABSPATH . 'wp-config.php') ) {
 
         /** The config file resides in ABSPATH */
         require_once( ABSPATH . 'wp-config.php' );
 
 } elseif ( file_exists( dirname(dirname(dirname(ABSPATH))) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {
 
         /** The config file resides one level above ABSPATH but is not part of another install*/
         require_once( dirname(dirname(dirname(ABSPATH))) . '/wp-config.php' );

次に、配置したwp-config.phpを編集。
wp-config.phpパーミッションは755に設定します。

/** WordPress absolute path to the Wordpress directory. */
 if ( !defined('ABSPATH') )
         define('ABSPATH', dirname(__FILE__) . '/www/hoge/hoge/');

 /** Sets up WordPress vars and included files. */
 require_once(ABSPATH . 'wp-settings.php');

Get変数を渡すページをCakePHPのURL形式へ変換する.htaccess(mod_rewrite)の記述方法

これまでSmartyなどを使っていたウェブサイトをリファクタリングし、CakePHPへ移行する場合などに困ることがとして。
Get変数を使ったページを、CakePHP特有のURL記法(host/Controller/Action/Var)へ変更する際、
.htaccessを使って、リダイレクトする必要がある。

CakePHPのなかには、.htaccessがデフォルトで3つ含まれている。

結論から話すと、/webroot/直下の.htaccessにリダイレクトの処理を追加することとなる。

デフォルトでは以下のようになっている。

/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Redirectそのもの解説として、おせっかいながら各行の意味を説明すると

<IfModule mod_rewrite.c>
# Apache が mod_rewrite モジュールを使用できるかどうか
    RewriteEngine On
    # mod_rewrite を有効にする
    RewriteCond %{REQUEST_FILENAME} !-d
    # リクエストしたURLのディレクトリが存在しない場合は
    RewriteCond %{REQUEST_FILENAME} !-f
    # リクエストしたURLのファイルが存在しない場合は
    RewriteRule ^(.*)$ index.php [QSA,L]
    # index.php へRedirectする
</IfModule>


ここに、今回はget変数でIDを渡していたページを、CakePHPのURLの記述へ変更。
かつ、idが変更になった場合の処理を例示します。

<IfModule mod_rewrite.c>
    RewriteEngine On

    # redirect the access to 
    
    RewriteCond %{REQUEST_URI} jump.html
    # jump.html に対して

    RewriteCond %{QUERY_STRING} ^id=4
    RewriteRule ^(.*)\.html$ $1/8? [NE,R=301,L]
    # hoge.html?id=4 へのアクセスを hoge/8 へリダイレクトする
    # RewriteRule末尾の"?"はQueryStringを後ろへ付けないの意味

    RewriteCond %{QUERY_STRING} ^id=(\d+)
    RewriteRule ^foo.html$ foo/%1? [NE,R=301,L]
    # foo.html にアクセスしてきたGet変数を、"/"以下に付加する
    # ex. foo.html?id=48 -> foo/48
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

なおRewriteRuleのQSAオプションは、{QUERY_STRING}を渡してしまうため、Redirect先のURLに
QSAオプションは外すように注意してください。

CakePHP のFormHelperで任意のControllerを使用する方法

公式ドキュメントにも記載されていますが、
案外はまってしまうことも多い仕様のため、自戒の意味で。
FormHelper — Cookbook v2.x documentation

FormHelperのControllerおよび、actionを自由に変更する方法。

<?php
echo $this->Form->create(null, array('url' => '/recipes/add'));
// or
echo $this->Form->create(null, array(
    'url' => array('controller' => 'recipes', 'action' => 'add')
));

MAMP環境下でMySQLのテーブル文字化けをターミナルから修正する

MacOS Lion環境下で、ターミナルからMAMPMySQL文字コードを変更するフロー

$ cd ~/Applications

# 次の処理はApplicationsディレクトリ下のMAMPのインストールを確認するフロー
$ find /Applications -type d -name "MAMP"

# MAMPのディレクトリへ移動
$ cd /Applications/MAMP/

# mysqlのあるディレクトリへ移動
$ cd ./Library/bin/

# mysqlの実行
$ ./mysql -u root -p
Enter password: password

mysql> USE database_name;

# テーブルの情報(CHARSETを含むを確認)
# おそらく、文字化けを起こしているような場合は CHARSET=latin1 となっている
mysql> SHOW CREATE TABLE table_name;

# 文字コードをutf8へ変更(utf-8ではないので注意)
mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;

mysql> exit;

ちなみに、CREATE TABLE を実行する際のオプションで文字コードを設定するには

CREATE TABLE `table_name` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(200) NOT NULL default '0',
) ENGINE=MyISAM AUTO_INCREMENT=1, CHARACTER SET=utf8;

のように、オプションとして付け加えることができる。
基本的に、my.cnfで文字コードを設定していれば問題ないが、
phpmyadminなので、例外的に文字化けを起こすことがあるので、その際の処方箋として。

Terminal からApplicationへアクセスする

使用しているOSはLionになります。

あまり、適切な解放が紹介されていないようです。
http://stackoverflow.com/questions/641017/unable-to-find-applications-folder-in-macs-terminal

find /Application -type d -name "*.app"

CakePHPのModel::hasAny()について

Model::hasAnyとは

Cake/lib/Model/Model.phpを参照すると以下のように定義されている。(2597行目)

public function hasAny($conditions = null) {
    return ($this->find('count', array('conditions' => $conditions, 'recursive' => -1)) != false);
}

つまり、$conditionにフィールドと、値を配列で渡すと、その値に一致するレコードがあるかどうかを返してくれる。

デフォルトで
>||php||
recursive => -1
|

jQueryで(nの倍数)番目の要素だけに処理する

jQueryで(nの倍数)番目の要素だけに処理する

例えば、4の倍数番目だけmargin-rightを取り除くといった処理。

$('.book_container').each(function(i){
    if(((i+1)%4) == 0){
        $(this).css({'margin-right': '0px'});
    }
});

DOMに対してeachでループする際、functionの引数にそのDOMのIndexを渡すことができるようだ。


次のサンプルも同じ動作をする。

$('.book_container').each(function(){
    if(($(this).index()+1)%4 === 0){
        $(this).css({'margin-right': '0px'});
    }
});