PHP・MySQL

WordPress PDA & iPhone不具合修正(サブカテゴリ対応版)

WordPressをiPhoneやAndroidなどのスマートフォンに対応させるプラグインとして、Wordpress PDA & iPhone (wp-pda) を新しいjQuery Mobileで使用すると、カテゴリー表示にした場合にレイアウトに不具合が発生する。
前回のエントリ『Wordpress PDA & iPhone (wp-pda)カテゴリ表示での不具合修正方法』では、カテゴリを呼び出す階層を制限することで表示不具合に対処したが、サブカテゴリに辿り着けないのは不便なため、別の修正方法をとることにした。

前回修正してしまっている場合も、

<?php if($detectedPage=='categories') :?>
〜
<?php endif; ?>

をそのまま入れ替えればいい。

修正するのは、前回と同じ以下のファイル
/plugins/wp-pda/jqmobile-theme/index.php

オリジナル

<?php if($detectedPage=='categories') :?>
<div data-role="content">
<ul data-role="listview" data-inset="true">
<?php
$categoriesHTML = wp_list_categories('title_li=&show_count=1&echo=0');
$categoriesHTML = ereg_replace("/\n\r|\r\n|\n|\r/", "", $categoriesHTML);
$categoriesHTML = str_replace(" ",' ',$categoriesHTML);
$categoriesHTML = str_replace(" ",' ',$categoriesHTML);
$categoriesHTML = str_replace("a> (",'a> <span class="ui-li-count">',$categoriesHTML);
$categoriesHTML = str_replace(")</li",'</span> </li',$categoriesHTML);
echo $categoriesHTML;
?>
</ul>
</div>
<?php endif; ?>

<?php if($detectedPage=='categories') :?>
<div data-role="content">
<ul data-role="listview" data-inset="true">
<?php
$categoriesHTML = wp_list_categories('title_li=&show_count=1&echo=0');
$categoriesHTML = ereg_replace("/\n\r|\r\n|\n|\r|\t|> </", "", $categoriesHTML);
$categoriesHTML = str_replace("a> (",'a><span class="ui-li-count">',$categoriesHTML);
$categoriesHTML = str_replace(")<ul class='children'>","</span><ul class='children'>",$categoriesHTML);
$categoriesHTML = str_replace(")</li",'</span></li',$categoriesHTML);
echo $categoriesHTML;
?>
</ul>
</div>
<?php endif; ?>

に変更する。

この修正を施すことにより、カテゴリリストをタップすると、サブカテゴリが存在する場合はサブカテゴリ一覧、無い場合は該当カテゴリのファイル一覧が表示される。

WordPress PDA & iPhone (wp-pda)カテゴリ表示での不具合修正方法

WordPressをiPhoneやAndroidなどのスマートフォンに対応させるプラグインとして、Wordpress PDA & iPhone (wp-pda) は便利だが、jquery mobileのバージョンをjQuery Mobile 1.1や、新しいjQuery Mobile 1.2にすると、カテゴリー表示にした場合にレイアウトに不具合が発生する。

症状としては、エラー等で表示されない訳ではなく、サブカテゴリまであるカテゴリの表示部分に余分なテキスト等が表示されてしまい、表示が崩れてしまう。
階層が浅いサイトならば問題なく使える場合もあるだろうが、現実的にはこの表示バグを修正した方が良いだろう。

修正するのは以下のファイル
plugins/wp-pda/jqmobile-theme/index.php

<?php if($detectedPage=='categories') :?>
<div data-role="content">
<ul data-role="listview" data-inset="true">
<?php
$categoriesHTML = wp_list_categories('title_li=&show_count=1&echo=0'); $categoriesHTML = ereg_replace("/\n\r|\r\n|\n|\r/", "", $categoriesHTML); $categoriesHTML = str_replace(" ",' ',$categoriesHTML); $categoriesHTML = str_replace(" ",' ',$categoriesHTML);
$categoriesHTML = str_replace("a> (",'a> <span class="ui-li-count">',$categoriesHTML);
$categoriesHTML = str_replace(")</li",'</span> </li',$categoriesHTML);
echo $categoriesHTML;
?>
</ul>
</div>
<?php endif; ?>

<?php if($detectedPage=='categories') :?>
<div data-role="content">
<ul data-role="listview" data-inset="true">
<?php
$categoriesHTML = wp_list_categories('title_li=&show_count=1&echo=0&depth=1');
$categoriesHTML = ereg_replace("/\n\r|\r\n|\n|\r/", "", $categoriesHTML);
$categoriesHTML = str_replace(" ",' ',$categoriesHTML);
$categoriesHTML = str_replace(" ",' ',$categoriesHTML);
$categoriesHTML = str_replace("a> (",'a> <span class="ui-li-count">',$categoriesHTML);
$categoriesHTML = str_replace(")</li",'</span> </li',$categoriesHTML);
echo $categoriesHTML; ?>
</ul>
</div>
<?php endif; ?>

のように修正。具体的には

$categoriesHTML = wp_list_categories('title_li=&show_count=1&echo=0');

の部分に「&depth=1」を入れて階層取得を1階層に制限するだけの話。

この1行を修正するだけで、表示バグは直る。

WordPressのプラグインtweetableにハッシュタグを追加したい時

最近は高機能なWordPressのTwitterプラグインが増えているが、シンプルなtweetableが使い易い場合もある。

ただ、ハッシュタグを管理画面から設定することができないので、統一したハッシュタグを入れたい場合不便。

tweetableでハッシュタグを追加したい時は以下のように修正する。

wp-content/pluginsにあるtweetable.phpを開き、

$tweet = $twitter->fit_tweet($title, $permalink);
↓
$tweet = $twitter->fit_tweet($title, $permalink).' #ハッシュタグ';

TwitterのタイムラインをRSSで取得していたのがエラーで取得できなくなった場合

いままで問題なくTwitterのタイムラインをRSSで取得出来ていたのが突然エラーで取得できなくなった場合の簡単な対応方法
2013年3月にTwitterのAPIが変更となりAPI 1.1になることは多くのサイトでも書かれているが、2012年の10月から既に仕様の変更が始まっている。
その一つの例が、ユーザーのタイムラインをRSSで取得するAPI
いままでは
http://twitter.com/statuses/user_timeline/androidstyle.rss
といった形式で、user_timelineに続けてタイムラインを取得したいユーザー名+rssで簡単に取得出来たが、現在ではこの方法はエラーとなり
Sorry, that page does not exist
が返される
長い目で見れば、この機会にAPI 1.1の仕様に変更すればよいがOAuth認証ロジックの追加も必要となるため大きな手直しが必要となる。
そこで、完全移行の2013年3月まで使用可能だと思われる、たった1行の変更で済む簡単な修正方法を紹介する。
エラーになる部分
http://twitter.com/statuses/user_timeline/iphonestyle.rss
http://api.twitter.com/1/statuses/user_timeline/iphonestyle.rss
に変えるだけ。
URLにapiが付くことと「1」の部分は所謂API 1.0が入る。
今まで通りRSSの形式で取得できるから、他の部分は変更しなくていいはず。

Twitter API 変更(API 1.1)に対応する方法

Twitterは2013年3月5日に向けて一部APIの廃止、レートリミット方式の変更、表示方式の厳格化、等を発表。
「表示方式の厳格化」はユーザー名の表示やタイムスタンプといった画面レイアウトに大きく関わるものもある。
現行のAPI 1.0からAPI 1.1に対応するためにはどうすればいいのかをピックアップして紹介する。
■認証
仕様変更によりOAuth認証をしないとAPIは扱えなくなる。
■REST API
REST APIは例えば
http://api.twitter.com/1/account/totals
http://api.twitter.com/1/notifications/follow
http://api.twitter.com/1/lists.json
といったものであり、廃止になるものと
http://api.twitter.com/1.1/〜
に変更されるものがある。
■検索API
API 1.0
http://search.twitter.com/search.json
API 1.1
http://api.twitter.com/1.1/search/tweets.json
例(要認証)
http://api.twitter.com/1.1/search/tweets.json?q=iphone&until= 2012-11-12&count=100
■TwitterへのPOST
API 1.0
$to->OAuthRequest(‘http://api.twitter.com/1/statuses/update.xml’, ‘POST’, array(‘status’ => $message));
API 1.1
$to->OAuthRequest(‘http://api.twitter.com/1.1/statuses/update.json’, ‘POST’, array(‘status’ => $message));

WordPressバージョンを3.4.2にバージョンしたらCustom Field Gui Utilityが使えなくなった時

WordPressの3.4.1までは問題なく使えていたCustom Field Gui UtilityがWordPressバージョンを3.4.2にバージョンしたら使えなくなった時は、以下の方法でcfg-utility.phpを修正する。
cfg-utility.phpは
wp-contentのpluginsにインストールしたcustom-field-gui-utilityのプラグインファイル群の中にある
cfg-utility.php内にある
add_action ('simple_edit_form', array ('cfg_utility_class', 'insert_gui'));

add_action ('edit_form_advanced', array ('cfg_utility_class', 'insert_gui'));

のように修正する。

いずれ3.4.2に対応したCustom Field Gui Utilityが出ると思うが、それまでの対応として。
参考:

http://mbdb.jp/hacks/wordpress/wp3-3-custom-field-gui-utility.html

WordPressでメール投稿に使うプラグインKtai Entryのエラーの原因はこれ

WordPressではメール投稿できる機能が用意されている。
設定>投稿設定
メールでの投稿
メールを利用して WordPress に投稿するには POP3 アクセスができる秘密のメールアカウントを作成してください。そのアドレスで受信されたすべてのメールが投稿されるので、使用するアドレスは秘密にしておいたほうがいいでしょう。よろしかったら、以下 3 つのランダムな文字列をご利用ください:
メールサーバーポート
ログイン名
パスワード
メール投稿用カテゴリーの初期設定
ただし、上記に設定するだけでは投稿されない。
そこで使うのがKtai Entryというプラグイン。
投稿のタイミングやレイアウト等も設定でき、必須のプラグインと言ってもいい。
ただ、多くのひとが以下のエラーに悩まされる。
There is 1 message(s).
Error at #1: Sender address is not registered: hoge@hogehoge.com
/* Retrieval completed. */
ありがちなのが、Ktai Entryのメールアドレス設定に、送信元を入れる間違いだが、
メールアドレスに投稿先のアドレスを入れても出る。
上記エラーメッセージは、「送信元のアドレスが『ユーザー』として登録されていない」ことが原因。
そこで、送信するメールアドレスを持つユーザーを
ユーザー>新規追加
から登録する。
注意するポイントとして、権限グループが「購読者」のままではエラーとなるから、「投稿者」にする。
通常ログインしているユーザーの権限が「管理者」であれば、ここで作成したユーザーでログインする必要は無い。(投稿記事の編集・修正は管理者で可能)
これでKtai Entryを使ったメール投稿が出来る。

phpでBlowfishを使うならセキュリティの高いCBCモードを使うこと。

Blowfishは復号可能で強力な暗号化をおこなうことができます。
キーは64ビットから448ビットの間で設定することができますが、最も強力な暗号にすることを考慮するとフルサイズのキーにすることをお薦めします。

また、デフォルトの設定(ECB)は暗号化に際して常に同じバイナリを返してしまうことから、頻繁に使用される文字列の場合推測される可能性が高くなります。

セキュリティを高くするためにはCBCというモードを使用し、ランダムな初期ベクトルを生成することで、同じ文字であっても暗号化の度に異なる結果にすることができます。

使い方

使用目的や保存場所、保存方法によって、バイナリ、16進数、Base64エンコードと使い分けるといい。

なお、復号時にデータの最後にゴミが残ることがあるので、その処理を追加してある。

———-

#Blowfishへのパス(例)

require_once('Blowfish.php');

#Blowfish 暗号化キー(例)

define('CBF_KEY','swjTGyigRYgGTAHDbL9g7MARxX-EH_iBtxXsazhK8FSFmyTSkaF2BHFDC6s_4Xii');

#初期化ベクトル(ランダム生成)

$blowfishiv = substr(md5(uniqid(rand(),1)),0,8);

#CBCモードで使用

$crypt = Crypt_Blowfish::factory('cbc',CBF_KEY,$iv);

———-

暗号化

#バイナリ

$crypted = $crypt->encrypt($str);

#16進数の場合

$crypted = bin2hex($crypt->encrypt($str));

#Base64の場合

$crypted = base64_encode($crypt->encrypt($str));

———-

復号

#バイナリ

$str = $crypt->decrypt($crypted);

#16進数の場合

$str = rtrim($crypt->decrypt(pack( "H*",$crypted)));

#Base64の場合

$decrypt = $crypt->decrypt(base64_decode($crypted));
$hex = bin2hex($decrypt);
$hex = ereg_replace("00", "", $hex);
$str = pack("H*", $hex);

PHPで3桁でカンマを入れたい時

数値の比較や計算にはカンマの無い方が便利なのでデータは数字のみにすることが多いが、簡単な関数で3桁毎のカンマを入れることが可能なので、金額等の表示では3桁毎にカンマを入れて読み易くすることをデフォルトにしたい。
数値にカンマを入れるのは以下の方法。
$a = 100000000;
$b = number_format($a);
echo $b;
出力されるのは
100,000,000
逆に、3桁毎にカンマが入ったデータからカンマを削除するのは以下の方法。
$b = ‘100,000,000’;
$c = str_replace(‘,’,”,$b);
echo $c;
出力されるのは
100000000

TwitterのAPI制限のカウントxmlの取得に失敗する場合はこの方法

TwitterのAPIは一定時間内での利用回数が制限されている。(例:1時間あたり150リクエストまで)
そのためTwitterではあと何回APIの実行が可能かを取得するためのAPIも用意されており、TwitterのAPI制限状況を取得したい場合、以下のURLにアクセスすることで残りのAPI呼出可能回数およびリセットされる時間が分かる。

http://twitter.com/account/rate_limit_status.xml

$xml = @simplexml_load_file(“http://twitter.com/account/rate_limit_status.xml”);

上記のようにsimplexml_load_fileを使うと、1時間当たりの上限リクエスト数、リセットされる時間や、TwitterのAPI制限に達するまでに利用できるAPIリクエスト数が返ってくる。

SimpleXMLElement Object
(
    [hourly-limit] => 150
    [reset-time-in-seconds] => 1317191935
    [reset-time] => 2011-09-28T06:38:55+00:00
    [remaining-hits] => 148
)

そこで、

$limit = $xml->remaining-hits;
$hourly = $xml->hourly-limit;

のようにして、制限に達するまでに利用できるAPIリクエスト数、1時間当たりの上限リクエスト数を取得しようと考えるが、この方法ではうまくいかない。
理由は簡単。返されてきたxmlの各データ[hourly-limit]、[reset-time-in-seconds]、[reset-time]、[remaining-hits]にハイフン「-」が含まれているのが原因。
xmlのキーにハイフンが含まれていた場合は、以下のように記述すると成功する。

$limit = $limit_status->{‘remaining-hits’};
$hourly = $limit_status->{‘hourly-limit’};

xmlのデータを処理していて、xmlの取得は成功しているのに、データとしてうまく取り出せない場合にも同様のケースがあることがある。