お問い合わせはコチラから

CSVインポートでスラッグが重複している記事を追加ではなく更新する方法

サイト運営

really simple csv importerで、ID指定なし、slug指定ありで記事をインポートした時に、間違って同じCSVファイルをインポートすると記事がダブります。

同じファイルをなぜインポートするのか?と思うかもしれませんが、理由は単純です。

really simple csv importerがcsvファイルが大きいとインポート時に500エラーになるのを避けるためにcsvファイルを一定の行数に分割するとファイルが増えます。そのファイルをチマチマD&Dでインポートしているとファイルを間違えるのです。

それで前回、記事の重複を削除する羽目になりました。

この記事は、CSVインポート時にそもそも重複をチェックしてインポートしたらどうですか?という内容の記事です。

CSVインポートで大量に記事を投稿する人は同じ悩みを持っているかもしれません。

really simple csv importerはadd onでカスタマイズできる

really simple csv importerは、ID指定があり、かつ、すでにIDが存在している時には追加ではなく更新になるフラグがあります。

しかし、そのフラグはフックで書き換えられないので、すでに世の中に存在しているaddonを拝借して、コード修正することにしました。

子カテゴリを登録する機能は特に使いませんが、プラグイン本体を修正したくなかったのでadd onを拝借しています。

【WordPress】小カテゴリが登録できるReally Simple CSV Importerの拡張プラグイン - あずみ.net
【WordPress】小カテゴリが登録できるようにReally Simple CSV Importerの拡張プラグインを作りました。 Really Simple CSV ImporterプラグインとはCSVでワードプレス … 続きを読む "【WordPress】小カテゴリが登録できるReally Simple CSV ...

変更内容

  1. slugの指定がある場合は、slugが存在するか確認($post_typeは必ず設定されている)
  2. slugが存在する場合はIDを調べてIDを格納
  3. 更に、更新フラグを立てます。
					// (string) post slug
					$post_name = $h->get_data($this, $data, 'post_name');
					if ($post_name) {
						$_post_id = get_page_by_path($post_name, "OBJECT", $post_type);
						$post_id = $_post_id->ID;
						if ($post_id) {
							// do something
							$post['ID'] = $post_id;
							$is_update = true;
						}
						$post['post_name'] = $post_name;
					}

slug重複の時は更新するore-csv-importer.php

<?php

/*
  Plugin Name: ORE CSV Importer
  Description: Import posts, categories, tags, custom fields from simple csv file.
  Author: kurozuim
  Author URI: http://a-zumi.net
  Plugin URI: http://a-zumi.net
  Text Domain: really-simple-csv-importer
 */

// Load Really Simple CSV Importer Plugin
$really_simple_csv_importer = ABSPATH . 'wp-content/plugins/really-simple-csv-importer/rs-csv-importer.php';

if (!file_exists($really_simple_csv_importer))
	wp_die('Really Simple CSV Importerプラグインをインストールして下さい。');

require $really_simple_csv_importer;

function the_slug_exists($post_name) {
    global $wpdb;
    if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
        return true;
    } else {
        return false;
    }
}

/**
 * CSV Importer
 *
 * @package WordPress
 * @subpackage Importer
 */
if (class_exists('RS_CSV_Importer')) {

	class ORE_CSV_Importer extends RS_CSV_Importer {

		// process parse csv ind insert posts
		function process_posts()
		{
			$h = new RS_CSV_Helper;

			$handle = $h->fopen($this->file, 'r');
			if ($handle == false) {
				echo '<p><strong>' . __('Failed to open file.', 'really-simple-csv-importer') . '</strong></p>';
				wp_import_cleanup($this->id);
				return false;
			}

			$is_first = true;
			$post_statuses = get_post_stati();

			echo '<ol>';

			while (($data = $h->fgetcsv($handle)) !== FALSE) {
				if ($is_first) {
					$h->parse_columns($this, $data);
					$is_first = false;
				} else {
					echo '<li>';

					$post = array();
					$is_update = false;
					$error = new WP_Error();

					// (string) (required) post type
					$post_type = $h->get_data($this, $data, 'post_type');
					if ($post_type) {
						if (post_type_exists($post_type)) {
							$post['post_type'] = $post_type;
						} else {
							$error->add('post_type_exists', sprintf(__('Invalid post type "%s".', 'really-simple-csv-importer'), $post_type));
						}
					} else {
						echo __('Note: Please include post_type value if that is possible.', 'really-simple-csv-importer') . '<br>';
					}

					// (int) post id
					$post_id = $h->get_data($this, $data, 'ID');
					$post_id = ($post_id) ? $post_id : $h->get_data($this, $data, 'post_id');
					if ($post_id) {
						$post_exist = get_post($post_id);
						if (is_null($post_exist)) { // if the post id is not exists
							$post['import_id'] = $post_id;
						} else {
							if (!$post_type || $post_exist->post_type == $post_type) {
								$post['ID'] = $post_id;
								$is_update = true;
							} else {
								$error->add('post_type_check', sprintf(__('The post type value from your csv file does not match the existing data in your database. post_id: %d, post_type(csv): %s, post_type(db): %s', 'really-simple-csv-importer'), $post_id, $post_type, $post_exist->post_type));
							}
						}
					}

					// (string) post slug
					$post_name = $h->get_data($this, $data, 'post_name');
					if ($post_name) {
						$_post_id = get_page_by_path($post_name, "OBJECT", $post_type);
						$post_id = $_post_id->ID;
						if ($post_id) {
							// do something
							$post['ID'] = $post_id;
							$is_update = true;
						}
						$post['post_name'] = $post_name;
					}

					// (login or ID) post_author
					$post_author = $h->get_data($this, $data, 'post_author');
					if ($post_author) {
						if (is_numeric($post_author)) {
							$user = get_user_by('id', $post_author);
						} else {
							$user = get_user_by('login', $post_author);
						}
						if (isset($user) && is_object($user)) {
							$post['post_author'] = $user->ID;
							unset($user);
						}
					}

					// (string) publish date
					$post_date = $h->get_data($this, $data, 'post_date');
					if ($post_date) {
						$post['post_date'] = date("Y-m-d H:i:s", strtotime($post_date));
					}

					// (string) post status
					$post_status = $h->get_data($this, $data, 'post_status');
					if ($post_status) {
						if (in_array($post_status, $post_statuses)) {
							$post['post_status'] = $post_status;
						}
					}

					// (string) post title
					$post_title = $h->get_data($this, $data, 'post_title');
					if ($post_title) {
						$post['post_title'] = $post_title;
					}

					// (string) post content
					$post_content = $h->get_data($this, $data, 'post_content');
					if ($post_content) {
						$post['post_content'] = $post_content;
					}

					// (string) post excerpt
					$post_excerpt = $h->get_data($this, $data, 'post_excerpt');
					if ($post_excerpt) {
						$post['post_excerpt'] = $post_excerpt;
					}

					// (int) post parent
					$post_parent = $h->get_data($this, $data, 'post_parent');
					if ($post_parent) {
						$post['post_parent'] = $post_parent;
					}

					// (int) menu order
					$menu_order = $h->get_data($this, $data, 'menu_order');
					if ($menu_order) {
						$post['menu_order'] = $menu_order;
					}

					// (string, comma separated) slug of post categories
					$post_category = $h->get_data($this, $data, 'post_category');
					if ($post_category) {
						$parent_categories = array();
						
						$categories = preg_split("/,+/", $post_category);
						if ($categories) {
							$parent_categories = wp_create_categories($categories);
							$post['post_category'] = $parent_categories;
						}

						/**
						 * 小カテゴリ登録用のCSV項目追加
						 */
						$post_child_category = $h->get_data($this, $data, 'post_child_category');
						if ($post_child_category) {
							$categories = preg_split("/,+/", $post_child_category);
							if ($categories) {
								foreach ($parent_categories as $parent_category) {
									foreach ($categories as $category) {
										$post['post_category'][] = wp_create_category($category, $parent_category);
									}
								}
							}
						}
					}

					// (string, comma separated) name of post tags
					$post_tags = $h->get_data($this, $data, 'post_tags');
					if ($post_tags) {
						$post['post_tags'] = $post_tags;
					}

					// (string) post thumbnail image uri
					$post_thumbnail = $h->get_data($this, $data, 'post_thumbnail');

					$meta = array();
					$tax = array();

					// add any other data to post meta
					foreach ($data as $key => $value) {
						if ($value !== false && isset($this->column_keys[$key])) {
							// check if meta is custom taxonomy
							if (substr($this->column_keys[$key], 0, 4) == 'tax_') {
								// (string, comma divided) name of custom taxonomies 
								$customtaxes = preg_split("/,+/", $value);
								$taxname = substr($this->column_keys[$key], 4);
								$tax[$taxname] = array();
								foreach ($customtaxes as $key => $value) {
									$tax[$taxname][] = $value;
								}
							} else {
								$meta[$this->column_keys[$key]] = $value;
							}
						}
					}

					/**
					 * Filter post data.
					 *
					 * @param array $post (required)
					 * @param bool $is_update
					 */
					$post = apply_filters('really_simple_csv_importer_save_post', $post, $is_update);
					/**
					 * Filter meta data.
					 *
					 * @param array $meta (required)
					 * @param array $post
					 * @param bool $is_update
					 */
					$meta = apply_filters('really_simple_csv_importer_save_meta', $meta, $post, $is_update);
					/**
					 * Filter taxonomy data.
					 *
					 * @param array $tax (required)
					 * @param array $post
					 * @param bool $is_update
					 */
					$tax = apply_filters('really_simple_csv_importer_save_tax', $tax, $post, $is_update);

					/**
					 * Option for dry run testing
					 *
					 * @since 0.5.7
					 *
					 * @param bool false
					 */
					$dry_run = apply_filters('really_simple_csv_importer_dry_run', false);

					if (!$error->get_error_codes() && $dry_run == false) {

						/**
						 * Get Alternative Importer Class name.
						 *
						 * @since 0.6
						 *
						 * @param string Class name to override Importer class. Default to null (do not override).
						 */
						$class = apply_filters('really_simple_csv_importer_class', null);

						// save post data
						if ($class && class_exists($class, false)) {
							$importer = new $class;
							$result = $importer->save_post($post, $meta, $tax, $post_thumbnail, $is_update);
						} else {
							$result = $this->save_post($post, $meta, $tax, $post_thumbnail, $is_update);
						}

						if ($result->isError()) {
							$error = $result->getError();
						} else {
							$post_object = $result->getPost();

							if (is_object($post_object)) {
								/**
								 * Fires adter the post imported.
								 *
								 * @since 1.0
								 *
								 * @param WP_Post $post_object
								 */
								do_action('really_simple_csv_importer_post_saved', $post_object);
							}

							echo esc_html(sprintf(__('Processing "%s" done.', 'really-simple-csv-importer'), $post_title));
						}
					}

					// show error messages
					foreach ($error->get_error_messages() as $message) {
						echo esc_html($message) . '<br>';
					}

					echo '</li>';
				}
			}

			echo '</ol>';

			$h->fclose($handle);

			wp_import_cleanup($this->id);

			echo '<h3>' . __('All Done.', 'really-simple-csv-importer') . '</h3>';
		}

	}

	// Initialize
	function ore_csv_importer()
	{
		load_plugin_textdomain('really-simple-csv-importer', false, './really-simple-csv-importer/languages');

		$ore_csv_importer = new ORE_CSV_Importer();
		register_importer('csv', __('CSV', 'really-simple-csv-importer'), __('Import posts, categories, tags, custom fields from simple csv file.', 'really-simple-csv-importer'), array($ore_csv_importer, 'dispatch'));
	}

	remove_action('plugins_loaded', 'really_simple_csv_importer');
	add_action('plugins_loaded', 'ore_csv_importer');
} // class_exists( 'RS_CSV_Importer' )

まとめ

私の運用で問題ないようにだけ修正してあるので、汎用的に使えるように考えていません。

あくまでも、ID指定なしで、slug指定あり⇒CSV経由で記事追加(更新なし)で運用時にslug重複で更新になるようにチョイ変したものです。

この記事が気に入ったら フォローしよう
最新情報をお届けします。
この記事を書いた人
ブーン

はるばる日本よりオランダ王国へやってまいりました。
自分の経験が少しでも参考になれば嬉しいです。
お問い合わせは、『こちら』からお願い致します。

\ブーンをフォロー/
スポンサーリンク
サイト運営
\シェアお願いします!/
\ブーンをフォロー/

失敗しないレンタルサーバーランキング

mixhost

不正アクセスに強くて使いやすいおススメサーバー
\本サイトで利用中/
メリット①:自動ウィルス駆除対応
メリット②:サイトの表示速度が速い!
メリット③:転送量の上限が多い!
メリット④:自由にプラン変更ができ、アクセス増にも対応できる!
メリット⑤:バックアップデータが無料で復元できる!
メリット⑥:Wordpressが簡単にインストールできる!
メリット⑦:どのプランでも初期費用が無料!
メリット⑧:10日間の無料お試し期間と30日の返金保証!

Conoha Wing

国内Wordpress最速の最強サーバー
メリット①:圧倒的な表示速度
メリット②:レンタルサーバーと独自ドメインがセットでお得◎
メリット③:プラン変更はすべてのプランで自由自在
メリット④:一か月の利用転送量の制限が緩い(9TB~)
メリット⑤:WordPresサイトの移行が簡単

エックスサーバー

国内シェアNo1の安定性と実績が魅力。ALL SSDで死角なしの万能サーバー。
メリット①:サイトの表示速度が安定して速い!
メリット②:アクセス負荷に強くて安定性が高い!
メリット③:24時間365日の充実サポートで安心!電話サポートもあり!
メリット④:転送量が多い!
メリット⑤:自動バックアップ機能付き!
メリット⑥:WordPressが簡単にインストールできる!
メリット⑦:10日の無料お試し期間がある!

オランダで生きていく
タイトルとURLをコピーしました