wp_insert_post

  • post_statusをdraftで、wp_insert_postした後に、
    wp_publish_postすると重複されて投稿されることがある
    なのではじめからpost_statusはpublishにしておいたほうが良さげ。
  • wp_insert_attachmentもwp_insert_postとほぼ同じ動作。こいつ自体にサムネイル等を作成する機能はない。

wp_schedule_event

  • 任意のインターバルでwp-cronに追加するには予め
    add_filter('cron_schedules','cron_add_10sec');
    function cron_add_10sec($schedules){
    	$schedules['10sec'] = array(
     		'interval' => 10,
     		'display' => __( '10sec' )
     	);
     	return $schedules;
    }
    	

    こんな感じで追加しておく。

  • 英語版のCodexには
    wp_schedule_event(current_time('timestamp'), '10sec', 'image_update_event')

    と第一引数はtime()ではなくcurrent_time(‘timestamp’)と書いたほうがベターのように書いてあるけど、これはたぶんウソ。
    環境にもよるけど、タイムゾーンの違いで全く動作しないことがある。
    wp-cronはGMT基準だけど、current_time(‘timestamp’)はWordpressに設定されたタイムゾーン(日本なら+9)を取ってくる。

いかに自分は楽をするかというテーマに基づいてアフィサイトを作ってみた。
iPhoeの壁紙サイトなんだけど、

  • WordPressで作る
  • 画像のアップを楽ににする
  • 広告の表示を自動化する

をテーマに設定した。

画像のアップを楽にする部分はFTPで特定のディレクトリに、カテゴリ名をつけたディレクトリに分けて画像をアップし、
管理画面でボタンを押すと一気に投稿にしてくれるという仕組みを作った。
もちろんWordpress側で画像のリサイズも行えるので、かなり楽ちん。
ただ、大量に上げると30秒エラー出るから、キューのような仕組みを作った方がいいかもしれない。

広告表示の自動化は、自動でRSSを使ってAppStoreの有料ランキングを取ってきて、
それにLinkshareの広告のアドレスを紐付けるだけ。

wp_insert_post()で追加しているんだけれど、重複チェックはしているのに、
なぜか同じ広告が2度登録されてしまうことがあって、
かなり悩んだけれど、この部分の解決ができていない。

今は対症療法で、重複した記事を削除するようにしているだけ。
この部分がうまく出来れば、もう少しスマートに実装できるんだけれども。

ページ内の広告内容は、DBに登録してしまうか悩んだけど、
DB内には、アプリのIDのみを保存させて、表示時にJavascriptでiTunes StoreのAPIを叩いて表示するようにした。
これならば、価格の情報は常に最新になるから「価格は掲載時のものです。」とか表示しなくてよい。

まぁ多分儲からないだろうけど、外部からWordpressをアップデートしていく仕組みとか、
そのあたりの勉強にはかなりなった。
これのために件のjQueryのプラグインとか作ってたんだけど、結局使わないという・・・。

まぁこんなもんでしょうか。

世の中には様々なJavascirptライブラリが存在していて、いくつかをあわせて使わざるをえない場合が出てきてしまいます。
もちろん、Javascriptライブラリを2つも3つも共存させるのは端からいい案とは思えないのですが、
そんな時の試してみる価値のある、解決策を紹介します。

例として、prototype.jsと共存することを考えます。
プラグインを利用しない場合は、下記のように書くとjQueryもprototype.jsもいつも通り利用することができます。

<head>
	<script type="text/javascript" src="jquery.js"></script>
	<script type="text/javascript">
		jQuery.noConflict();
	</script>
	<script type="text/javascript" src="prototype.js"></script>
	<script type="text/javascript">
		(function($){
			$.('#hoge').css('color','#F00'); //無名関数の中だと$はjQueryとして振る舞う
		})(jQuery);
		$('myDiv').addClassName('fuga');  //無名関数の外だと"$"はprototype.jsとして振る舞う
	</script>
</head>

言葉で書くと

  1. jQueryを読み込む
  2. 直後にjQuery.noConflict();を呼び出す(この時点で、window.$はjQueryから解放されます。)
  3. prototype.jsを読み込む
  4. jQueryは無名関数(クロージャ)の中で記述
  5. prototype.jsは無名関数の外で記述

となります。

実は下記に抜き出した部分がミソで、

(function($){
	$('#hoge').css('color','#F00'); //無名関数の中だと$はjQueryとして振る舞う
})(jQuery);

書き方を変えれば

function hoge($){
	$('#hoge').css('color','#F00');
}
hoge(jQuery);

としているのと同じこととなります。
いわゆるその場で無名関数の実行を行ってるわけですが、
その際に、無名関数に引数として「$」を指定し、jQueryをまるごと関数に渡してあげているわけです。
つまりは、jquery.jsの最後の方に書いてある

window.jQuery = window.$ = jQuery;

と結果的には同じ事ですね。

無名関数のクロージャについては「謎のjavascript、『(function (){})();』 | ぼくんちのバックステージ」が詳しくてわかりやすいです。興味ある方は是非。

話を戻して、プラグインを読み込む場合はどうでしょうか。
実は下記のようにしてもうまくいきません。

<head>
	<script type="text/javascript" src="jquery.js"></script>
	<script type="text/javascript" src="jquery.plugin.js"></script>
	<script type="text/javascript">
		jQuery.noConflict();
	</script>
	<script type="text/javascript" src="prototype.js"></script>
	<script type="text/javascript">
		(function($){
			$('#hoge').plugin();
		})(jQuery);
		$('myDiv').addClassName('fuga');
	</script>
</head>

プラグインを読み込む場合、プラグイン自体には「jQuery」が渡らないので、うまくいきません。
こんな時は、プラグインの内容を下記のように囲ってしまえば良いのです。

(fucntion($){
//プラグインの内容
})(jQuery);

なんともいんちき臭い方法ですが、最初と最後にたった2行追加するだけで、うまく動く様になることが多いです。
そもそも上記で挟んであるプラグインの場合もあったりします。(その場合は、前述の方法で動くはずです。)

まとめると

  • jQuery.noConflict();を呼び出したら(fucntion($){ })(jQuery);の中で書く。
  • プラグインが動かなかったら上記でかこってみる。

の2点を試すのが、一番てっとり早くて、確実な方法かと思います。

今回はprototype.jsを例に話を進めましたが、mootoolesなど、他のJavascriptライブラリでも有効な方法なので、jQueryと他のJavascriptライブラリを共存させる必要がある際は試してみてください。

“webkitTransitionEnd”はアニメーションさせるCSSプロパティの数だけ発生する

css transitionの終了をJavascriptで拾う際は(webkitの場合)「webkitTransitionEnd」を利用するが、
これは設定したCSSのプロパティの数だけ発生する。
例として

#hoge {
	-webkit-transition:
		1s width ease-in-out,
		1s padding ease-in-out,
		1s margin ease-in-out,
		1s background-color ease-in-out,
		1s font-size ease-in-out
}

このようなアニメーションを割り当てると
5回webkitTransitionEndが発生する。
よく考えれば当たり前っちゃ当たり前なのだが、今回作業している時にはまった。

CSSStyleDeclarationにtransition系が残っていると、スタイルの変更がアニメーションしてしまう

CSS transition を割り当てると、
CSSStyleDeclaration($(‘#hoge’).get(0).styleなどで取得してやる)のwebkitTransitionプロパティに
値がセットされるのだが、
これをクリアせずにそのままにしておくと、
後から$(‘#hoge’).css(‘color’,'#F00′);などとすると、それもアニメーションしてしまう。

なので適宜

$('hoge')
	.bind('webkitTransitionEnd',function(){
		$(this).get(0).style['webkitTransition'] = '';
	})

などと、アニメーション終了後に空にしてやる必要がある。

jQuery CSS Animate Plug-inの1.1をリリースしました。
主な変更点は下記

  • queueに追加するようになったので、ほぼ.animation(params,options)と同じ使い方ができるように
  • よく考えたらcompleteを実装していなかったので実装
  • ロジックがおかしかった部分を修正

CSSAnimationの終了時のイベントの取得で躓いたけれど、
「webkitTransitionEnd」などででとれることを知った。

ただ、各ブラウザの状況が

	webkit = 'webkitTransitionEnd'
	firefox = 'transitionend' //←すべて小文字
	opera = 'oTransitionEnd'

となっていて、どこかにFxは「transitionEnd」と書いてあったけどそれは嘘だった
実装ミスかなぁ。

実は今回の改修はsptpに手を入れている途中で、必要になったのが理由です。
作業内容としては、モーダルウィンドウのロジックを基本的にはposition:fixedを利用するように変更、
touch関連のイベントは独自実装しなおし、ajaxによるコンテンツ読み込みの実装など
完全リニューアルに近いですね。

まぁもともと0.1だしそんなものです。
jQueryMobileに追いつこうとは思わないけど、それなりに使えるものを作るつもりです。
狙っている需要としては

  • 普通にWeb製作はできるけど、スマホでよく使われるようなものをJSで改めて組むのが面倒
  • 自分たちでもできるので、あまりごちゃごちゃやられると逆に面倒

というあたりでしょうか。

まぁ結局は俺得なんですけどね。

またもやちょっとしたjQueryのプラグインを書いてみた。
jQuery CSS Animate Plug-in

スマホの方もアップデートしなければ・・・

こんなものを作ってみた。

あれから追加したアプリとしては

  • Backgrounder 入れるのをすっかり忘れていた
  • DreamBord テーマ用アプリ

DreamBordのテーマはAsynmetric HD をカスタマイズしているんだけど、中々難易度が高くて今だに未完。
試行錯誤しながらだと難しい。
ただ、HTMLとJSでWidgetを書けるのは楽しい。
カスタマイズも基本はXMLなのでそんなに問題は無いから、一から作ってもいいかもしれない。
公式を漁ればドキュメントも一応あるから、なんとかなりそう。

こちらのサイトの情報を元にJBしてみた。
Absintheを起動後してしばらくするとiPhoneのホームに「Absinthe」のアイコンが現れるのだけど、
それを起動しても接続ができなかったため手動で
「設定」→「ネットワーク」→「VPN」からVPNを「オン」にしたところ
エラーが出て自動的にiPhoneが再起動して脱獄完了しました。

ちなみに現在AbsintheはMacのみの模様。

アプリ系がうまく動くかどうか現在確認中・・・。


以下追記

インストールしたアプリ

  • SBSettings

    いわずもがな。デフォルトのものはオフにして、通知センターにまとめてます。
    通知センターのカスタマイズ用としても便利

  • BlurriedNCBackground

    通知センターの背景を”すりガラス”風に 参考記事

  • Calendar for Notification

    通知センターにカレンダーを表示

  • OmniStat for Notification

    通知センターに残メモリ等の情報を表示。デザインが馴染んでいていい。LockInfoにも表示。

  • Rotation Inhibitor SBSettings

    から画面回転のロックを制御する(普通のマルチタスクをMultif0wに全面置き換えしているため)

  • Remove Background

    実行中のアプリを終了。

  • Remove Background SBSettings Toggle

    ↑のSBSettings用 Activetorでホーム長押しに割り当ててしまうと便利

  • LockInfo

    ロック画面にいろいろ表示

  • Multif0w

    標準より便利なマルチタスク切り替え

  • Infinifolders

    フォルダに無限にアイコンを入れられる

  • iFile

    もろもろカスタマイズ用に。脱獄のお供。 参考記事 *補足

  • NoNewsIsGoodNews

    邪魔なNewsStandを削除する。参考記事

3GSの時は使っていたが、使わないことにしたアプリ

  • iRealSMS 3.0

    使いものにならない程ではないが、キーボードが隠れたり、逆にボタンが隠れたりとかなり微妙。
    結局デフォルトのを使うことにした。


  • 参考記事の「方法1」はiOS 5.0.1では使えなかった。
    「方法2」の場合、「N88AP.plist」は無く「N94AP.plist」だった。確か前者は3GSの時のものだったと思う。
    該当ディレクトリの似たようなファイル名のものを編集すればOK

jQuery Mobileが好みでないので、とりあえず必要最低限だけ書いてみた。
jQuerySmartPhoneTinyPlug-in