PHP | WordPressの投稿や設定情報に対して置換などの処理をする

Code:

/**
 * mysql エラーフラグ 設定
 */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
/**
 * mysql 接続
 */
$mysqli = new mysqli('localhost', '_USERNAME_', '_PASSWORD_', '_DB_NAME_');
if ($mysqli->connect_error) {
	echo $mysqli->connect_error;
	exit;
}


// 対象 Table
$TABLE = 'wp_posts';
// Table 主キー
$PRIMARY = 'ID';
// 文字列の含まれるカラム
$CONTENT = 'post_content';

/**
 * Query
 */
// 取得用クエリ
$QuerySelect = <<<TXT
SELECT 
	$PRIMARY,
	$CONTENT
FROM 
	$TABLE
WHERE 
	$CONTENT != ''
TXT;
// 更新用クエリ
$QueryUpdate = <<<TXT
UPDATE 
	$TABLE 
SET 
	$CONTENT = ? WHERE $PRIMARY = ?;
TXT;

/**
 * 処理用関数
 */
function Method($value) {
	/**
	 * 処理
	 */
	return $value;
}


/**
 * 対象取得
 */
$PostRows = [];
$result = $mysqli->query($QuerySelect, MYSQLI_USE_RESULT);
while ($row = $result->fetch_assoc()) {
	$PostRows[] = $row;
}
/**
 * 結果の開放
 */
mysqli_free_result($result);

/**
 * トランザクション 開始
 */
$mysqli->begin_transaction();

try {
	/**
	 * 全取得Row置換処理
	 */
	foreach ($PostRows as $row) {
		$primary_key = $row[$PRIMARY];
		$org_content_value = $content_value = $row[$CONTENT];

		/**
		 * シリアライズ 戻す
		 *   成功すると 配列
		 *   失敗すると false
		 */
		$valueData = @unserialize($content_value);
		if ($valueData) {
			/**
			 * シリアライズデータ だったら
			 * 
			 * 全配列要素を再帰処理
			 */
			array_walk_recursive($valueData, function(&$value, $key) {
				/**
				 * 置換処理
				 */
				$value = Method($value);
			});

			/**
			 * シリアライズ化
			 */
			$content_value = @serialize($valueData);
		}
		else {
			/**
			 * 普通のデータ だったら
			 *
			 * 置換処理
			 */
			$content_value = Method($content_value);
		}


		if ($org_content_value !== $content_value) {
			/**
			 * 変更されてたら
			 * UPDATE
			 */
			$stmt = mysqli_prepare($mysqli, $QueryUpdate);
			$stmt->bind_param('si', $content_value, $primary_key);
			if ($stmt->execute()) {
			}
			else {
				/**
				 * 失敗したらやり直し
				 */
				throw new \Exception('primary_key:'.$primary_key.'で、エラーが発生しました。');
			}
		}
	}

	/**
	 * 全部完了 コミット
	 */
	$mysqli->commit();

} 
catch (\Exception $ex) {
	/**
	 * どこかで失敗 ロールバック
	 */
	$mysqli->rollback();

	echo $ex->getMessage();
}

/**
 * 終了
 */
$mysqli->close();
WordPress内になるデータの置換方法には、プラグインやサービスなど様々なものがあります。
今回はそんなサービスでは処理しきれない、特殊な処理や、面倒な置換を行える方法を紹介していきます。

    もくじ

  1. 使い方
  2. プログラムの説明
  3. 処理サンプル
  4. まとめ

使い方

データベースに接続

Code:

$mysqli = new mysqli('_HOST_', '_USERNAME_', '_PASSWORD_', '_DB_NAME_');
データベースに接続するために、「ホスト」 「ユーザー名」 「パスワード」 「DB名」を指定します。
わからない場合は、WordPressの設定ファイル「wp-config.php」に記載されているので、確認ください。

対象となるTableの指定

Code:

// 対象 Table
$TABLE = 'wp_posts';
// Table 主キー
$PRIMARY = 'ID';
// 文字列の含まれるカラム
$CONTENT = 'post_content';
処理を行いたいデータのあるテーブル情報を記載します。
サンプルでは投稿データに対して処理を行う方法を記載しています。

行いたい処理の記述

Code:

/**
 * 処理用関数
 */
function Method($value) {
	/**
	 * 処理
	 */
	return $value;
}
対象となるデータに対して行いたい処理を記述します。
処理後は、処理した値をreturnで戻します。

実行

コードを記載したPHPファイルをサーバーにアップして実行します。
重い処理を走らせる場合や、処理件数があまりにも多い場合、サーバータイムアウトとなってしまう可能性があるので、その際は件数を調整したりなどで対応しましょう。

プログラムの説明

シリアライズ

Code:

/**
 * シリアライズ 戻す
 *   成功すると 配列
 *   失敗すると false
 */
$valueData = @unserialize($content_value);
WordPressのデータには、シリアライズ化されたデータもあります。(テーブルwp_optionswp_postmetaなど)
シリアライズ化されたデータには、要素の文字数としての情報も含まれているため、処理後の文字数情報も更新しなければ、エラーの原因となってしまいます。
今回のプログラムでは、一度デシリアライズし、希望となる処理を行い、またシリアライズ化する、と言う方法をとっています。

データの更新

Code:

if ($org_content_value !== $content_value) {
	/**
	 * 変更されてたら
	 * UPDATE
	 */
	$stmt = mysqli_prepare($mysqli, $QueryUpdate);
	$stmt->bind_param('si', $content_value, $primary_key);
	if ($stmt->execute()) {
	}
	else {
		/**
		 * 失敗したらやり直し
		 */
		throw new \Exception('primary_key:'.$primary_key.'で、エラーが発生しました。');
	}
}
データベースから取得した元データと、対象となる処理を走らせた後のデータに差異があった場合のみ、UPDATEします。
例外が発生した際は処理を中断します。

処理サンプル

タグに記載されたstyle属性を削除

Code:

function Method($value) {
	/**
	 * sample
	 *   タグに記載されたstyle属性を削除
	 */
	$value = preg_replace('#<(.+?)style=".*?"(.*?)>#', '<$1$2>', $value);

	return $value;
}
HTMLタグ内に書かれたstyle属性を正規表現で削除します。

画像のsrcをdata-srcに移動してdummy.gifに

Code:

function Method($value) {
	/**
	 * sample
	 *   画像のsrcをdata-srcに移動してdummy.gifに
	 */
	$value = preg_replace('#<img(.+?)src="(.+?)"(.*?)>#', '<img$1src="dummy.gif" data-src="$2"$3>', $value);

	return $value;
}
画像タグのsrc属性を、data-srcへと複製。
元のsrc属性には、「dummy.gif」をセットします。
画像の遅延読み込み処理を追加する時などに。

全角カタカナを半角カタカナに

Code:

function Method($value) {
	/**
	 * sample
	 *   全角カタカナを半角カタカナに
	 */
	$value = mb_convert_kana($value, 'k', 'utf-8');

	return $value;
}
投稿内の「全角カタカナ」を、まとめて「半角カタカナ」に変換します。
バイト数を減らしたい場合など。
文章を読みやすくするため、半角ではなく全角で統一するプログラムは使いところがあるような。

まとめ

今回は「WordPress」に保存されたデータに一括処理を行う方法を紹介しました。
投稿内に記載されたURLに、それぞれ別のパラメーターをつけてたいなど、普通の置換処理だけでは実現出来ないような処理を行いたい時に役立つと思います。