プラグイン

の記事

  • WP-Furigana ふりがなを自動入力するプラグイン

    wp-furigana投稿画面で、ふりがなを自動入力するプラグインを作成した。
    個人ブログ「お菓子の虜」で、お菓子名のふりがなをカスタムフィールドに手入力する手間を、なんとか軽減できないかと思っていたのを実現したものだ。以前はお菓子データをAccessで管理していたため、ふりがなの機能が付いていたのだ。
    さて今回のプラグインでは、投稿タイトルを入力しフォーカス移動した際にふりがなが空白であれば、自動的に設定するようにした。カスタムフィールドを使っているので、手修正も可能だ。すでに何かしら入力されている場合はなにもしない。
    誰もが欲しい機能ではないものの、本人としてはまずまずの使い心地である。

    ふりがなを取得するには、Yahoo! JAPANが提供している「日本語形態素解析」というWeb APIを利用した。プラグインを使う際にYahoo! JAPANのアプリケーション IDを取得し、設定画面から登録する必要がある。

    プラグインを初めて公開するということで、PoEditを使いながら翻訳処理もやってみた。
    ダウンロード:WP-Furigana ふりがなを自動入力するプラグイン

  • プラグインの管理画面をカスタマイズ

    setting以前メモしたことのある、ダッシュボードにメニューを追加する方法の詳細。

    プラグインに設定画面を追加するには、admin_menuというアクションフックを利用する。add_options_page()でダッシュボードのサイドメニューに項目を追加し、コールバック関数で設定画面を表示する。
    設定画面はパラメータを入力するためのフォームとなる。フォームのactionに自分自身のURLを設定しておく。submitされた際にはパラメータがPOSTされてくるので、その場合の処理を入れておく。受け取ったパラメータをupdate_option()で、保存すればよい。すでにパラメータが保存されている場合はget_option()で取得することができるので、それをフォーム内のvalueとして表示する。

    さらにplugin_action_linksというフィルタを利用すると、プラグインの管理に”設定”メニューを追加することができる。”設定”がクリックされた場合の処理は、上記のコールバック関数になる。こちらはあってもなくてもよいわりには苦戦した。

    [sourcecode language=’php’]
    add_action(‘admin_menu’, ‘add_config_page’);

    function add_config_page(){

    add_options_page(‘MyPlugin’, ‘MyPlugin’, 10, basename(__FILE__), ‘config_page’);
    add_filter( ‘plugin_action_links’, ‘filter_plugin_actions’, 10, 2 );
    }

    function filter_plugin_actions( $links, $file ){

    static $this_plugin;
    if ( ! $this_plugin ) $this_plugin = plugin_basename(__FILE__);

    if ( $file == $this_plugin ){
    $settings_link = ‘Settings‘;
    array_unshift( $links, $settings_link );
    }
    return $links;
    }

    function config_page(){

    $my_param = ”;

    if( isset( $_POST[‘submit’] ) && isset( $_POST[“my_param”] )){
    $my_param = $_POST[“my_param”];
    update_option( “my_param”, $my_param);
    }
    else{
    $my_param = get_option(“my_param”);
    }

    ?>

    My Plugin


    管理メニューの追加 – WordPress Codex 日本語版

  • 投稿編集の一覧をカスタマイズ

    管理画面の投稿編集の一覧に表示されるのは、通常[タイトル][作成者][カテゴリー][タグ][コメント数][日付]となっている。ここに項目を追加することができる。
    以下は、右端の列に添付画像の1枚目のサムネイルを表示している。

    [sourcecode language=’php’]

    function my_post_column($columns) {
    $columns[‘thumbnail’] = ‘添付画像’;
    return $columns;
    }

    function my_custom_column($column, $id){

    if($column == ‘thumbnail’){

    $attachments = get_children(array(‘post_parent’ => $id, ‘post_type’ => ‘attachment’, ‘post_mime_type’ => ‘image’, ‘orderby’ => ‘menu_order’, ‘showposts’ => ‘1’));
    if (is_array($attachments) ){
    foreach($attachments as $attachment){
    $thumbnail = wp_get_attachment_thumb_url(intval($attachment->ID), “thumbnail”);
    echo ‘' .$id .'‘;
    }
    }
    }
    }

    add_filter(‘manage_posts_columns’, ‘my_post_column’);
    add_action(‘manage_posts_custom_column’, ‘my_custom_column’, 10, 2);

    [/sourcecode]

    フォトログなどでは、こうしておくと便利だ。

  • WordPressでweb API

    WordPress に web API インターフェースを追加するプラグインを使ってみた。

    WordPressのカテゴリ一覧ページでは、デフォルトで10件づつ表示してページネーションを使う方法が一般的だ。このほどクライアントより、一覧の下に「もっと見る」のようなリンクを用意して、クリックされると同一ページの下にバックナンバーのタイトル一覧を表示して欲しいとの要望があった。
    1ページに表示する件数をquery_posts()で増やして、JavaScriptでバックナンバーの部分を表示・非表示すればよいかとも思ったものの、初期表示に時間がかかってしまうし、「もっと見る」がクリックされない場合は無駄だ。Ajaxでタイトルを10件づつ取得して、順に表示できればよいな、と思い投稿データをWeb API的に取得できないものかと調べた。そこで見つけたのが「Wordpress に web API インターフェースを追加するプラグイン」である。

    プラグインを追加するとAPI キーを設定することができる。このAPIキーと、アクション(関数)に割り当てたキーとの組み合わせによって、認証を行うようになっている。認証がOKだとアクション名のショートコードが生成、実行されるようだ。アクションはサンプルがいくつか用意されているので、参考にしながら自分で追加することができる。jsonやXMLでのレスポンスが可能だ。
    このインタフェースを利用して作成したWeb APIをJavaScriptから呼ぶには、ブログのURL、アクション、APIキー+アクションのキーをAjaxでPOSTする。アクションに関するパラメータを追加することもできる。
    思ってたとおりのものができた!

    参考:WordPress に web API インターフェースを追加するプラグイン

  • DBに連想配列を保存するには

    DBテーブルのwp_optionsやwp_postmetaに配列っぽいデータが保存されているのを見ることがある。たとえば wp_postmetaでは_”wp_attachment_metadata”というキーに”a:5:{s:5:”width”;s:3:”145″;s:6:”height”;s:2:”74″;s:14:”hwstring_small”;s:23:”height=’65’ width=’128′”;s:4:”file”;s:35:”2010/…”というようなデータが保存されている。画象を添付した際のパスやサイズなどのメタデータである。

    この形式を自分でも利用することができる。
    例えばwp_optionsに保存するには、
    INSERT INTO wp_options(option_id, blog_id, option_name, option_value, autoload) VALUES(null, 0, ‘my_messages’, maybe_serialize( $messages ), ‘yes’)
    というようなSQLを実行すればよい。連想配列$messagesをシリアライズしたものをoption_valueにセットする。maybe_serialize()は、WordPressの関数である。

    このデータを取得するには、SQLでSELECTして得た値を、
    $messages = maybe_unserialize($result->option_value);
    とすることで連想配列にセットされる。

    ちょっとした情報を保存したいならプラグイン用にテーブルを作成するのではなく、 wp_optionsに保存する手段もあるのだ。Contact Form 7 のコードを見てて、この仕組みがやっと分かった。

  • Contact Form 7 でユーザーエージェント

    WordPressを使う人なら誰もが知ってる「Contact Form 7」はお問い合わせフォームを設置するのにかかせないプラグインだ。カスタマイズ性の良さとAjaxの動作がいい。

    この「Contact Form 7」を使ったお問い合わせの際に、ユーザが使っている環境が知りたいとの要望があった。Webサービスに関する問い合わせでは、ユーザがどのOSでどんなブラウザが使っているかが手がかりになる。問い合わせをしてくるユーザに限ってそれを把握していないことが多いため、自動で送って欲しいということだ。
    「Contact Form 7」では、IPアドレスを取得する [_remote_ip]というタグは用意されているものの、ユーザーエージェントは用意されていない。「Contact Form 7」に用意されている”wpcf7_special_mail_tags”というフィルタを使ってタグを追加することができる。追加するには、テーマのfunctions.phpにショートコードとして記述するとよい。
    [sourcecode language=’php’]
    add_filter(‘wpcf7_special_mail_tags’, ‘my_special_mail_tags’,10,2);

    function my_special_mail_tags($output, $name)
    {
    if(!isset($re_agent)){ $re_agent = $_SERVER[‘HTTP_USER_AGENT’]; }
    if(‘my_user_agent’ == $name){ $output = $re_agent; }
    return $output;
    }
    [/sourcecode]

    これで、「Contact Form 7」のメッセージ本文で[my_user_agent]といタグを使えるようになる。$nameにタグ名が入ってくるので、タグ名で分岐するようにすればこの中で複数を設定することができる。

    WordPressフォーラムのContact Form 7 ホスト取得を参考にした。

  • タイムゾーンがずれる

    自作テーマで、時間に関連する部分に不具合がでた。WordPressを商用のCMSとして使っていて、イベントを表示するカレンダーで予約投稿の場合は「予定」と表示しておき、当日になったら「予定」が消えるというふうにしたかったのが、「予定」が消えるのが9時間遅くなるのだ。タイムゾーンの設定が変わってしまったのかと思ったけど、「UTC +9:00」になっているし投稿時間も正常だ。

    テーマで現在時刻を取得するのに
    date( ‘Y-m-d H:i:s’);
    とやっていたのを、WorsPressの関数を使って、
    current_time(mysql)
    としたら直った。

    WordPressの過去のバージョンで使ったことのあるコードを、バージョン2.9.2で流用したのが原因らしい。PHPの基本的な関数が使えなくなっていたとは、不便だ。もとからcurrent_time()を使うことが常識だったのかな?
    もっともこの場合は、「当日」の判断をpost_dateではなくて、post_statusで判断すれば良かったのだ。

  • 投稿内容を取得するget_post()

    get_post()は投稿内容を取得する関数だ。投稿番号を指定することでsb_3_postsの内容が配列で返る。特定の記事を表示したい場合などに利用することができる。
    パラメータには、数字ではなく参照値を指定しなくてはならない。
    つまりget_post(投稿番号)ではなくて、

    [sourcecode language=’php’]
    $id=投稿番号;
    get_post($id)
    [/sourcecode]
    とする。
    はまった!

  • プラグイン用のテーブルを作成するには

    WordPressをインストールする際にMySQLに作成されるテーブルのほかに、自作プラグインでもテーブルを作成することができる。アクションフックのregister_activation_hookを定義しておくとプラグインが有効になった際に関数が呼ばれるので、ここでテーブルを作成する。テーブル名にはWordPressの接頭辞を使用すること。
    以下は、wp_sampleというテーブルを作成する例。

    [sourcecode language=’php’]
    function myActivation() {

    global $wpdb;

    $table_name = $wpdb->prefix . “sample”;
    if($wpdb->get_var(“show tables like ‘$table_name’”) != $table_name) {

    $sql = “create table ” .$table_name .” (
    ID bigint not null auto_increment,
    name varchar(64) NOT NULL,
    furigana varchar(64) default NULL,
    url varchar(64) default NULL,
    primary key(ID)
    )”;

    $results = $wpdb->query($sql);
    }
    }

    register_activation_hook(__FILE__, ‘myActivation’);
    [/sourcecode]

    プラグインが無効化された際の処理は以下を使用する。
    [sourcecode language=’php’]
    register_deactivation_hook(__FILE__, ‘myDeactivation_’);
    [/sourcecode]

  • ショートコードの作りかた

    ショートコードとは、記事中に記述することで実行させるプラグインのことだ。有名なショートコードのプラグインに、ソースコードを表示するためにここでも使っている「SyntaxHighlighter Plus」がある。

    ショートコードは以下のように記事中に記述する。
    [hello color=”red”]ほにゃらら[/hello]

    プラグインでは、add_shortcodeで定義した関数を用意する。下の例では、赤い文字で”ほにゃらら”と表示する。この場合の出力はechoではなく、returnとすることに注意したい。
    $attsの引数で、属性値を受け取ることもできる。

    [sourcecode language=’php’]
    function showhello($atts, $content) {
    extract( shortcode_atts( array(‘color’ => ”), $atts ));
    return ‘

    ‘ .$content .’

    ‘;
    }

    add_shortcode(‘hello’, ‘showhello’);
    [/sourcecode]

    ショートコードは記事中だけでなく、テーマで使用することもできる。テーマで使用する場合は、 do_shortcode()を使う。
    [sourcecode language=’php’]

    [/sourcecode]