BcCsvImportBlogPosts は、BcCsvImportCore を使って bc-blog の記事を CSV から一括登録・ダウンロードするプラグインです。
インポート先ブログを管理画面で選択できます。
- ブログ記事の一括登録
- 選択したブログの記事CSVダウンロード
jobMetaを使った追加パラメータ受け渡しの実装例- カテゴリ・タグ解決を含む実案件向け実装の参考
BcCsvImportCoreを有効化済みであることBcBlogが利用可能であること- インポート先のブログコンテンツが作成済みであること
- メニュー名:
ブログ記事CSVインポート - URL:
/baser/admin/bc-csv-import-blog-posts/blog_posts_csv_imports/index
画面構成は BcCsvImportCore の共通UIをベースにしつつ、次の独自UIを追加しています。
- インポート先ブログ選択プルダウン
- 「選択中ブログの記事CSVダウンロード」ボタン
- テーブル:
BcBlog.BlogPosts - 重複キー:
name(スラッグ) - 重複判定:
blog_content_id + nameの組み合わせで判定 - ジョブ一覧:
target_tableにより本プラグインのジョブだけを表示
テンプレートCSVおよび記事CSVダウンロードのヘッダは次の通りです。
No,スラッグ,タイトル,本文(概要),本文(詳細),カテゴリ名,タグ(半角カンマ区切り),公開日時,公開開始日時,公開終了日時,検索除外,アイキャッチ画像,公開状態No: CSV値は取り込まず、インポート時に選択ブログ内の最大noから自動採番するカテゴリ名:BlogCategories.titleで照合するタグ(半角カンマ区切り): カンマ区切りのタグ名で指定する検索除外:0または1公開状態:0または1
- 画面上でブログを選択した状態で実行する
- 出力形式はインポートしやすいよう、上記ヘッダ順に揃えている
- カテゴリは表示名、タグはカンマ区切りで出力する
BcCsvImportBlogPosts/config/setting.php の BcCsvImportBlogPosts.* キーで設定されています。
- インポート方式: 初期値
append(選択可) - 重複処理: 初期値
skip(選択可)
UIを非表示にして固定動作にしたい場合は showImportStrategySelect: false / showDuplicateModeSelect: false に変更してください。
CSV の「カテゴリ名」「タグ」列の値が DB に存在しない場合の動作を、config/setting.php の設定キーで制御できます。
'BcCsvImportBlogPosts' => [
'blogCategoryNotFound' => 'error', // 初期値
]| 値 | 挙動 |
|---|---|
error(初期値) |
その行をエラーとしてスキップし、エラーCSVにカテゴリ名を記録する。インポート自体は続行する。 |
create |
同名(title)のカテゴリを自動作成してインポートを続行する。スラッグはタイトルから英数字ハイフン形式へ変換し、変換できない場合は uniqid でフォールバックする。 |
検索について: CSV の「カテゴリ名」列は
title(表示名)で照合します。
BlogCategories.nameはスラッグ(半角英数字・ハイフン・アンダースコアのみ)のため、
日本語カテゴリ名を入力した場合でも正しく検索・作成できます。
注意:
createを指定した場合、スペルミスのカテゴリ名が大量に作成されるリスクがあります。 本番運用ではerrorのまま使い、事前にカテゴリを整備してから実行することを推奨します。
'BcCsvImportBlogPosts' => [
'blogTagNotFound' => 'ignore', // 初期値
]| 値 | 挙動 |
|---|---|
ignore(初期値) |
存在しないタグは無視し、存在するタグだけを付けてインポートを続行する。 |
error |
存在しないタグが1件でもあれば、その行をエラーとしてスキップする。 |
create |
存在しないタグを自動作成してインポートを続行する。 |
補足: タグは
blog_content_idに依存しない(サイト全体で共有)のに対し、 カテゴリはblog_content_idごとに管理されます。createでカテゴリを自動作成する場合、対象ブログのコンテンツIDに紐づいて作成され、noはブログ単位の次番号、statusは1固定で保存されます。
BlogPostsTableのグローバルなnameUniqueバリデーションは、そのままだと他ブログの記事とも衝突する- 本プラグインでは
blog_content_id + nameの組み合わせで既存記事を検索し、選択ブログ内でのみ重複判定する - そのため、別ブログで同じスラッグを使っていてもインポート可能
- サービス実装:
src/Service/BlogPostsCsvImportService.php - 管理サービス:
src/Service/Admin/BlogPostsCsvImportAdminService.php - 専用コントローラー:
src/Controller/Admin/BlogPostsCsvImportsController.php - 画面テンプレート:
templates/Admin/BlogPostsCsvImports/index.php
追加UIがあるため、このプラグインは BcCsvImportCore の共通テンプレートをそのままは使わず、専用テンプレートを持っています。
| 挙動 | カテゴリ未存在 | タグ未存在 |
|---|---|---|
| 初期値 | error | ignore |
| 自動作成 | create | create |
| 完全エラー | error | error |
大量件数で挙動確認したい場合は、CakePHP コンソールコマンドでテスト用 CSV を生成できます。
bin/cake BcCsvImportBlogPosts.generate_test_csvCSVヘッダは BlogPostsCsvImportService::getColumnMap() から自動取得するため、
カラム定義を変更しても常にインポート仕様と一致します。
生成ファイル名は import_blog_posts_*.csv です。
例: --sizes=10k --errors=5 の場合は import_blog_posts_10k_err5pct.csv が生成されます。
主なオプション:
--output=/path/to/dir出力先ディレクトリを変更(デフォルト:tmp/csv/)--sizes=10k,100k生成件数をカンマ区切りで指定(デフォルト:10k/k・mサフィックス対応)--errors=5エラー行を約 5% 含める(デフォルト:0)
エラー行は一定間隔で差し込まれ、タイトル未入力、不正公開状態、重複スラッグ、不正日付などのパターンを確認できます。
ヘルプを表示するには:
bin/cake BcCsvImportBlogPosts.generate_test_csv --helpMIT License. 詳細は LICENSE.txt を参照してください。