WordPress 本体コード応用術

2,038 views

Published on

WordPress のサイトに新しい機能を導入したいとき、独自にコードを書き出すのではなく、最初に WordPress 本体 (Core) 内のコードで再利用できるものを探す、というアイデアを提案します。

Published in: Technology

WordPress 本体コード応用術

  1. 1. WordPress本体コード応用術WordPress 研究会 @ 下北沢 OSS Cafe, 2011-08みっちょ (アーリーワイン・マイケル 貴)mitcho.com @themitcho slideshare.net/mitcho
  2. 2. どうも。みっちょです。
  3. 3. 新機能を一から作らないでWordPress 本体内のコードを再利用しよう
  4. 4. 象化を使用しよう• DB クエリ: mysql_* じゃなくて $wpdb• キャッシュ: DB じゃなくて Object Cache、 Transients• 環境設定: DB じゃなくて set_option()• 投稿 出: SQL じゃなくて get_posts()• HTTP 通信: curl じゃなくて wp_remote_post()
  5. 5. コードをより WordPress っぽく
  6. 6. コードを読めば公開 API 以外も応用できる
  7. 7. 実例その1*_meta
  8. 8. 投稿、ユーザは meta が着く問題:taxonomy、コメントにも meta が欲しい...
  9. 9. 実は...function add_user_meta($user_id, $meta_key, $meta_value, $unique = false) { return add_metadata(user, $user_id, $meta_key, $meta_value, $unique);}function add_post_meta($post_id, $meta_key, $meta_value, $unique = false) { // make sure meta is added to the post, not a revision if ( $the_post = wp_is_post_revision($post_id) ) $post_id = $the_post; return add_metadata(post, $post_id, $meta_key, $meta_value, $unique);}裏で同じ関数を使用
  10. 10. function add_metadata($meta_type, $object_id, $meta_key, $meta_value, $unique = false) { if ( ! $table = _get_meta_table($meta_type) ) return false; ... $result = $wpdb->insert( $table, array( $column => $object_id, meta_key => $meta_key, meta_value => $meta_value ) ); ... } function _get_meta_table($type) { global $wpdb; $table_name = $type . meta; if ( empty($wpdb->$table_name) ) return false; return $wpdb->$table_name; }$wpdb->... にテーブル名を入れておけば使える($wpdb->{table} が指定される時: init & switch_blog)
  11. 11. Taxonomy Metadatawordpress.org/extend/plugins/taxonomy-metadata
  12. 12. 後は UI を足せばいいだけ
  13. 13. 実例その2pub/sub
  14. 14. WordPress 3.2 で集中執筆モードが導入された 問題:集中しすぎちゃう...
  15. 15. こいつを入れよう! http://nyan.cat
  16. 16. 新問題:集中執筆モードと同時に作動したい JavaScript では action/filter が (今の所)ない。
  17. 17. (function($){ var api, ps, bounder, s; // Initialize the fullscreen/api object fullscreen = api = {}; // Create the PubSub (publish/subscribe) interface. ps = api.pubsub = new PubSub(); ps.subscribe( showing, function() { // This event occurs while the DFW overlay blocks the UI. }); ps.subscribe( hidden, function() { // This event occurs after DFW is removed. });});
  18. 18. /** * PubSub * * A lightweight publish/subscribe implementation. * Private use only! */var PubSub, fullscreen, wptitlehint;PubSub = function() { this.topics = {};};PubSub.prototype.subscribe = function( topic, callback ) {};PubSub.prototype.publish = function( topic, args ) {};非公開 API 発見。これぞ action の JavaScript 版!
  19. 19. var PubSub, fullscreen, wptitlehint;(function($){ var api, ps, bounder, s; // Initialize the fullscreen/api object fullscreen = api = {}; // Create the PubSub (publish/subscribe) interface. ps = api.pubsub = new PubSub(); ps.subscribe( showing, function() { // This event occurs while the DFW overlay blocks the UI. });...fullscreen は window のオブジェクトなのでアクセス可fullscreen.pubsub.subscribe で自分の関数を登録...
  20. 20. 動いたニャン。
  21. 21. デモwordpress.org/extend/plugins/nyan-cat/
  22. 22. 実例その3Query/River
  23. 23. WordPress で使える Quicksilver が欲しい 問題:検索 API を作りたくない
  24. 24. そういえば...
  25. 25. var wpLink; (function($){ var inputs = {}, rivers = {}, ed, River, Query; wpLink = { } River = function( element, search ) { }; $.extend( River.prototype, { }); Query = function( search ) { }; $.extend( Query.prototype, { }); })(jQuery);River と Query は window からアクセス出来ない ( )
  26. 26. デモこのプラグインは現在コアパッチも 必要なので未公開 :(
  27. 27. ご清聴ありがとうございますみっちょ (アーリーワイン・マイケル 貴)mitcho.com @themitcho slideshare.net/mitcho

×