TECHBLOG

WordPress > プラグイン

開発時にのみ使用するプラグイン

Create:

Update:

Category:WordPressプラグイン

[ Version.19 ]

概要

弊社ではプラグインを絞り込んで導入しています。

プラグイン自体を否定しているわけではなく、公開後は使用しませんが開発時に使用するプラグインがあります。

とても重宝しているプラグインなので紹介します。

Rewrite Rules Inspector

こちらは、ルーティングに関する開発時には、この上なく便利なプラグインです。

https://wordpress.org/plugins/rewrite-rules-inspector/

URLを入力して「Filter」をクリックすると、リライトルールが優先順に表示されます。デバッグ時は、これがあるととても助かります。

Flash(リライトルールを更新) されてない場合一目で分かり、右のFlashボタンを押すだけ。

add_rewrite_rule($rule, $rewrite); を記述する際もRuleとRewriteそのまま記載されているので参考になります。

WP All Import PRO

CSVで一括インポートができるプラグインです。

弊社では、リニューアルの際のデータ移行に使用しています(有料版)。

画像も wp-posts に attatchment として insert してくれたり、Advanced Custom Fields PRO の更新やタクソノミーの更新も一括で実行してくれます。Advanced Custom Fields PROとの相性は抜群でリピートフィールドにも対応。

ドラッグだけで、各フィールドにCSVの表示されている値を入れてくれ、そのまま wp-postmeta にも追記してくれます。

しかし、いくつか難点もあります。

  • 兄弟プラグイン「WP All Export」がかなり使いづらい(使えない)。
  • 挙動を把握するのが大変(最初何回もやり直しました)。
  • サーバー能力にも依存しますが、画像を含む大量のデータ移行だと何時間も要します。
  • CSVの文字コードはUTF-8限定で注意。
  • CSVの1行目は英数で記述しないと何かと不便。
  • 変換するための関数記述も可能だが変換処理を取り込み側で行うと大きくロスが発生。
  • 日本語メニューが「すべてインポート」とちょっとカッコ悪い。

それでもデータ移行に関して代替策がないため使用しています。

現時点での解決策
  • インポート用CSVは、旧サイト上で自作する。
  • 旧サイト上でカスタム投稿タイプごとにCSVを作成。移行先の関数エディターは使用せず、CSV生成時に replace などの処理をしておく。
  • 投稿が少なければ(10件程度なら)手作業で移行。
  • CSV作成の際に、必ず「post_name」「post_date」「post_status(drawはエクスポートさせないというのもあり)」
  • 投稿画像はあらかじめ移行先サーバーに移動させておく。

こうすることで移行データを管理しています。

エクスポートCSV生成コード(サンプル)
ini_set('display_errors', 1);
error_reporting(E_ALL);
$this_post_type = 'xx';
define('ROOTREALPATH', '/home/xxx/www/yyy');
include_once ROOTREALPATH . '/pp/wp-load.php';
include_once ROOTREALPATH . '/export/CsvDownload.php';
$CsvDownload = new CsvDownload();
$CsvDownload->convert_encoding_to = 'UTF-8';
$prefix = 'wp_csv_for_export_' . 'xx';
$replace = [
	[
		'from' => 'https://www.aaa/',
		'to' => 'https://xxx.bbb/'
	],
	[
		'from' => 'ppp',
		'to' => 'qqq'
	],
];
function oo_export_replace($subject)
{
	global $replace;
	return str_replace(array_column($replace, 'from'), array_column($replace, 'to'), $subject);
}
/* get_posts */
$wp_export_arr = [];
$args = [
	'post_type' => $this_post_type,
	'posts_per_page' => -1
];
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
	while ($the_query->have_posts()) {
		$arr = [];
		$the_query->the_post();
		$this_post_id = $the_query->post->ID;
		$arr['post_title'] = $the_query->post->post_title;
		$arr['post_name'] = $the_query->post->post_name;
		$arr['post_status'] = $the_query->post->post_status;
		$arr['post_date'] = $the_query->post->post_date;
		// acf
		$arr['acf_yyy'] = get_field('acf_yyy', $this_post_id);
		$wp_export_arr[] = $arr;
	}
}
/* csv */
var_dump($wp_export_arr);
// $CsvDownload->output( $wp_export_arr, $prefix );

生成したら、すぐサーバーから削除。git管理すれば、不足している値などすぐに足せます。

※ 途中出てくる CsvDownlad は、弊社制作のClass(後述)。

CsvDownload.php

結構便利です。

※ laravel でも namespace をつけて使っています。

class CsvDownload
{
	public $convert_encoding_to = 'SJIS';
	/**
	 * output
	 */
	public function output($arr, $file_name_prefix = '', $field_line_from_key = true)
	{
		$csv_filename = self::createFilename($file_name_prefix);
		header('Content-type: text/html; charset=utf-8');
		header('Content-Disposition: attachment; filename="' . $csv_filename . '"');
		header('Content-Type: application/octet-stream');
		if ($field_line_from_key && is_array($arr[0])) {
			$field_names = array_keys($arr[0]);
			$data = self::makeLine($field_names);
			$converted_field_names = mb_convert_encoding($data, $this->convert_encoding_to, 'UTF-8');
			echo $converted_field_names;
		}
		foreach ($arr as $v) {
			$data = self::makeLine($v);
			$converted_csv_data = mb_convert_encoding($data, $this->convert_encoding_to, 'UTF-8');
			echo $converted_csv_data;
		}
		mb_http_output('pass'); //バイナリデータ誤認識&コード変換防止
	}
	/**
	 * makeLine
	 */
	private static function makeLine($values)
	{
		foreach ($values as $i => $v) {
			if (is_array($v) || is_object($v)) {
				$v = var_export($v, true);
			}
			if (
				(strpos($v, ',') !== false) ||
				(strpos($v, '"') !== false) ||
				(strpos($v, ' ') !== false) ||
				(strpos($v, "\t") !== false) ||
				(strpos($v, "\n") !== false) ||
				(strpos($v, "\r") !== false)
			) {
				$values[$i] = '"' . str_replace('"', '""', $v) . '"';
			}
		}
		return implode(',', $values) . "\n";
	}
	/**
	 * createFilename
	 */
	private static function createFilename($prefix = '')
	{
		$filename = '';
		$filename .= $prefix ? $prefix . '_' : '';
		$filename .= date('Ymd_His');
		$filename .= '.csv';
		return $filename;
	}
}

loading