WordPressのショートコードは、フロントエンドで可変パラメータを渡してリアルタイムに動的コンテンツを生成できる便利な機能です。
そこで、Wordpressのショートコードでパラメータを与え、それを元にPythonプログラムを呼び出して、その結果をショートコードの出力にできたら利便性が上がると考え、試してみました。併せて、一連の処理をレンタルサーバのConoHa Wingで実現できそうだったので試してみました。
初めから結果
ConoHa Wingのサーバ上で動かしたWordpressで、独自のショートコードを作成し、その中でPythonプログラムを呼び出して、出力をショートコードに渡してWordpressからの出力ができました。その結果、ショートコードからPythonに自由にパラメータも渡せるので、Pythonプログラムではアルゴリズム開発に特化でき、Wordpress側では出力に特化できるので、表示に関してはWordpressの機能を全面的に用いることができ、大変楽です。
WordPressテーマとの親和性やレイアウトの自由度など、デザイナーとの分業が可能になります。
環境
- サーバ: ConoHa Wing(グレードはいろいろありますがどれでも大丈夫でしょう)
- サーバ環境:
- ConoHa Wing標準のWordpress環境
- ConoHa Wing標準の Python 3.6.11(2022/01/08現在)
Python側準備
ConoHaサーバのhomeディレクトリ以下に適当なディレクトリを作り、pyファイルを置きます。
今回は例として、
/home/xxxxx/yyyyy/python/test.py
とします。
test.py
import sys
args = sys.argv
index = 0
# output normal strings
print('Output by Python')
# output args
for arg in args:
print('args[' + str(index) + '] = ' + arg)
if index == 1:
amount = int(arg)
if index == 2:
price = int(arg)
index += 1
# output result calculation
print('calc: ', amount*price )
# for loop sample
for i in range(5):
print(i)
解説
- 引数を2個受け取り、数量と価格の変数に入れて、かけ算結果を出力する。
- サンプルとして、固定文字列と引数一覧、ループ処理の結果も出力した。
- コマンドラインから 以下のように打ち込み、Pythonレベルでエラーのないことを確認する。
コマンドプロンプトでの実行
python test.py 5 40
WordPress側での準備
functions.phpへの記載
functions.phpは使っているテーマフォルダの中にあります。
具体的には、以下の通り。ユーザー名、ドメイン名、テーマ名はそれぞれの環境に読み替えてください。
functions.phpの場所
/home/[ユーザー名]/public_html/[ドメイン名]/wp-content/themes/[テーマ名]/functions.php
子テーマを作って、子テーマのfunctions.phpを編集すると、テーマがアップデートされたときに泣かなくて済むので、子テーマは必須ですね。なので、上記のテーマ名のところは、子テーマ名にすると良いでしょう。
functions.php
function python_func( $atts ) {
$pythonexe = 'python ';
$pythonscriptpath = '/home/xxxxx/yyyyy/python/';
$pythonscript = 'test.py';
$atts = shortcode_atts(
array(
'amount' => '1',
'price' => '100'
), $atts);
$pythonarg = ' '. $atts['amount'].' '.$atts['price'];
$pythoncommand = $pythonexe.$pythonscriptpath.$pythonscript.$pythonarg;
exec($pythoncommand, $py_output);
$str = str_replace(array("\r\n", "\r", "\n"), "\n", $py_output);
$output = implode("<br>\n", $str);
return $output;
}
add_shortcode( 'pytest', 'python_func' );
解説
- ショートコードから2つのパラメータ(amountとprice)を取得しphpのexec関数でのコマンド文字列に引数として渡す。
- exec関数は、osのコマンドを叩くだけの機能なので、文字列としてパラメータを渡す。
- コマンドライン文字列などが冗長なのは、練習用として把握しやすくするためなので、適当に短くしても良い。
- exec関数からの出力は、配列に入ってくるので、最終的にはimplodeで<br>を入れるなどしてhtmlの文字列化する。
add_shortcode( 'pytest', 'python_func' );
にて、ショートコードとして登録します。pytestはショートコード名。python_funcはショートコードが指定されたときにから呼び出される関数名。それぞれ任意。
処理内容や名称がイケてないのはご了承下さい。全体の実験を最優先しました。
ショートコードでの記載
WordPressの投稿または固定ページから、任意の位置にショートコードブロックを挿入します。
記載するショートコードは以下の通り。
[pytest amount='3' price='120']
amontやpriceの引数の数値は適当に変えてください。
実行結果
WordPressでの出力結果
Output by Python
args[0] = /home/xxxxx/yyyyy/python/test.py
args[1] = 3
args[2] = 120
calc: 360
0
1
2
3
4
calc:のところは、ショートコードのパラメータがPythonに渡され、その結果、Pythonが計算処理を行ってphpに返した結果を出力しています。
冒頭でも書いたとおり、単なるショートコードの出力なので、全体のレイアウトはWordpressの機能やテーマに委ねることができます。
残された課題の検討
実行結果は、単なる文字列で扱いづらいので、json等でPython側からphpに値を返して、php側で出力の整形をするのが良いでしょう。
また、Python側では演算のコアに特化したほうが得意分野の棲み分けができるので、両者の良さが発揮できるでしょう。
execコマンドは、OSのコマンドを実行できてしまうコマンドなので、取り扱いには注意が必要です。今回は、練習のためショートコードからの引数をダイレクトにPython側に渡していますが、適切なエスケープや変換処理が必要でしょう。
また、都度、プロセスが起動されるので多くのアクセスには弱いと思われます。今回はConoha Wingのレンタルサーバ上で行いましたが、高負荷が予想される場合には自前サーバや演算性能の高いサーバで行った方が良いでしょう。
終わりに
課題はいろいろあるものの、Pythonからの出力をWordpressに渡して、ショートコードで呼び出せるようになったので、例えば、4半期の売り上げ集計なども、ブラウザからWordpressのショートコードをいじるだけで期を変えて出力でき、プログラマが都度いじる必要がなくなりました。ショートコードをまとめてグループ化したり、表示レイアウトも実に多彩になり、再利用性が高くなります。
ショートコード化できたことで、社内や工場内でのIoT機器からの出力集計など、プログラマではない人が、見たいパラメータをWordpressだけで各自パラメータを変えることができるので、新規ページにパラメータを変えたショートコードを埋め込むなどすれば、自由に必要な動的ページが作れることになります。
現実的には、社内などで何かセンサーなどの大量データを監視するための自動分析ツールを呼び出すなど、調査・研究用途に向いているのではないかと思います。
あとは、定型的な統計処理をして、社内の定期レポートとして見せる場合などでしょうか。
そして、実はこれがConoHa Wingの標準環境でできた事も大きいです。ライブラリは何があるか調査はしていないのですが、pipでインストールもできるようです。
おそらく、RaspberryPi上でも同様のことができるでしょう。
まずは今回、ショートコードからPythonを呼び出す処理は実現できたので、今回は終了とします。