Perlで組まれたCGIから同じサーバーにあったWordpressのデータを呼び出す機会がありました。
WordPress上でACFのOptionsページを用意し、Optionsページで設定した値を読みだしてPerl側に渡してあげるという内容です。
かなり泥臭い方法ですが、実現できました。
方法1:Wordpress関数でDBからデータ取得
Perl側の処理
Perl側では、シェル実行でPHPファイルを実行し、結果を変数に格納する処理を書きます。
PHPに引数でパラメータを渡すこともできます。
$holiday=`/usr/local/php74/bin/php /home/users/www.xxxx.jp/form_xxx.php ja`;
PHP側の処理
PHP側では、wordpress関数を実行できるようにwp-load.phpを読みだします。あとはACF Optionページのフィールドを読みだして、echoします。
<?php
$lang = $argv[1];
// wp-load.phpのパスを指定
require_once "wp/wp-load.php";
// acfのフィールドを読みだす
$val = get_field('field_name','option');
// 最後にechoで出力
echo $val;
方法2:PHPのPDOでDBからデータ取得
Perl側の処理
方法1と同じです。
PHP側の処理
PHP側では、Wordpressのwp-load.phpを読みださずにPHPのPDOを使ってMySQLにアクセスして値を取得します。
<?php
$lang = $argv[1];
// wp-config.phpのパスを指定
require_once "wp/wp-config.php"; // 適切なパスに変更してください
// データベース接続情報を取得
$host = DB_HOST;
$db = DB_NAME;
$user = DB_USER;
$pass = DB_PASSWORD;
$charset = DB_CHARSET;
// DSNを作成
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
// PDOインスタンスを作成
$pdo = new PDO($dsn, $user, $pass, $options);
// 読み出したいオプション名
$option_names = [
"options_message_" . $lang . "_en",
"options_message_" . $lang
];
// プレースホルダーを生成
$placeholders = rtrim(str_repeat('?,', count($option_names)), ',');
// SQLクエリを準備
$stmt = $pdo->prepare("SELECT option_name, option_value FROM wp_options WHERE option_name IN ($placeholders)");
$stmt->execute($option_names);
// 結果を取得
$results = $stmt->fetchAll();
// 結果を配列に格納
$resdb = [];
foreach ($results as $row) {
$resdb[$row['option_name']] = $row['option_value'];
}
// メッセージを設定
// options_message_enが1の場合は$messageを設定し、0の場合は空文字にする
if (isset($resdb["options_message_" . $lang . "_en"]) && $resdb["options_message_" . $lang . "_en"] == 1) {
$message = isset($resdb["options_message_" . $lang]) ? $resdb["options_message_" . $lang] : '';
} else {
$message = ""; // options_message_enが0の場合
}
echo $message;
} catch (\PDOException $e) {
echo "接続エラー: " . $e->getMessage();
}
参考:https://do-jo.jp/plugins/1120/
方法3:テキストファイルからデータ取得
方法1と方法2は実際に適用してみるとレスポンスが遅くなります。
シェルの実行とPHPの呼び出しがあるので実行速度が犠牲になっているようです。
できればPerlだけで閉じて処理をしたいところです。
ACFのオプションページの保存時にデータをファイルに書きだしておいて、Perl側から読み込むのが一番早いと思います。
do_action( 'acf/options_page/save', $post_id, $menu_slug );

ACF | acf/options_page/save
Fires after publishing a save on an options page.
まとめ
PerlからwordpressのDBにアクセスしてデータを受け取る方法をご紹介しました。
PHPをシェルスクリプトで呼び出すため、処理の遅さがネックでした。
ACFのオプションページのデータを保存時にテキストに書き出し、Perlからテキストを読み出すのが一番スッキリしてオーバーヘッドが少ないかと思います。