サポート » プラグイン » JSON 形式のフィードを出力するプラグインを作りたい

  • 解決済 mizube

    (@mizube)


    お世話になります。

    WordPress のデータを JavaScript 等で利用しやすくするため、JSON 形式でのフィード配信を実現するプラグインを作成してみようと思い立ったのですが、 WordPress の Rewrite API の機構がいまいち理解できずに頓挫しています。 rewrite ルールのカスタマイズに関して、詳しいノウハウや何らかの情報をお持ちの方がいらっしゃいましたらご教示頂ければ幸いです。

    具体的にやりたいことは、 JSON 形式の出力を WordPress におけるフィードの形式の一つとして取り扱う (各URL の末尾が /feed/json/ の場合 JSON 形式でフィードを出力) ということです。可能な限り WordPress の Rewrite API を上手く利用する方法を探しています。既存のプラグインに WP JSON というものがありますが、これはいかな URL であっても最新の投稿のフィードを配信してしまうので、機能として不足しています。また、強引なやり方であれば今でも JSON フィードを出力することは出来るのですが、 /wp-includes/rewrite.php を見る限り、よりスマートな方法がとれそうな気がしており、勉強のため、是非ともそっちでやりたい! というわけです。

    最初の段階でわけが分からなくなっている理由として、 rewrite ルールへのフックに対し空の値を返すような動作確認用のフィルタを作ってみたのですが、反映されていないように見える点があります。また、 add_feed() を試しに動かしてみると in_array() の第2引数でエラーが出てしまいます。コード一つ一つの挙動を確認しながら全容を掴もうとしてきた今までの私のやり方では、そもそもフィード形式を追加する手順さえうまく掴めない状況です。

    まずは正しい rewrite ルールのいじくり方から! お恥ずかしい限りですが、どなたかお知恵を貸して頂ければ幸いです。

    # 最終的には、このプラグインを、特定のカテゴリの JSON フィードから、 jQuery によってランダムな 1 件をピックアップし、一定時間ごとに内容が切り替わるポップアップ型のティッカーを作成することを支援するものとしたいです。が、この辺は自力で何とかなると思っています。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック投稿者 mizube

    (@mizube)

    うーん、バシバシ回答を頂けるトピックには何か法則があるのでしょうか? SEO ならぬ TO みたいな。
    それはさておき、あまり他の方の役には立たない情報かもしれませんが、出来るだけ自分でも進捗を記していこうと思います。

    しばらく手を付けていなかったのですが、今日あっさり理由が判明し、ほぼ解決しました。というか、 WordPress Codex 日本語版にそのものずばりの内容が記述されておりました! 感謝!

    パーマリンクの解析方法を変更するために、リライト・ルールの追加、修正、削除する。これはフィルターやアクションではなく、add_rewrite_rule、add_rewrite_endpointといったwp-includes/rewrite.php内の関数を呼び出すことで実現する。WP_Rewrite->wp_rewrite_rules()は基本的に以前保存されたリライト・ルールを利用するだけなので、少しトリッキーである(リライト・ルールはrewrite_rulresオプションとしてWordPressデータベースに保存されている)。もしリライト・ルールを修正したければ、$wp_rewrite->flush_rules()で再度解析させるようにしなくてはならない。これはプラグインのinitアクションを利用し、一連の処理の初期段階で起こす必要がある。

    この部分の理解が完全に抜け落ちていました:P

    問題は、 $wp_rewrite->flush_rules(); を呼び出すタイミング、一応希望通りの動作をするものの、使用しているフックがこれで本当に正しいのか、 add_feed() に渡す関数名が果たして do_feed_json でいいのか、そもそも自分のやり方で合っているのか etc.. 一切自信がありません。どなたか情報をお持ちでしたらご教授ください。

    テストコードは以下の通りです。

    <?php
    /*
    Plugin Name: Test of JSON Feed
    */
    
    function do_feed_json() {
    	die('JSON has come!');
    	// load_template( plugin_dir_path(__FILE__) . '/json-feed.php' );
    }
    
    function add_feed_json() {
    	add_feed( 'json', 'do_feed_json' );
    }
    
    function add_feed_json_once() {
    	global $wp_rewrite;
    	add_feed_json();
    	$wp_rewrite->flush_rules();
    }
    
    function remove_feed_json() {
    	global $wp_rewrite;
    	$feeds = array();
    	foreach ( $wp_rewrite->feeds as $feed ) {
    		if ( $feed == 'json' ) continue;
    		$feeds[] = $feed;
    	}
    	$wp_rewrite->feeds = $feeds;
    	$wp_rewrite->flush_rules();
    }
    
    $plugin_basename = plugin_basename(__FILE__);
    
    add_action( 'init', 'add_feed_json' );
    add_action( 'activate_' . $plugin_basename, 'add_feed_json_once' );
    add_action( 'deactivate_' . $plugin_basename, 'remove_feed_json' );
    ?>

    # ところで Codex のアクションフック一覧「activate_プラグインのファイル名」の項の説明、確認したところ対訳としては (たぶん) 正確なのですが、「プラグインを初めて有効化する際」というところにはまりそうです。このフックは、要するにプラグインを有効化する操作をした際に実行されるもので、「プラグインを初めて有効化する際」一度きりではありませんでした。一度プラグインを無効にして、再度有効化した際にも実行されているようです (私としては、そういう挙動を望んでいたわけですが)。出来ればそのように訳注を付して頂けるとありがたいなぁ、なんて。

    トピック投稿者 mizube

    (@mizube)

    8ヶ月経っていますので、一旦解決済みとさせて頂きます。

    今更なんですが、jSOB API プラグインが有りました。

    http://wordpress.org/extend/plugins/json-api/

    トピック投稿者 mizube

    (@mizube)

    情報ありがとうございます。これは使い勝手が良さそうですね。
    テスト導入してみて、自作のものから切り替えを検討してみます。

    結構使いやすかったです!WordPress > JSON API > jQuery Mobile で作ってみました。

    http://jqm.turutosiya.com/

    本体

    http://blog.turutosiya.com/

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「JSON 形式のフィードを出力するプラグインを作りたい」には新たに返信することはできません。