Custom Field Suite で 選択肢 を全て取得する方法

WordPressのプラグインで Custom Field Suite や Advanced Custom Fields は良く使うと思います。

理由は特になく、当方は Custom Field Suite (以下CFS) をメインに使っておりますが、先日このCFSを使った投稿で、抽出システムを作る必要があったので調べていたら【選択肢】いわゆるSELECTを使った投稿を抽出する際、CFSで設定した選択肢をすべて取得する物がありませんでした。

少し調べた感じだと Advanced Custom Fields ではそういったニーズにも対応しているようでしたが、今さら入れ替えるのも面倒臭かったので適当に作ってみました。

実現するには以下の条件が必要です。
・選択肢のKEYになる部分にユニークなPREFIX + 数字1文字以上

CFSの設定画面

KEY:VALUE という構成になってます。

functions.phpに下記コードを追加

function cfs_select_get_field($prefix) {
	global $wpdb;
	$result = $wpdb->get_var("select meta_value from wp_postmeta where meta_key='cfs_fields';");
	preg_match_all("/\"(".$prefix.".+?)\";s:\d{1,}:\"(.+?)\"/", $result, $match);
	return $match;
}

※説明:CFSの設定情報はすべて wp_postmeta の meta_key=cfs_fieldsにシリアライズしたものが格納されているので、それを引き出し正規表現で必要なKEYとVALUEをマッチさせてます。

呼び出し側 cfs_select_get_field(PREFIX)

$res = cfs_select_get_field('p_');
foreach ($res[0] as $key => $val) {
	echo '<dd><input type="checkbox" value="'.$res[1][$key].'" id="'.$res[1][$key].'"><label for="'.$res[1][$key].'">'.$res[2][$key].'</label></dd>'."\r\n";
}

※説明:正規表現でマッチしたものをループで処理してます。配列は [0]全文 [1]KEY [2]VALUE で格納されています。

とりあえず綺麗なコードではないですが、シンプルに構成してみました。
余計なループ処理も抑えて書いています。
これでCFSで選択肢を増やしても連動して抽出フォームに項目が追加されます。

バックアップ

個人的に好きなテキストデータベースで作成した場合のバックアップについて覚書

レンタルサーバーであればCRONが使えたりすることが多いので、
下記のシェルスクリプトを保護されたディレクトリに保存し、
CRONから実行させると良い。

CRONが良くわからないときは、phpから実行させることも場合によっては可能。
バックアップタイミングはログイン時にでも処理させればよいが、
その日1回だけのバックアップとする場合は、PHP側でコードの追記が必要。

$results = shell_exec('sh /var/www/******/httpdocs/admin/backup/backup.sh');
echo $results;

フルパスは下記コードや、phpinfo();などで調べる。

<?php
echo __FILE__ ;
?>

以下、シェルスクリプトの指定項目
・バックアップ元
・バックアップ先
・アーカイブ名
・保存日数
を指定
※できればバックアップ先を外部からアクセスできない階層にするのが望ましいが、出来ない場合は.htaccessなどを用いてアクセス制限処理を掛ける必要あり。
※先頭行の#!/bin/shは、#!/bin/bashでも良い。bashのシンボリックリンクになっているらしく、基本的には同じとのこと。基本的にはです。

#!/bin/sh

# ---------- 設定 ----------
# バックアップ元のディレクトリ
src_dir=/var/www/******/httpdocs/admin/dat/

# バックアップ先のディレクトリ・ファイル
bk_dir=/var/www/******/httpdocs/admin/backup/
bk_file=archive

# 保存する日数
bk_days=30

# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
ts_now=`date +%Y%m%d`
ts_old=`date "-d$bk_days days ago" +%Y%m%d`

# ファイル名を設定
file_backup=$bk_file.$ts_now.tar.gz
file_remove=$bk_file.$ts_old.tar.gz

# ---------- バックアップ処理 ----------
# バックアップ元のディレクトリに移動
cd $src_dir
if [ $? != 0 ]; then
echo "Source directory does not exist."
exit 1
fi

# アーカイブを作成
tar cfz $bk_dir$file_backup *
if [ $? != 0 -o ! -e $bk_dir$file_backup ]; then
echo "Cannot archive file."
exit 1
fi

# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi

# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi

exit 0