work.log

元エンジニアの備忘録的ブログ

PerlとWordPress間でデータを共有するメモ

投稿:2014-05-12 23:20  更新:

Perl と WordPress (PHP) 間でデータを共有するメモです。

運用中の WordPress をリモートから色々と制御したいと思っていて、XML-RPC と wp_options をつかってちょっとやってみました。

サイト構造を大きく変更するだとかは流石にログインしたりしてやりますが、軽微な変更であればツール経由で自動化させて簡略化させたいとうのが意図です。

今回はテストとして Google Analytics の id を制御できるような仕組みを作ってみました。Perl は XML-RPC のクライアントとして使ってますがここは別に何でもいいです。(ga のコードはユニバーサルアナリティクスのものを使います)

データの処理フローとしてはこんな感じに。

  1. Perl でデータの作成、リモートの wp_options へ保存
  2. WordPress が wp_options からデータを読み込む
  3. Google Analytics の js タグを出力

項 1 は XML-RPC クライアントのプログラムを書く必要がりますが、今回は XML-RPC のコードは長くなるので割愛。

Google Analytics の場合であれば id とドメイン名があれば生成できるが、wp_options には PHP から読み取れるデータを保存する必要があるので今回は JSON を使って保存してみた。

perl でこんな感じに JSON を作成。

#!/usr/bin/perl

use strict;
use warnings;
use JSON;

    my $json = {
           id  => 'UA-12345678-1',
           dom => 'example.jp',
       };

    $json = encode_json($json);

Perl <-> PHP 間でシリアライズしたデータをやり取りするなら PHP::Serialization の方が便利かも。

これを XML-RPC で wp_options に保存してあげるとこんな感じに。(option_name は google_analytics)

mysql> SELECT * FROM wp_options WHERE option_name ='google_analytics';
+-----------+------------------+-------------------------------------------+----------+
| option_id | option_name      | option_value                              | autoload |
+-----------+------------------+-------------------------------------------+----------+
|      2025 | google_analytics | {"dom":"example.jp","id":"UA-12345678-1"} | yes      |
+-----------+------------------+-------------------------------------------+----------+

後は WordPress の get_option 関数でこの値が取得できるのでこんな感じに利用する。

function google_analytics() {

	$ga = get_option( 'google_analytics' );

	if ( $ga ) {

		$ga = (array) json_decode( $ga );
		if ( ! preg_match( "/$ga[dom]/", home_url() ) ) { return; }

		echo "<script>\n";
		echo "  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n";
		echo "  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n";
		echo "  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n";
		echo "  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n";
		echo "  ga('create', '$ga[id]', '$ga[dom]');\n";
		echo "  ga('send', 'pageview');\n";
		echo "</script>\n";

	}

	return;

}
add_action( 'wp_head', 'google_analytics' );

7 行目で JSON をデコードして、8 行目で今稼働しているホストと解析タグのドメイン名が一致しているかをチェックしています。(間違え防止)

JSON はデコードすると stdClass オブジェクトとして返ってくるので $ga->id で参照できるが、コード中の使い勝手が悪かったので連想配列に変換。

出力は見やすいように改行コードを入れてますがこれはなくても良いです。正常に処理が行われるとこんな感じに。

<html>
<head>
.
.
.
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-12345678-1', 'example.jp');
  ga('send', 'pageview');
</script>
</head>

実際、Google Analytics のコード何て一度設定すればまず弄る事はないですが、何か固有に表示する必要があるものには使えそうな感じ。

次回、WordPress のカスタマイズをする時はこの仕組を取り入れて試してみようと思います。

コメント

コメントを残す