Archive for the 'WP Tips' Category

WordPress:DBに配列を保存

wp_postmetaに attach系のデータを保存しなきゃいけなくて(画像データだけ別に作っておいて、それのアタッチデータを作るわけですね)、例のPHPの配列を insertで書き込もうと思ったんだけど、パパっと作業するのは Rubyの方が楽ちんなので、調べただけで使わず仕舞い。
でもなんかの拍子に必要になるかもしれないので。

INSERT INTO wp_options(blog_id, option_name, option_value) VALUES(0, ‘my_messages’, maybe_serialize( $messages ))

$messages = maybe_unserialize($result->messages);

maybe_serialize()と maybe_unserialize()がセットになっているわけですね。
詳しくは、こちら ⇒ DBに連想配列を保存するには

pg4wpその後

たぶんこれに興味のある人は日本全国に10人くらいしかいないと思いますが、WordPressを PostgreSQLで使うドライバ、pg4wpのその後です。
プラグインを入れるたびに新たなエラーが発生して、その都度、いろいろと手を入れています。
今回は、Contact Form 7を入れたらエラーになりました。Contact Form 7が auto_increment付きのテーブルをクリエイトしようとしてエラーになりました。WordPressの標準って主キーにオートインクリメントを使ってないのですかね。それはそれでびっくりです。

if(stripos($sql, 'CREATE TABLE') === 0) {
  $sql = str_ireplace('CREATE TABLE IF NOT EXISTS', 'CREATE TABLE', $sql);

  $a   = preg_split("/(CREATE TABLE | \()/", $sql);
  $tbl = $a[1];

  $sql = preg_replace("/DEFAULT CHARACTER SET .+;/", ";", $sql);
  $sql = preg_replace("/,\s*PRIMARY KEY\s\(.+?\)/i", "", $sql);
  $sql = preg_replace("/text\s+NOT\s+NULL/i", "text default ''", $sql);
  if (stripos($sql, 'auto_increment')) {
    $s = "";
    $a = explode("\n", $sql);
    foreach($a as $v) {
      if (stripos($v, 'auto_increment')) {
        $b = explode(" ", trim($v));
        $key = $b[0];
        $v = $key." integer DEFAULT nextval('".$tbl."_seq'),\r\n";
      }
      $s .= $v;
    }
    $sql = $s;
    $sql = "CREATE SEQUENCE ".$tbl."_seq; ".$sql."; CREATE UNIQUE INDEX ".$tbl."_".$key."_key on ".$tbl." (".$key.");";
  }
}

相変わらず力技です。(ここは笑うところか?)
まず、PostgreSQLには “IF NOT EXISTS”がないのでこれを取っ払って(テーブルがすでにあったらエラーになるので、なかったら実行はなくても可)、”PRIMARY KEY(key)”という指定もないみたいなので、これも取っちゃって、あと、これがクリビツテンギョウなんですけど、MySQLは text NOT NULL属性で値を指定しない(INSERT文に含めない)と、空文字を勝手に入れてくれるのに対して、PostgreSQLはエラーになっちゃうんですね。
これは NOT NULL属性をつけてる主旨からいって、PostgreSQLを支持したいです。でも、INSERT文でエラーになるのは仕方ないので、text NOT NULLは、text default “”にして、NOT NULLを外しちゃいました。
 
あと、面倒なところが、auto_incrementの取扱い。そのまま、SERIALにしちゃえばいいようなものなんですけど、そうすると、シーケンシャル・テーブルの名前が、table名_カラム名_seqという名前になって、wp_optionsなんかで使っている table名_seqルールと合わなくなってしまうこと。
で、SERIALが使えなくて、いちいち、CREATE SEQUENCE、CREATE UNIQUE INDEXみたいなことをやってるわけです。(きっとどっかにもっといい方法があるはずだ)
 
参考:PostgreSQL 日本語ドキュメントはよくできています。

jQueryによるフォーム部品操作

ここ『jQueryによるフォーム部品操作のレシピ』にまとめていただいているので感謝。

jQuery('input[name=target][value=xxx]').attr({ checked: "checked" });
$(’:radio[@name=target]:checked’).val();

こういう書き方ができるというのが目から鱗。下の方は試したわけではないのですが、いけるそうです。
 
あと、画面表示のときにフォーカスを移したいなというときはこちら。

jQuery("#mytext").focus();

body onload=”ほげほげ” とかしなくていいので、HTMLを汚さないのがいいかも。
 
あと、ついでに、Contact Form 7とかで、ラジオボタンが横向きにずらずらっと並んでしまって、縦一列にしたいけど、ラベルに<br/>とか入れたり、¥n入れたりするのってダサくないというときの解決法。

span.wpcf7-list-item { display: block; }

これは目から鱗。display: block ってこういうときに使うんだという感じ。

Safariぽいスライダーを作るJavaScript

これはさるところで、主として視覚効果として使用させていただいているスライダーです。本来はインプットの部品として使用するのですが、表示効果としてキレイで使いやすいので、少し外れた使い方ですが。
こちら『jQuery Slider update』がオリジンです。
使用方法はこちら『Safariぽいスライダーを作るJavaScript「jQuery Slider plugin」』が日本語で書かれているのでわかりやすいです。
ま、やってることはシンプルなので、オリジナルページのサンプルを読んだ方がいろいろと設定できてうれしいです。

WordPressの投稿に複数画像を一括挿入

WordPressで唯一面倒だと思うのが、画像の挿入。
アップロードはまとめて一括であげられるんだけど、それを投稿に入れようとしたら、一枚ずつ指定しないといけなくて、なんでこんな仕様にしたんだろうと思うことたびたび。チェックボックスをチェックしたものだけ、一括操作で「投稿挿入」させてくれてもいいじゃんと。
たぶんお客さんに「これ、不便だから何とかならないの?」みたいに言われたらすぐやると思うんですけど、自分が使う分には、まとめてあげといて、名前とサイズをメモっといてあとはエディタ上でコピーするだけだから、なくてもいいっちゃいいんですけど、別件でググってたら、そのものずばりの記事があったのでメモ。『WordPressの投稿に複数のアップロード画像を一括挿入する
まだ、やってませんけど、いずれそのうちに。ちなみに、このサイトは他の記事も辛口でオモシロイです。ポートフォリオとか特に。名古屋の美容室の仕事とか頼まれたら丸投げしたい。

WordPress:ページ切替えしないでコメントを投稿

あまりコメントを受け付けるページを作ってこなかったのですが(依頼される方が「(コメントに答えるみたいな)そんなこと、できないよ!」とおっしゃるので)、コメント重視のページを作らざるを得なくなって(なんだか、書き方が変だ)、いろいろやってると、標準のコメント欄って、エラーのとき、ページ遷移してエラーページに切り替わっちゃうんですね。ダサくないすか?
 
て、いうことで、サクサクっとググってみつけたのがこのページ『ページの移動なくコメントを投稿できるWPのプラグイン WDP AJAX Comments』。
日本語で書かれたページがあれば、もちろん、日本語の方が楽ちんですので、はい。なければ、英語のページでもよみますけどね。
ここに書かれている通り、ajax-comments.js のメッセージのみ日本語にしました。あとは、まったくOKです。ありがとうございます。
 
上のがダメだったら、こちら『jQuery で WordPress のコメント投稿を Ajax 化』にしようかなと思って調べていたんですけど、問題なかったので、こちらはメモとして。

キャッシュその他

WP-Super-Cacheのときに懲りていたはずなんですが、またやってしまいました。(スーパーキャッシュのときは、通販サイトのカートがクロスサイトスクリプティング対策をやってて、そのワンタイムトークンごとキャッシュしてたので、キャッシュを読むとXSSエラーになるという。orz...)
 
Apacheに cache と disk_cache というモジュールがあって、Apacheレベルでキャッシュしてくれるなら、きっと汎用性が高いだろう(スーパーキャッシュのときのようなことはないよね)と勝手に思って、この2つを available にしたんですが、WordPress Muでリダイレクト無限攻撃!orz...
 
「キャッシュがある程度溜まる」&「ブラウザのCookieの状態」&「なにか」で無現リダイレクトになるみたいで、ちゃんと追っかけきれてないんですが、301攻撃の嵐!
mod_evasiveを入れていたので、DoS攻撃だとみなされて、403 Forbiddenと踏んだり蹴ったりです。
気をつけましょう。

WordPressプラグインメモ

いまのところ使わないけど、そういうニーズも出そうだなと思うのがこれ↓
連続投稿を可能にするプラグイン Continuous Post Plugin
 
これはきっと使うなと思うのがこれ↓
Post Templates
Post templates 日本語リソース
投稿ごとにデザインテンプレートを変更するプラグイン – Custom Post Template
特定の記事やページをテンプレートにするプラグイン[WP]
ここに気になる追記が。

※2009/5/9追記 – ショップや不動産関係など、同じ雛形の記事を更新するサイトの場合は、AddQuicktagsというプラグインを利用した方が簡単です。後々のサイト管理を楽に行いたい場合は、カスタムフィールドを使用してテーマを直接カスタマイズした方が良いでしょう。

なるほどね。

投稿に画像やカスタムフィールドをまとめて付ける(SQL)

1つ1つの投稿に後から画像やカスタムフィールドを付けるのって、面倒ですよね。
DBを直接いじれる前提ですが、手順を書いておきます。
これをやる前に画像はまとめて、メディア ≫ ライブラリ に新規追加しておきます。(タイトルがファイル名になっている前提)
 

select ID,post_title from wp_posts where post_type='post';

とりあえず、投稿した IDを取りだします。
 

insert into wp_postmeta (post_id, meta_key, meta_value) values (930,'cf_price','3150');
insert into wp_postmeta (post_id, meta_key, meta_value) values (930,'cf_image_1','http://satake7.net/files/2010/05/b-005.jpg');

カスタムフィールドは、post_id に投稿IDをセットして追加します。
 

update wp_posts set post_parent = 930 where post_title='b-005' and post_parent=0 and post_type='attachment';

メディア ≫ ライブラリ に追加しただけの画像ファイルは投稿に紐づいていないので、post_parent=0 になっています。この post_parentに投稿IDをセットすればOKです。

WordPress いろいろメモ

Custom Field Template plugin
スーパーつぼ(にはまる)。いままで存在を知らなかったのが恥ずかしいくらい。ぼつぼつ使っていきます。
 
WordPress とFlashを連携させたい(入力編)
上のやつの簡単な解説。
 
[WordPress] プラグインを作ろう(2) 独自のカスタムフィールドを追加する
参考になりそうなのでメモ。
 
Fun With Plugins
  ウィザード形式でプラグイン名など必要事項を入力していくだけで、WordPressのプラグインとしての骨格を作ってくれるプラグイン。
 
WordPressでサイト構築して便利だったプラグイン
ここ、いろいろとまとまってて便利。
 
SEO的アイディア(妄想)
WPのプラグインとして実装。複数ブログへの投稿。<p>単位でのランダマイズ。時事ニュースを自動挿入。meCabでの形態要素分解。oAuth認証。XML-RPC、Atom投稿でのポスト。リモート投稿できない場合は、メール投稿 ≫ スクレイピングによる自動ログイン・投稿。自分以外にニーズがあるとも思えないが、ドネーション・サポートソフトウェアというのはどうだろうか?

« Previous PageNext Page »