【Wordpress】記事に付けられたタグで検索したTwitterのつぶやきを表示する

TwitterのAPIを使って、タグをORで繋げて検索して、その結果を表示します。
賢さが全く感じられないコードだけど
以下コードをテンプレートの個別記事の下に貼りつければ動くはず。
記事の下が寂しい時に使えるかも。

探せばこんなプラグインありそう。

<?php
$wpkeywords = get_the_tags();
$twkeywords = ”;
$wpkeywords_count = count( $wpkeywords );
$i = 0;
foreach( $wpkeywords as $twkeyword ){

if($i){
$twkeywords .= ‘ OR ‘;
}
$i++;
$twkeywords .= $twkeyword->name;
}
?>
<script type=”text/javascript”>
//<![CDATA[

$j=jQuery;
$j(document).ready(function() {
search($j().val());
});

function search(word) {
$j.ajax({
type: "GET",
url: "http://search.twitter.com/search.json",
data: {
"q": "<?php echo $twkeywords; ?>",
"rpp": 10,
"lang": "ja"
},
dataType: "jsonp",
success: function(data) {
$j("#result").empty();
$j.each(data.results, function(i, item) {
$j("#result").append($j('<div><a href="http://twitter.com/'+item.from_user+'" target="_blank"><img src="'+item.profile_image_url+'" width="36" height="36" />'+item.from_user+'</a></div><div>'+item.text+'</div>'));
});
}
});
}
//]]>
</script>
<div id=”result”>Twitter読み込み場所</div>

Posted in PHP, Wordpress, javascript at 5月 11th, 2010. No Comments.

WordpressでjQueryがエラー出て使えない時の解決法

jQueryはWordpressでは標準で読み込まれるので、ちょっと使っていじろうと思ったら、動かない。
エラーを見ると

エラー: $ is not defined

の表示が。

検索してみたら、prototypeなど同じく「$」を使うプログラムと競合しないように
jQuery.noConflict();”が使われている時に出るエラーだそうです。
wordpressのheadタグ内で読み込まれるjquery.jsを見てみたら、それを最後の行に発見。

解決策としては、「$」の代わりにjQueryを使えばいいということだけど、
長いので改めて

$j = jQuery;

と定義して使用しました。

prototypeとかほぼ間違いなく使わないだろうから、

$ = jQuery;

でもいいと思うけど、一応。

ちなみにjQueryは、通常、header.phpに書かれているwp_head()関数で読み込まれるので
それが無いと読み込まれません。しかも他のプラグインも動かないことが多いです。
自分でテンプレート作るときは忘れないように入れましょう。

Posted in Wordpress, javascript at 5月 11th, 2010. No Comments.

ubuntu9.10から10.04LTSへアップグレード

普通にシステム->システム管理->アップデート・マネージャよりアップグレード中。
すぐ終わるかと思ったら、4,5時間かかるよう。
もしかして新規の方が早い?

いろいろ楽しみだけど、寝て待つしか無い。

Posted in Ubuntu at 5月 11th, 2010. No Comments.

mysqldumpの文字化け回避法@Dreamhost

2009年末にいろいろ無制限な海外サーバーDreamhostを借りて、遊んでいたんですが、 家のサーバー(ubuntu)で作ったMysqlをDreamhostに移そうとすると、いつも文字化けしてしまいました。 おそらくDremahostのDBの文字コードがlatin1なのが原因なのは分かっていたんですが、変える権限はないので 検索して、下記のような対策を発見。

mysqldumpで文字化けデータを頑張ってダンプ&リストア
http://koexuka.blogspot.com/2009/04/mysqldumpdump.html

↑は「–default-character-set=binary」をつけて、エクスポート&インポートするやり方。 やってみたけど変わらず文字化けして失敗。

MySQL 4.1 から 5.0に、文字化けせずにmysqldumpでデータを移行する
http://www.goodpic.com/mt/archives2/2009/01/mysql_41_50mysq.html

ダンプしたファイルをテキストエディタなどで開いてutf8をlatin1などに書き換える方法。
成功するけど、非常にめんどくさい&自動化が難しいので、納得できず。
書き出すときに–deafault-char-set=latin1って付けても、dumpしたファイルの中にはutf8って書いてあるんですね。

半ばあきらめてmysqldumpの公式マニュアルに目を通していたら、 charset関係のオプションを発見。しかもデフォで有効。

–set-charset 出力にSET NAMES default_character_setを追加してください。このオプションはデフォルトで有効となっています。SET NAMESステートメントを抑制するには、–skip-set-charsetを使用してください。

というわけで、–skipを使って無効にして試してみる。
前提条件として、DH側に同じ名前のデーターベースは作ってある。
試行錯誤したらから要らないオプションが付きまくってる。
コピペじゃなくて手打ちしてるから、ミスがありそう。

ローカル側
mysqldump DB_NAME -u USER_NAME -pPASSWORD --add-drop-table --default-character-set=binary --no-create-db --skip-add-drop-database --skip-set-charset >dump.sql

(↓ファイルアップロード)

ドリホ側
mysql -u USER_NAME -pPASSWORD -h MYSQL_DOMAIN DB_NAME<dump.sql

これで文字化けせずに無事移転できました。
なんかインポートの際に権限無いですよ的なエラーがでるので、何かオプションをオフにし忘れてるっぽいけど、大丈夫そう(てきとー あと、アップロードの際は、bzip2使ったりしてます。

重いプログラムなので、家のサーバーで動かして、自動で定期的にDH側と同期できればいいなぁなんて考えてるけど シェルスクリプトがまだ分からないので、いつになるか。

Posted in MySQL, PHP at 2月 13th, 2010. No Comments.

25行の軽量PHPテンプレートエンジン「Petitmpl」作りました。

必要最低限、でもループにも対応したテンプレートエンジンです。 クラスで25行程度で、正規表現は極力控え、可能な限りstrtr()とstr_replace()で書き換えしてます。

必要なのは、 Petitmpl本体(PHP、25行のクラスなので、改造してソースに入れてもOK)、 テンプレート(HTMLなど)、 設定ファイル(PHP)、 です。

クラスにHTML等のテンプレートファイルと、置換前と置換後の文字を連想配列形式で渡して使います。 ループはさらにその連想配列を配列に入れて渡します。詳しくはサンプル見てください。

今日3時間ぐらいで作って、今日公開なので、いろいろ問題ありそうです。

実行例

テンプレ(HTML)  →  適応後

サンプルセットをダウンロード

◆本体(petitempl.php)
<?php
class petitmpl{
	private $tpl_data;
	function tpl_load($tpl_path){
		$this->tpl_data=file_get_contents($tpl_path);
	}
	function repl($words=array()){
		$tpld = strtr($this->tpl_data,$words);
		$this->tpl_data =$tpld;
	}
	function repl_arr($id='',$roop=array()){
		$tpld = $this->tpl_data;
		$reg='/<!\-\-START\['.$id.'\]-\-\>(.*?)<!\-\-END\['.$id.'\]-\-\>/s';
		preg_match_all($reg,$tpld,$repd);
		$roopdata='';
		foreach($roop as $item){
			$roopdata.=strtr($repd[1][0],$item);
		}
		$this->tpl_data =str_replace($repd[0],$roopdata,$tpld);
	}
	function publish(){
		return $this->tpl_data;
	}
}
?>
◆テンプレートファイル(tmpl.html)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta http-equiv="Content-Script-Type" content="text/javascript" />
	<meta http-equiv="Content-Style-Type" content="text/css" />
	<title>タイトル</title>
</head>
<body style="width: 800px;margin:auto;">
<h1>見出し1</h1>
	<p>文書の内容1</p>
	<p>文書の内容2</p>
	<p>文書の内容3</p>
	
<h2>見出し2</h2>

<ul>
<!--START[rep1]-->

<li class="id" style="margin-bottom:10px;"><a href="linkurl">リスト</a></li>

<!--END[rep1]-->
</ul>

<h3>見出し3</h3>

<ol>
<!--START[rep2]-->

<li style="margin-bottom:10px;"><strong>記号</strong> 内容</li>

<!--END[rep2]-->
</ol>

<p style="text-align:right;">フッター</p>
</body>
</html>
◆設定例ファイル(sample.php) テキストはデータベースから読み込んだもの等を使うので、こんな文字だらけにはならないはずです。
<?php
//classのファイル読み込みます
require_once('petitmpl.php');
//インスタンス作ります
$tple=new petitmpl();

//テンプレートファイルのパスを指定して読み込みます
$tple->tpl_load('tmpl.html');

/*「置換前=>置換後」の形式でテンプレにあわせて書いていきます。
一度置換されたワードはもう変換されないので順番は逆になっても大丈夫。
例えば「あああ」=>「いいい」を書いたあと、「いいい」=>「ううう」を書いても「いいい」のまんま
*/
$words=Array(
	'タイトル'=>'テンプレートエンジン「Petitmpl」テスト',
	'見出し1'=>'テンプレートエンジン「Petitmpl」とは',
	'文書の内容1'=>'拡張を前提とした必要最低限なテンプレートエンジンです。25行程度のクラスですが、ループにも対応してます。',
	'文書の内容2'=>'テンプレートは自然なhtmlのままデザインできます。ブラウザでそのまま確認できます。ループもHTMLのコメントを利用しており、置換後にコメントは消えます。',
	'文書の内容3'=>'独自のテンプレートタグも特に決めてないので、必要に応じて決めてください。置換の正規表現はループで必要な箇所だけにして、他はstrtrを利用しています。速いかも。',
	'見出し2'=>'ループの使用例',
	'見出し3'=>'その他',
	'フッター'=>'作成:ろっく 2010/01/22 <a href="http://petitec.17sai.jp/">http://petitec.17sai.jp/</a>',
	
);

$list=Array(
	Array('linkurl'=>'#id1','リスト'=>'置換ワードは連想配列で渡します。リストの場合は、それらをさらに配列に入れます。','class="id"'=>'id="id1"'),
	Array('linkurl'=>'#id2','リスト'=>'うまく説明できないのでサンプルとテンプレのソースを見てください。','class="id"'=>'id="id2"'),
	Array('linkurl'=>'#id3','リスト'=>'それぞれのアイテムごとに、複数の置換も可能です。','class="id"'=>'id="id3"'),
	Array('linkurl'=>'#id4','リスト'=>'このサンプルではリンク先のURLと、このテキスト,あとliのidを指定しています。','class="id"'=>'id="id4"'),
	Array('linkurl'=>'#id5','リスト'=>'ループ回数の制限もできません。設定した配列の数だけ出ます。制限するときは配列自体を調整してください。','class="id"'=>'id="id5"'),
);

$vartext='これは変数に入れたテキストです';
$list2=Array(
	Array('記号'=>'●','内容'=>'もちろん変数も指定できます。'),
	Array('記号'=>'★','内容'=>$vartext),
	Array('記号'=>'〓','内容'=>'エラー処理はしてないので、状況に応じてなんとかしてください。'),
	Array('記号'=>'◆','内容'=>'常に動的な出力を考えたため、キャッシュも、ファイル書き出し機能も付いてません。<br />キャッシュはPEARのCache_Lite、書き出しはパス指定してfile_put_contents使えばすぐ出来そうです。'),
	Array('記号'=>'◎','内容'=>'クラスを使い始めてまだ2日目で作ったものなので、改善点があれば教えてください'),
	Array('記号'=>'△','内容'=>'GPLライセンスで自由に使って、改造して、公開して、配布してください。'),
);
$tple->repl($words);
//通常の単語は1個の配列にまとめられます

$tple->repl_arr('rep1',$list);
//ループは個数分設定が必要です。<!--START[●●]-->繰り返す内容<!--END[●●]-->の●●を第一引数に、置換するリストを第2引数に指定します。
$tple->repl_arr('rep2',$list2);

//終わったら↓すると変換された内容が帰ってくるので、echoするなり、ファイルに書きだすなりしてください
echo $tple->publish();

?>
Posted in PHP at 1月 23rd, 2010. No Comments.