削除時のフック delete_post

投稿が削除されたときに、それをフックして処理を行う必要があった。
というのも、その投稿を参照している別の独自のテーブルがあってそれも削除したかったからである。
削除にはいくつかフックがあるが、削除直前にフックできる delete_post を使用する。
完全に削除した後だと、削除する投稿の情報が取れない。

以下のように、add_actionで delete_postを指定する。引数に削除される投稿のpost_idが来るので、get_post でそのidの投稿を取得して処理を行うことができる。

1
2
3
add_action('delete_post', function($post_id){
$deletePost = get_post($post_id);
// do something

Custom Field Template の FILE の バリデーション

Custom Field Templateのバリデーション

非常にニッチな話だけど、Custom Field Templateの FILE のバリデーションのTips。

Custom Field Templateは、グローバル設定の「jQuery バリデーションを使用する」にチェックを入れるとバリデーションを利用することができる。
この状態で、以下のようにclassに jquery-validationで利用できるやつを指定するとバリデーションしてくれる。
この例だと required なので入力が必須ということになる。

[image]
type = file
label=写真
class= required

FILEのバリデーション

問題はここから。
この状態で一度ファイルをアップロードして保存する。
その後、編集をもう一度したとき、requiredが効いてしまい、何かしらのファイルをアップロードしないとバリデーションが通らないのだ。
これは困る。ファイル以外の項目を編集したいのにできないからだ。
仕方ないので、jquery-validateに独自のvalidationを定義することにする。

jquery-validateに独自バリデーションの追加

準備として、functions.phpで js ファイルを読み込むようにして、そちらのjsファイルに記述する。

1
2
3
add_action('admin_head', function(){
echo '<script type="text/javascript" src="'.get_bloginfo('template_directory').'/admin.js"></script>';
});

以下、jsファイル内の記述。今回、独自の定義として requiredFile を定義する。

1
2
3
4
5
6
7
8
9
10
11
12
(function($){
$(function(){
//ファイル用に独自のvalidationを追加
$.validator.addMethod("requiredFile", function(value, element) {
if(value !== '') return true;
//CFT では FILEが保存済みの場合、兄弟要素のhiddenのinputフィールドに値が入力されているので、それをチェックする。
if($(element).siblings('input:eq(0)').val() !== '')return true;
return false;
}, "必須項目です。");
});
})(jQuery);

これで、あとは作った定義のclassをくっつける。

[image]
type = file
label=写真
class= requiredFile

管理画面のいらないものを消す

wordpressの管理画面で使わないものを消したい。個人で使うならいいが、お客さんに納品するときなど、触れてほしくない機能は見せたくないからだ。
機能を止めることによって項目を消すこともできるが、細かいところはcssで消していくしかない。
まず、消す用のcssを読み込む。

1
2
3
4
5
6
//functions.php
function my_admin_head(){
echo '<link rel="stylesheet" type="text/css" href="' .get_bloginfo('template_directory'). '/admin-style.css' . '" />';
}
add_action('admin_head', 'my_admin_head');

functions.phpと同じフォルダに admin-style.css を置いておいて、それを読み込む。get_bloginfoで現在のテンプレートのディレクトリを参照できる。
これで管理ページで共通のcssを読み込めるようになった。

あとはhtmlのidやclassを見て、それをdisplay:none;で消せばOK。

1
2
3
4
/* プレビューボタンを消す*/
#post-preview{
display: none;
}

Nexus7 使って Androidアプリ開発

環境構築になかなか手間取りました。

ダウンロードとインストール

Android SDKより 「Download the SDK ADT Bundle for Windows」からSDKをダウンロード。
Eclipseやツールが既に入っているバンドル版で便利。
ダウンロードしたものをCドライブ直下とか短いパスのところで解凍。

解凍した中に入っているEclipseを立ち上げようとするも、JDKが入っていなくてエラー。
仕方なく、OracleのところからJDKをダウンロードして、インストール。
これでEclipseが無事に立ち上がった。

エミュレータで実行

適当に新規作成からAndroidアプリケーションのプロジェクトを作る。
アプリケーション名とかパッケージ名は適当で、どんどん進める。完了すると、Hello Worldな画面が出来上がる。
画面左上の方に「Android仮想デバイスマネージャー」というのがあるので、そこでエミューレータ用の仮想端末を作る。
「新規」ボタンを押して、AVD名は適当につけて、装置はNexus7を選択。
ここでメモリー・オプションを512ぐらいにしておかないと起動しない。
「OK」ボタンを押して、今作った仮想デバイスを選択し、「開始」を押すとエミュレータが起動する。かっこいい

Eclipseの実行ボタンから「Androidアプリケーション」を選択すれば、エミュレータ上に Hello World されるはず。

実機で実行

Nexus7の「設定」→「タブレット情報」から「ビルド番号」と書かれた項目をタッチしまくる。しまくると開発者モードが解禁される。どんな仕様だ。
一つ前の画面に戻ると、「{}開発者向けオプション」が表示されている。
その中の「USBデバッグ」をONにする。

「設定」→「セキュリティ」→「提供元不明のアプリ」をONにする

Windowsに戻り、Android仮想デバイスマネージャーのボタンの隣にある「Android SDKマネージャー」を選択する。
一番下のExtrasに「Google USB Driver」があるのでそれをダウンロード。
ここまできたらUSBケーブルでNexus7とパソコンをつなぐ。USBドライバがちゃんとインストールされないので、デバイスマネージャから解決する。
ドライバはSDKをインストールしたフォルダの中の「sdk\extras\google」にあるのでそれを指定。

接続確認

ここでちゃんと、端末とPCが接続できているか確認したい。adbなるものを使う。
「sdk\platform-tools」にadbはある。パスを通すか、このフォルダに行く。
コマンドプロンプトから「adb devices」と打つ。
「List of devices attached」の次の行に何かしら表示されればOK。そして、それはoffline となっているのではないだろうか。
「adb start-server」と打つとonline になる。
これでエミュレータのときと同様にAndroidアプリケーションを実行すれば、端末の方で起動されるはずだ。

日本語版 WordNet から辞書を作成する

前からフリーの英和辞書のデータが欲しいと思っていて、探していたのだが、WordNetというのがあるらしい。
wordnetは「ライセンスを保持していただければ、基本的に日本語ワードネットは無償で使用、複写、改変、頒布していただけます」らしい。
うれしい情報であるのだが、データ形式がsqlite3のデータベース形式なのである。しかも単純な形式じゃなく、いろいろと構造がややこしい。

出力結果はこんな感じ。
179 abase 凹ます,凹ませる,卑しめる
180 abasement 屈辱,恥,恥辱,汚辱
181 abash まごつかせる,困らせる
182 abashment 内気,羞恥
183 abate 和らぐ,弛む,弱まる,消和,緩む,衰える,鎮まる,静まる
184 abatement 中断,中止,軽減
185 abatis 逆茂木

ちなみにSQLを逆にすれば和英も作れることに気づいた
4464 ほどなく before long,presently,shortly,soon
4465 ほど近い nearby
4466 ほのか dim,faint,shadowy,vague,weak,wispy
4467 ほのぼの darkly,faintly
4468 ほのめかし glimmer,glimmering,inkling,intimation
4469 ほのめかす adumbrate,insinuate,intimate
4470 ほの暗い dim,subdued

Python3.2で動作確認。 2.x だとエンコードの問題があるっぽく、面倒なので3で動かした。
動かすには日本語WordNetのサイトにあるダウンロードから「Japanese Wordnet and English WordNet in an sqlite3 database」を入手する必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# coding: UTF-8
import sqlite3,pprint
mode = 0; #モード指定 0:英和 1:和英
#ダウンロードした wnjpn.dbのパスを指定
conn = sqlite3.connect("./wnjpn.db")
cur = conn.cursor()
print("running")
if mode == 0: #英和用SQL
cur.execute( "\
SELECT DISTINCT word_en.wordid, word_en.lemma, word_ja.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_en.wordid = sense_A.wordid\
and sense_A.lang = 'eng'\
and sense_B.lang = 'jpn'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_ja.wordid\
ORDER BY word_en.lemma"\
)
else : #和英用SQL
cur.execute( "\
SELECT DISTINCT word_ja.wordid, word_ja.lemma, word_en.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_ja.wordid = sense_A.wordid\
and sense_A.lang = 'jpn'\
and sense_B.lang = 'eng'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_en.wordid\
ORDER BY word_ja.lemma ASC"\
)
#ワードIDを整理しつつ、結果を一度配列に詰める。
#英単語に含まれるアンダーバーはスペースであるべきなので置換する(ハイフンはハイフンのままで良い)。
before = -1
word_list = []
i = -1
for row in cur:
if before != row[0]:
i = i + 1
word_list.append( [row[1].replace("_"," "),row[2].replace("_"," ")])
before = row[0]
else :
word_list[i][1] += ',' + row[2].replace("_"," ")
#タブ区切りでファイルに出力
f = open('./output.txt', 'w')
i = 1
for word in word_list:
f.write(str(i) + "\t" + word[0] +"\t" + word[1] +"\n")
i += 1
f.close()
print("done")
cur.close()
conn.close()