inlinephp プラグインを利用する
時として、php スクリプトを直接実行させたい要求が生じる場合があります。もちろん、手元のPCで編集し、サイトにアップロードして、そのURLを直接叩くというやり方もあるでしょう。ただ、当該サイト上で編集し、またコンテンツとして関係性を持たせようと思うと、Flatpress 内の記事扱いにできれば、それはかなり便利になってきます。
プラグインを利用してみる
php が動作している環境一覧を表示させる関数に phpinfo() という見慣れたものがあります。これを実行させたい場合には、記事内容として、タグを利用して下記を入力します。
[exec] phpinfo(); [/exec]
これを入力した記事のページです。
では、実際にこの記事を表示させてみると、このようになります。サンプルなので、ここでは表示サイズを気にしてません。また、ロゴとメニューの背景色が奇妙になっている理由ですが、inlinephp のコンテンツ自体に css 要素が含まれているための影響です。
ダウンロードはここからできます。
http://wiki.flatpress.org/res:plugins (プラグイン関連ページ)
http://wiki.flatpress.org/_media/res:plugins:stanley:inlinephp_1.0.zip(ダウンロード)
fp-plugins/ の下に解凍して設置します。
インストール手順として、いつものようにイネーブル設定を行っておきます。
注意点
ここでの php スクリプトは一旦解釈([exec]などの除去)されてから include されて実行される点の注意してください。恐らく、この記事内で画像を生成させて、その画像(例えばjpg形式のグラフとか)を表示させることは困難だと想像しています。
サイトマップのプラグインを利用する。
Plugin を調べてみると DynamicSitemap というプラグインが見ります。ただし、直接のリンクは切れてますが間接的にはダウンロー情報があります。例えば、ここ(DynamicSiteMap)です。(本サイトにもコピー を取ってあります)
通常の手順でインストールしてアクティベイトして利用してみたところを下に示します。非常にシンプルにサイトコンテンツが一覧表示されます。
インストールの状況
例によってインストールしたならば、アクティベートをしておきます。サイトマップの作成は、ブログ形式でも都合に合わせておけばよいでしょう。また、目的に合わせて複数のサイトマップを用意するのも便利かも知れません。
BBCode の書き方
以下の書式でサイトマップの表現を指定します。
- [dynamicsitemap include="カテゴリ名、カテゴリ名" exclude="カテゴリ名"]
- カテゴリ名は[カテゴリ]で作成した名前で include で指定します。fp-content/content/categories.txt に記憶されている内容です。
- カテゴリ名を複数利用する場合にはカンマで区切ります。include を省略するとすべてが対象とされます。
- 対象から外すカテゴリ名は exclude で指定します。
- 上記サンプルでは「ジャーナル」カテゴリが極めて大量なので、[dynamicsitemap exclude="ジャーナル"]という指定をしています。
動作の不具合について
PHPのバージョンによってはエラーが表示されると思います。http://www.xserver.ne.jp/での実験では、PHP5.1.6では問題ないですが、PHP5.3.5 に設定すると下記のようなエラーが表示されました。
Warning: Parameter 5 to plugin_dynamicsitemap_callback() expected to be a reference, value given in /home/azland/flatpress.at/public_html/C/fp-plugins/bbcode/inc/stringparser_bbcode.class.php on line 1919
これは、PHPのバージョンアップに従って、「関数への参照渡しができないようになった」ためのようです。興味のある方は、このあたり(PHP5.3から移行しないと起こるかもしれないトラブル)をご覧ください。また、フォーラムでも話題になってました。
php.ini の設定や .htaccess での設定でエラー表示をさせないことも可能と思ったのですが、エラーより致命的なようで警告ではなくてエラー処理として動作しません。なので、php.ini でエラー表示を停止していると BBCode のソースが表示されるのみとなりました。(下のプレビューを参照)
対応手順
ソースコードをほんのチョコっと変えればよいようです。次に示すように"&$"から"&"を取り去るだけの修正を行います。この方法でよいかどうかの判断は、この記事を拠り所にしました。
あと,これは,こういったPHPの仕様は,それはそれでOK,という前提で,その上で,それを使う方の人に言いたい話.
オブジェクトを渡した場合,&をつけなくても参照渡しになるので,&にする必要がありません.もう過ぎ去った時代*3に縛られてオブジェクトを引数にとる関数に & つけるのやめてください.
fp-plugins/dynamicsitemap/plugin.dynamicsitemap.php
// flatpress.info //function plugin_dynamicsitemap_callback($action, $attributes, $content, $params, &$node_object) { function plugin_dynamicsitemap_callback($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { // not used for now return true; } global $fpdb; global $post; $current_post = $post;
参照渡しの引数を array に変換して中身を確かめてみると、$node_object は当該プログラムの中身をごっそり引き渡しているようです。
<何が引き渡されているか表示させてみた>
function plugin_dynamicsitemap_callback($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { // not used for now return true; } echo func_num_args(); echo ":"; echo $action; echo ":"; var_dump( $attributes ); echo ":"; echo $content; echo ":"; var_dump( $params ); echo ":"; var_dump((array)$node_object); echo ":";
<表示された内容>
5:output:array(0) { } ::array(1) { ["usecontent_param"]=> array(2) { [0]=> string(7) "include" [1]=> string(7) "exclude" } } :array(11) { ["_type"]=> int(32) ["_name"]=> string(14) "dynamicsitemap" ["_flags"]=> array(5) { ["closetag"]=> int(-1) ["opentag.before.newline"]=> int(2) ["opentag.after.newline"]=> int(2) ["closetag.before.newline"]=> int(2) ["closetag.after.newline"]=> int(2) } ["_attributes"]=> array(0) { } ["_hadCloseTag"]=> bool(false) ["_paragraphHandled"]=> bool(false) ["_id"]=> int(1) ["_parent"]=> object(StringParser_Node_Root)#13 (5) { ["_type"]=> int(1) ["_id"]=> int(0) ["_parent"]=> NULL ["_children"]=> array(2) { [0]=> &object(StringParser_BBCode_Node_Element)#15 (11) { ["_type"]=> int(32) ["_name"]=> string(14) "dynamicsitemap" ["_flags"]=> array(5) { ["closetag"]=> int(-1) ["opentag.before.newline"]=> int(2) ["opentag.after.newline"]=> int(2) ["closetag.before.newline"]=> int(2) ["closetag.after.newline"]=> int(2) } ["_attributes"]=> array(0) { } ["_hadCloseTag"]=> bool(false) ["_paragraphHandled"]=> bool(false) ["_id"]=> int(1) ["_parent"]=> *RECURSION* ["_children"]=> array(0) { } ["occurredAt"]=> int(0) ["_codeInfo"]=> array(8) { ["name"]=> string(14) "dynamicsitemap" ["callback_type"]=> string(23) "callback_replace_single" ["callback_func"]=> string(30) "plugin_dynamicsitemap_callback" ["callback_params"]=> array(1) { ["usecontent_param"]=> array(2) { [0]=> string(7) "include" [1]=> string(7) "exclude" } } ["content_type"]=> string(5) "block" ["allowed_within"]=> array(3) { [0]=> string(8) "listitem" [1]=> string(5) "block" [2]=> string(6) "inline" } ["not_allowed_within"]=> array(0) { } ["flags"]=> array(5) { ["closetag"]=> int(-1) ["opentag.before.newline"]=> int(2) ["opentag.after.newline"]=> int(2) ["closetag.before.newline"]=> int(2) ["closetag.after.newline"]=> int(2) } } } [1]=> object(StringParser_Node_Text)#16 (7) { ["_type"]=> int(2) ["_flags"]=> array(0) { } ["content"]=> string(5) " " ["_id"]=> int(2) ["_parent"]=> *RECURSION* ["_children"]=> array(0) { } ["occurredAt"]=> int(-1) } } ["occurredAt"]=> int(-1) } ["_children"]=> array(0) { } ["occurredAt"]=> int(0) ["_codeInfo"]=> array(8) { ["name"]=> string(14) "dynamicsitemap" ["callback_type"]=> string(23) "callback_replace_single" ["callback_func"]=> string(30) "plugin_dynamicsitemap_callback" ["callback_params"]=> array(1) { ["usecontent_param"]=> array(2) { [0]=> string(7) "include" [1]=> string(7) "exclude" } } ["content_type"]=> string(5) "block" ["allowed_within"]=> array(3) { [0]=> string(8) "listitem" [1]=> string(5) "block" [2]=> string(6) "inline" } ["not_allowed_within"]=> array(0) { } ["flags"]=> array(5) { ["closetag"]=> int(-1) ["opentag.before.newline"]=> int(2) ["opentag.after.newline"]=> int(2) ["closetag.before.newline"]=> int(2) ["closetag.after.newline"]=> int(2) } } } :
これらのことから、$node_object そのものを取り去ってパラメータを4っにしちゃう方法もありでしょうかね。
編集画面を便利に操作する
ブログ(ジャーナル)としても、また備忘録としても活用頻度が多くなってくると、操作感に不満を覚える段階となることがあると思います。現状の FlatPress においては、入力(編集)画面で保存をしようとすると、その保存ボタンが画面下に隠れていることがよくあります。まずは、このボタンの位置を調整するか、あるいは別途追加して便利に操作したく考えるようになりました。
そこでプラグインの習熟を兼ねて制作することにしました。早速、効果が確認できる画面からお見せいたします。この効果の特徴は二つで、一つは保存ボタン系が押しやすい位置に追加されています。もう一つは、「題名」と「内容」という分かりきった項目名の表示を消して編集画面をすっきりとさせるとともに、保存ボタンのスペースを確保しています。
もともとの状況は皆さんもよくご存じなことですが、これを再掲してからプラグイン設定を説明します。
美人時計プラグインの詳細説明
このプラグインを作成するにあたり、既存プラグインのソースを参考に、またネット上に多数存在する WordPress の「プラグインの作り方」を参考にしました。言語ファイル(説明文に相当する)とスタイルファイルのディレクトリの位置については、解凍したソースをご覧ください。この位置構成は既存プラグインを参考に、同様の配置になっています。
- function plugin_bijinclock_widget() {} 部分が、ウィジェットとして登録されます。
- if (class_exists('AdminPanelAction')){ 以降は、デフォルトとして"tokyo"を設定値に保存し、内部変数を用意して入力(クリック)」された変更値を保存(かつ、確認)している部分です。
- 冒頭のコメント行については必須であって、WordPress の入門説明を参考にすれば意味が分かります。
ソースの全体
plugin.bijinclock.php
<?php /* Plugin Name: Bijin Clock Version: 1.0 Plugin URI: http://flatpress.info/ Type: Widget Description: "Bigin" clock FYI: http://www.bijint.com/en/ Author: Flatpress.info Author URI: http://flatpress.info */ function plugin_bijinclock_widget() { $lang = lang_load('plugin:bijinclock'); $widget = array(); $widget['subject'] = $lang['plugin']['bijinclock']['subject']; include 'drawbijinclock.php'; $h=plugin_geturl('bijinclock').'res/css/bijinclock.css'; echo '<link rel="stylesheet" type="text/css" href="'.$h."\" />\n"; return $widget; } register_widget('bijinclock', 'bijinclock', 'plugin_bijinclock_widget'); if (class_exists('AdminPanelAction')){ class admin_plugin_bijinclock extends AdminPanelAction { function setup() { $this->smarty->assign('admin_resource', "plugin:bijinclock/admin.plugin.bijinclock"); $bc_config = plugin_getoptions('bijinclock'); if(!$bc_config['localtime']) { $localtime = "tokyo"; plugin_addoption('bijinclock', 'localtime', $localtime); plugin_saveoptions('bijinclock'); } } function main() { $bc_config = plugin_getoptions('bijinclock'); $this->smarty->assign('bc_config', $bc_config); } function onsubmit() { if ($_POST['bc-localtime']){ $localtime = $_POST['bc-localtime']; plugin_addoption('bijinclock', 'localtime', $localtime); plugin_saveoptions('bijinclock'); $this->smarty->assign('success', 1); } else { $this->smarty->assign('success', -1); } return 2; } } admin_addpanelaction('plugin', 'bijinclock', true); } ?>
描画ルーチン
drawbijinclock.php
「美人時計」の描画ルーチンは、同オリジナルサイトで指示される内容をコピーしたに過ぎません。ただ、「ローカル時計」の選択設定については、fp-content/config/settings.conf.php に保存しておいた値を利用しています。
<?php global $fp_config; $widget['content'] = ' <div id="bijin_clock"> <div class="bijin_blog_part" data-width="180" data-bcid="' . $fp_config['plugins']['bijinclock']['localtime'] . '"></div> <script type="text/javascript"> (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.async = true; js.src = "http://blogparts.bijint.com/blogparts/js/script.js"; fjs.parentNode.insertBefore(js, fjs); } (document, "script", "bijint-widget")); </script> </div>'; ?>
スタイルファイル
スタイルファイルは、表示される「美人時計」の位置合わせのために用意しました。ご存じのように FireBug(Firefox)を利用するのが便利なところですね。
bijinclock.css
#column #bijin_clock { height: 260px; margin: 0px; } #column #bijin_clock p, #column #bijin_clock div { margin: 0px; } #column #widget-bijinclock { margin-top: 0px; } #widget-bijinclock h4 { display:none; }
言語ファイル(説明文)
lang.ja-jp.php
言語ファイルの設定値において、「ローカル時計」の選択の説明をしています。また、プラグインの表示名もここで設定しています。
<?php $lang['admin']['plugin']['bijinclock'] = array( 'discription' => 'ローカル美人時計', 'area' => ' 2011全国(2011jp)<br> 北海道(hokkaido)<br> 青森(aomori)<br> 岩手(iwate)<br> 宮城(sendai)<br> 秋田(akita)<br> 茨城(ibaraki)<br> 栃木(tochigi)<br> 群馬(gunma)<br> 埼玉(saitama)<br> 千葉(chiba)<br> 東京(tokyo)<br> 神奈川(kanagawa)<br> 新潟(niigata)<br> 金沢(kanazawa)<br> 福井(fukui)<br> 長野(nagano)<br> 静岡(shizuoka)<br> 愛知(nagoya)<br> 京都(kyoto)<br> 大阪(osaka)<br> 神戸(kobe)<br> 奈良(nara)<br> 岡山(okayama)<br> 広島(hiroshima)<br> 山口(yamaguchi)<br> 香川(kagawa)<br> 福岡(fukuoka)<br> 佐賀(saga)<br> 長崎(nagasaki)<br> 熊本(kumamoto)<br> 鹿児島(kagoshima)<br> 沖縄(okinawa)<br> Thai(thailand)<br> テレビ朝日(tv-asahi)<br> 美魔女(bimajo)<br> サーキット(cc)<br> 花嫁(hanayome)<br> キッズ(kids)<br>', 'submit' => 'Save', 'msgs' => array( 1 => 'successful saved.', -1 => 'not saved.' ) ); $lang['plugin']['bijinclock'] = array( 'subject' => 'Bijin Clock', ); ?>
コンフィグレーションの様子
fp-content/config/settings.conf.php
設定値の保存はこのファイルに書き込まれます。以下に関係する部分を提示しましたが、
global $fp_config;
$fp_config['plugins']['bijinclock']['localtime']
として設定された内容を参照できます。
), 'bbcode' => array ( 'escape-html' => true, 'comments' => false, 'editor' => true, 'url-maxlen' => 40, ), 'bijinclock' => array ( 'localtime' => 'thailand', ), ), );