wordpress 本体コード応用術
DESCRIPTION
WordPress のサイトに新しい機能を導入したいとき、独自にコードを書き出すのではなく、最初に WordPress 本体 (Core) 内のコードで再利用できるものを探す、というアイデアを提案します。TRANSCRIPT
![Page 1: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/1.jpg)
WordPress本体コード応用術WordPress 研究会 @ 下北沢 OSS Cafe, 2011-08
みっちょ (アーリーワイン・マイケル芳貴)
mitcho.com @themitcho slideshare.net/mitcho
![Page 2: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/2.jpg)
どうも。みっちょです。
![Page 3: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/3.jpg)
新機能を一から作らないでWordPress 本体内のコードを再利用しよう
![Page 4: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/4.jpg)
抽象化を使用しよう
• DB クエリ: mysql_* じゃなくて $wpdb• キャッシュ: DB じゃなくて Object Cache、
Transients• 環境設定: DB じゃなくて set_option()• 投稿抽出: SQL じゃなくて get_posts()
• HTTP 通信: curl じゃなくて wp_remote_post()
![Page 5: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/5.jpg)
コードをより WordPress っぽく
![Page 6: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/6.jpg)
コードを読めば公開 API 以外も応用できる
![Page 7: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/7.jpg)
実例その1*_meta
![Page 8: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/8.jpg)
投稿、ユーザは meta が着く
問題:taxonomy、コメントにも meta が欲しい...
![Page 9: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/9.jpg)
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);}
実は...
裏で同じ関数を使用
![Page 10: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/10.jpg)
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)
![Page 11: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/11.jpg)
Taxonomy Metadatawordpress.org/extend/plugins/taxonomy-metadata
![Page 12: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/12.jpg)
後は UI を足せばいいだけ
![Page 13: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/13.jpg)
実例その2pub/sub
![Page 14: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/14.jpg)
WordPress 3.2 で集中執筆モードが導入された
問題:集中しすぎちゃう...
![Page 16: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/16.jpg)
新問題:集中執筆モードと同時に作動したい
JavaScript では action/filter が(今の所)ない。
![Page 17: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/17.jpg)
(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. });
});
![Page 18: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/18.jpg)
/** * 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 版!
![Page 19: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/19.jpg)
(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. });
...
var PubSub, fullscreen, wptitlehint;
fullscreen は window のオブジェクトなのでアクセス可fullscreen.pubsub.subscribe で自分の関数を登録...
![Page 20: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/20.jpg)
動いたニャン。
![Page 21: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/21.jpg)
デモwordpress.org/extend/plugins/nyan-cat/
![Page 22: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/22.jpg)
実例その3Query/River
![Page 23: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/23.jpg)
WordPress で使える Quicksilver が欲しい
問題:検索 API を作りたくない
![Page 24: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/24.jpg)
そういえば...
![Page 25: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/25.jpg)
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 からアクセス出来ない (涙)
![Page 26: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/26.jpg)
![Page 27: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/27.jpg)
デモこのプラグインは現在コアパッチも
必要なので未公開 :(
![Page 28: WordPress 本体コード応用術](https://reader034.vdocuments.mx/reader034/viewer/2022051411/547e41bcb4af9fc53a8b48fc/html5/thumbnails/28.jpg)
ご清聴ありがとうございます
みっちょ (アーリーワイン・マイケル芳貴)
mitcho.com @themitcho slideshare.net/mitcho