wordPressプラグインのクラス化

SPiSより

<?php
class links {
    public static function display( $arg ){
        echo $arg;
        if( !preg_match_all( "/href=\"([^\"]+)\"/iu", $arg, $matches ) ) return;
        $links = array( '<h4>Links</h4>', '<ul>' );
        foreach( $matches[1] as $href ) $links[] = "\t<li>{$href}</li>";
        $links[] = '</ul>';
        echo implode( "\n", $links );
    }
}
add_filter( 'the_content', array( 'links', 'display' ) );
?>


コンテンツ表示時に記事の中にあるhrefタグを抜き出し、記事表示後にリンクの一覧を出力するサンプル。

add_filter(フックするところ, array( ‘クラス’, ‘Function’ ),プライオリティ);

まだ正規表現が読めないので・・T-T

でも !preg_match_allのところでひとつもherfタグがなければreturnというということ。

int preg_match_all ( string pattern, string subject, array &matches [, int flags [, int offset]] )
subject を検索し、 pattern に指定した正規表現にマッチした すべての文字列を、flags で指定した 順番で、matches に代入します。

正規表現にマッチすると、そのマッチした文字列の後から 検索が続行されます。

マッチしたものを$matchesに代入。

$matchesの中身

Array
(
    [0] Array
    (
        [0] href="http://www.aaaa.co.jp"
        [1] href="http://www.bbbb.co.jp"
    )

    [1]  Array
    (
        [0] http://www.aaaa.co.jp
        [1] http://www.bbbb.co.jp
    )
)

$link[]を整形
implode( “\n”, $links );で合体
って、implodeって初めて知った。

Arrayを合体させるっぽい。その間は\nで繋ぐという感じかな。

string implode ( string glue, array pieces )
すべての配列要素の順序を変えずに、各要素間に
glue文字列をはさんで 1 つの文字列にして返します。

で、ちょいと改造

class links {

	var $civic;

	// コンストラクタ(インスタンス化された時に動く)
	//  Class名と同じFunction名
	function links(){
		$this->civic = 'シーフ';
	}

	function display( $arg ){
        echo $arg;
        if( !preg_match_all( "/href=\"([^\"]+)\"/iu", $arg, $matches ) ) return;
        $links = array( '<h4>Links</h4>', '<ul>' );
        foreach( $matches[1] as $href ) $links[] = "\t<li>{$href}</li>";
        $links[] = '</ul>';

        echo implode( $this->civic."\n", $links );
    }
}

// インスタンス化
$links = new links();
add_filter( 'the_content', array( $links, 'display' ),10 );

?>



コメント数:4

nic 09年04月04日

はじめまして!

preg_match_all( “/href=\”([^\"]+)\”/iu”, $arg, $matches ) のパターン文字列 “/href=\”([^\"]+)\”/iu” は 「 href=”(“以外の文字)”」を探しています。
最初と最後の方にあるスラッシュはデリミタといって、パターン文字列中のパターンとパターンの修飾子を区切る文字です。
/パターン/修飾子 というような。
パターン中には href=\”([^\"]+)\” とあり、ダブルクォーテーションの前には¥がありますが、これはエスケープといって「文字として以外の意味を持つ文字」の”意味”を打ち消す意味を持っています。
例えば PHP で文字を出力する際には echo “foo”; などと記述しますが、この中にダブルクォーテーションを含めたいなどの場合に利用します。 echo “f\”oo”; みたいな。
この「文字として以外の意味を持つ文字」を総称して「メタ文字」と表現しますが、これは「文字以外の意味が含まれた(メタファー)文字」という意味です。
メタ文字はその対象によって様々ですが、PCRE 関数(preg_match など)のメタ文字であれば http://www.php.net/manual/ja/regexp.reference.php 辺りをごらん頂ければ全て掲載されています。
このメタ文字が表現する文字以外の意味を利用したくない(文字そのものとして利用したい)場合に¥を使ってそのメタ文字に含まれるメタファーを打ち消す、という事になります。

パターンにある括弧は「括弧の中としてマッチングされた文字列を第三引数に格納する」という意味を持っています。
つまり href=”ここ” の「ここ」にマッチングした文字列を $matches に格納しているわけですね。
括弧内にある [^\"] は文字クラスといって [ から ] までに記述された文字をワンセットにして以降のパターンによってそれの連続性を表現するパターンの集合です。
例えば [a-z] では「aからzまでの文字」と言う意味になります。文字クラス内の最初に出てくる ^ は「それ以外」という意味ですので [^\"] は「ダブルクォーテーション以外の文字」となります。
文字クラスの後にある + は「その前にある文字クラスが1文字以上続く」という意味で、これが例えば * だと「0文字以上続く」という意味になり ? だと「0文字か1文字」と言う意味になります。
[a-z]+ は「aからzまでの文字が1文字以上続く」で [a-z]? ならば「aからzが0文字が1文字ある」であると言う感じです。
デリミタ(スラッシュ)の後にある i は「大文字と小文字を区別しない」と言うルールを意味し、u は「ユニコード文字である事を考慮する」という意味になります。
Wordpress の場合文字コードは UTF-8 に限定されており、その仕組み上パーマリンクに日本語が含まれる場合があります。そのようなケースを考慮して u を含めています。

上記をまとめると “/href=\”([^\"]+)\”/iu” は href=”" の中にある「ダブルクォーテーションになるまでの文字」を大文字小文字を区別せず、ユニコードを考慮して $matches に格納していく。という意味になります。
また、preg_match_all() の場合は渡された文字列中にマッチングした全ての文字列を返しますので、渡された文字列の中に複数の href=”" があればそれら全てが $matches に格納されます。
$matches への格納にはルールがありますが、それは「$matches[0] にマッチングされた全ての文字列が格納され、$matches[1]には括弧内にマッチングした文字列が格納される」と言うものであり、正規表現で「見つけたい文字列の前後にある文字を使ってマッチングする」という様な場合に「見つけたい文字列の前後の文字」を「見つけたい文字列」と区別する意味を持ちます。
“/href=\”([^\"]+)\”/iu” でいうと href=”http://example.com” 全体が $matches[0] に格納され、http://example.com が $matches[1] に格納される事になります。

正規表現はぱっと見複雑でとっつきにくく感じますが、本当に複雑な正規表現は実際それほど多くはありません。正規表現自体様々な場面で数多く使われる技術であり、プログラム言語に依存しない独自のルールを持っているため利用されている言語を理解せずとも正規表現さえ理解していれば何をしようとしているのかが大体分かって便利です。

頑張って下さい!

ヤスヲ 09年04月05日

「ぱっと見複雑でとっつきにくく」
そうなんですT-T
とっつきにくく・・。
本当にコメントありがとうございます!
精進します^ー^。

ヤスヲ 09年04月05日

wordPressのプラグイン作成にチャレンジしようと思えたのはnicさんのホームページのおかげです^ー^ありがとうございます。

ヤスヲ 09年10月21日

半年後やっと理解しました・・orz

wordPressプラグインのクラス化についてのコメントを書く
情報を保存しますか?

Trackbacks:0

トラックバックのURLはこちらです
http://www.ezo-style.com/2009/04/03/wordpress%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e5%8c%96/trackback/
Listed below are links to weblogs that reference
wordPressプラグインのクラス化 from エゾスタイル
文字サイズ: | |
Get Adobe Flash playerPlugin by wpburn.com wordpress themes