log

WordPress で言語ファイルを使わずに強制的に翻訳する

参考 URL 先に書いてあるとおり、gettext フィルターを使います。

このフィルターは __ 関数などで翻訳が行われるときに呼び出され、翻訳前の文字列とドメインを 受け取り、翻訳後の文字列を返します。

参考 URL のページでは get_translations_for_domaintranslate メソッドを呼び出して いますが、私がローカル環境で試してみた限りでは必要ありませんでした。

参考

http://www.viper007bond.com/2011/07/13/changing-core-wordpress-strings/

WordPress の管理ページのメニューを常に開いた or 閉じた状態で表示されるようにする

以下のコードを functions.php などに記述すると、常に管理ページのメニューを開く 設定になります。

add_action( 'init', function () {
    $user_settings = get_all_user_settings();
    $user_settings['mfold'] = '0';
    wp_set_all_user_settings( $user_settings );
} );

この設定は本来、ユーザーごとに最後に開いていたか閉じていたかを覚えておいて、 次回ページを表示したときにその状態に復元するためのものだと思います。

なので、使いやすさを考えると記憶を無視するのは問題があるかもしれませんが、 要はこの設定をいじれば挙動を変えれるよ、ということです。

参考

http://www.tekboy.net/archives/878 http://techracho.bpsinc.jp/kazumasa-ogawa/2013_07_03/10889

CakePHP 2.6.2 でエラーコード別にビューを分ける

デフォルトだと 4XX エラーは app/View/Errors/error400.ctp、 5XX エラーは app/View/Errors/error500.ctp が表示されます。

また、Configure::write('debug', 2) のようにデバッグモードを有効にしている場合、 例外クラスに種類に応じてより詳細なビューが使われます。

今回、以下の仕組みを実装します。

  1. デバッグモードを無効にした状態では HTTP ステータスごとにビューファイルを分ける
  2. デバッグモードを有効にした状態ではデフォルトのビューを使う

基本的には http://www.logicsart.com/cakephp/exception-handling-in-cakephp/ の通りにしますが、上記 2 番ができなかったので、少しコードを変更する必要があります。

まずはリンク先のとおりにコードを書いてください。

AppExceptionRenderer クラスの notFound メソッドなどの内容

リンク先のコードはデフォルトの挙動とは少し違うので、デフォルトのコードに合うよう 書き換えます。

$this->controller->beforeFilter();
$message = $error->getMessage();
if (!Configure::read('debug')) {
    $message = __d('cake', 'Not Found');
}
$url = $this->controller->request->here();
$this->controller->response->statusCode($error->getCode());
$this->controller->set([
    'name' => h($message),
    'message' => h($message),
    'url' => h($url),
    'error' => $error,
]);
$this->controller->render('/Errors/error404');
$this->controller->afterFilter();
$this->controller->response->send();

AppExceptionRenderer クラスの missingController メソッドなどの内容

リンク先のコードのだとデバッグモードが有効のときでも error404.ctp などが 使われ、詳細なエラーページが表示されないので以下のように書き換えます。

public function missingController($error) {
    if (!Configure::read('debug')) {
        $this->notFound($error);
    } else {
        $renderer = new parent($error);
        $renderer->render();
    }
}

単一のチェックボックスを CakePHP 2.6.2 の FormHelper::input で扱う方法

忘れそうなので、単一の "0""1" を取るだけのチェックボックスを作る方法を記録しておきます。

FormHelper::input に渡すオプションの hiddenFieldtrue の場合、そのチェックボックスと同じ name 属性値を持ち、value 属性値に 0 を持つ input[type=hidden] 要素が直前に挿入されます。

hiddenField のデフォルト値は true です。

チェックされていればチェックボックスの値が、されていなければ input[type=hidden] 要素の値が送られます。

下記の例では defaultvalue の値が同一なため、デフォルトでチェックされたチェックボックスが出力されます。

<?php
// ビュー
echo $this->Form->input('Foo.bar', [
    'type' => 'checkbox',
    'default' => '1',
    'value' => '1',
]);
<?php
// モデル
public $validate = [
    'bar' => [
        'definedValue' => [
            'rule' => [
                'inList',
                [
                    '0',
                    '1',
                ]
            ],
            'required' => true,
            'allowEmpty' =>  false,
            'message' => '定義されていない値です',
        ],
    ],
];

環境

CakePHP 2.6.2 で確認しました。

WordPress で現在実行中のフィルター (またはアクション) 名と、それに登録されているフックの一覧と、現在実行中のフックの情報をログに出力する PHP コード

以下のようにログに出力されます。

[13-Feb-2015 11:50:29 UTC] 
# filter or action name: save_post
## current priority: 99
## current hook name: s2_admin->publish
### priority: 10
1.  delete_get_calendar_cache
2.  acf_form_post->save_post
3.  acf_admin_field_group->save_post
4.  s2_admin->s2_meta_handler
5.  twentyfourteen_category_transient_flusher
6.  WP_Widget_Recent_Posts->flush_widget_cache
7.  Custom_Field_Revisions->save_post_meta_in_revision
8.  Featured_Content
### priority: 99
1.  s2_admin->publish

次のコードを wp-config.php とかに書いてください。
それで適当なところから `log_current_hook()' を実行すると上記のようなログが出力されます。
各フックが呼び出される順番もログの通りなはずです。違ってたらごめんなさい。
あと、ソートしてないので優先度の順番が変わる場合があるかもしれないです。直したかったら ksort( $wp_filter[$tag] ) を呼ぶようにすれば直ると思います。

function log_current_hook() {
    global $wp_current_filter, $wp_filter;
    $clone_wp_current_filter = $wp_current_filter;
    $tag = end( $clone_wp_current_filter );
    $message = "\n";
    $message .= '# filter or action name: ' . $tag . "\n";
    $priorities = $wp_filter[$tag];
    $current_priority = key( $wp_filter[$tag] );
    $current_idx = key( $wp_filter[$tag][$current_priority] );
    $message .= '## current priority: ' . $current_priority . "\n";
    $current_hook_name = _get_hook_name_for_log( $wp_filter[$tag][$current_priority][$current_idx] );
    $message .= '## current hook name: ' . $current_hook_name . "\n";
    if ( is_array( $priorities ) ) {
        foreach ( $priorities as $priority => $hooks ) {
            $message .= '### priority: ' . $priority . "\n";
            $count = 0;
            foreach ( $hooks as $hook ) {
                $message .= str_pad( ++$count . '.', 4, ' ' );
                $message .= _get_hook_name_for_log( $hook );
                $message .= "\n";
            }
        }
    }
    error_log( $message );
}
function _get_hook_name_for_log( $hook ) {
    if ( is_string( $hook['function'] ) ) {
        return $hook['function'];
    } else if ( is_array( $hook['function'] ) ) {
        if ( 1 <= count( $hook['function'] ) && is_string( $hook['function'][0] ) ) {
            return $hook['function'][0];
        } else if ( 2 <= count( $hook['function'] )
            && is_object( $hook['function'][0] )
            && is_string( $hook['function'][1] ) ) {
            return get_class( $hook['function'][0] ) . '->' . $hook['function'][1];
        } else {
            return 'CAN NOT GET THIS HOOK NAME.';
        }
    } else {
        return 'CAN NOT GET THIS HOOK NAME.';
    }
}

CLaunch のホットキーに Shift、Ctrl、Alt キーなどの特殊キーが設定できない原因

CLaunch ではランチャーのポップアップを表示するためのホットキーを自由に設定できる。

Orchis を使っていたときは Alt キーを 2 回連打することで表示するようにしていたので、CLaunch でも同じ設定にしたかった。

会社のパソコンでは正常に設定できたけど、なぜか家のパソコンでは Alt キーや Shift キーなどの特殊キーを押したときだけ、入力されたキーが表示されるはずのテキストボックスになにも表示されない。

キー入力をいじるなんらかのソフトが悪さしているのだろうと思って、思いついたのが Synergy だった。とりあえずタスクバーを見ると synergy~.exe ていうプロセスが 2 つ動いていたのでそれらを終了し、サービスの synergy も停止したところ、無事ホットキーを Alt キー 2 回連打に設定することができた。

Windows 7 で環境変数 Path の編集がコマンドプロンプトに反映されない (その 2)

Orchis が 64 bit 版に対応していなくて挙動がガッタガタになってきたから、最近 Orchis から CLaunch に乗り換えたんだけど、タイトルのとおり以前と同じ現象がまた発生した。

前のときは Orchis の再起動で直った (以下の記事を参照)。

Windows で環境変数 Path の編集がコマンドプロンプトに反映されない - log

 

ただ、今回は CLaunch の再起動では直らなかった。

UAC の関係で変な挙動になってしまうのを回避するために、管理者権限で起動してなんちゃらかんちゃら~みたいなことをする起動方法が CLaunch には用意されていて、なんかそれが悪さしてるんじゃないのかなーって思って、なんとなく explorer.exe を再起動してから CLaunch を再起動したら直った。

本当にこれが原因かはわからないけど、この記事を書いてからもう 1 回 Path を編集する機会があったので、再度上記の方法を試してみたらうまくいったので、一応解決策としてやってみる価値はあると思う。