Archive for the 'WP Tips' Category

WordPress:メディア追加のときのタグ編集

wordpress_logo

あとであとでと思っているといつまでたってもやらないので、思い立ったときにやってみたシリーズ。
「メディアを追加」ボタンで画像を投稿エディタへ挿入してから、毎回毎回手作業で次のようなことをしてました。(自分使用&仕様)

  • <div class=”img-shadow”></div>を追加
  • <a>タグを削除
  • <img src=”">の http://dev.satake7.net を削除。titleも削除。altは空に。classも削除

それをフィルタ一発でやったろーぜというわけです。参考にさせていただいたのは「WordPress のエディタに埋め込むメディア用タグを自動編集する」。
きっとこっちを見た方がわかりいいと思うので、自分でやったとこだけメモ。

function add_image_send_to_editor($html, $id, $alt='', $title='', $align='', $url='', $size='') {
 $wk_html    = "";
 if (preg_match("/^<a [^>]*?>.*?<\/a>$/i", $html)) {
   $wk_html .= '<div class="img-shadow">'.preg_replace("/^<a [^>]*?>(.*?)<\/a>$/i", "$1", $html).'</div>';
   $wk_html  = preg_replace('/(title=".*?"|class="align.*"|http:.*satake7.net)/i', "", $wk_html);
 }

<a>タグだったら、<div class=”img-shadow”></div>でくくって、いろんなものを削除ということです。

WordPressで title属性に改行を入れたいとき

 
Nivo Slider の画面キャプションは、imgタグの title属性にキャプション文字列をセットして表示するようになっているんですが、改行文字を入れようとしてはまったのでメモ。
 
普通、title属性に改行を入れたいときは、このどちらかだとおもいます。

&#13;&#10;
<br/>

WordPressだと、前者は無視され、BRは改行はするんですが、文字列終わりにゴミが付きます。

<img src="test.jpg" title="TEST<br/>test" />

TEST
test" />

こんな感じになるわけです。apply_filtersが余計なことをしてるんじゃないかなという気がフツフツと湧いてきていますが、ここに手を入れると大変そうなので、見なかったことにして、とりあえず何とかしてみます。

$p = get_the_content();
$p = apply_filters('the_content', $p);
$p = str_replace('|BR|', '<br/>', $p);
echo $p;

the_content()の代わりに get_the_content()を使って、自分で決めた改行コード(|BR|)を変換してるだけです。
やっぱり、apply_filters をちゃんと直すべきですね。(でも、WordPress3.0になったら直ってるかもしれない)

WordPressの投稿画面を使わないで画像を投稿へ紐づけ

1つ2つ記事を投稿するときは、WordPressの新規投稿の画面でなんの問題もないと思うんですが、
例えば、3400件ほど記事を作成して、その1つずつに30枚ほど画像を貼り付ける(102,000枚)のをバイト代出すからと言われても、手でやりたいと思いますか?
 
こういうときに、ハイっと言ってすぐ画面に向かって入力し続ける人の方がいまどきは稼げるかもしれませんが(1件の投稿と画像紐づけに1分かかったとして、1時間で60件、全部処理するのに、約57時間、時給1,000円で 57,000円か。こんなこと書いてないで、すぐやってもいいかも)、2時間くらいでめげる人のためにツールを使ってなるべく楽チンに画像を紐づける方法をまとめてみたいと思います。
続きを読む

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と踏んだり蹴ったりです。
気をつけましょう。

Next Page »