メインコンテンツまでスキップ

Kurocoへの移行時に既存記事のURLを変えずに移行できますか?

Kurocoへの移行時に既存記事のURL(例:https://example.com/blog/12345/)を変えずに移行することは可能です。

例えば、以下のような方法が取れます:

  • 既存記事は、slugにblog-12345のような形式で移行
  • Kuroco上で追加する新規記事はblog-[記事ID]で自動的にslugを作るようにトリガーを作成
  • フロントエンドは、/blog/12345/ のページでは blog-12345 でAPIを取得

ステップ1:既存記事をslugを設定して移行する

既存の記事をインポートする際に、現在のURLパスに合わせたslugを各記事に設定します。
例えば、既存URLが https://example.com/blog/12345/ の場合、slugを blog-12345 に設定します。

ヒント

slugはコンテンツ編集画面の「ID/Slug」フィールドで設定できます。また、CSVでコンテンツをアップロードする際にslug列を含めることも可能です。

ステップ2:コンテンツIDの重複を避ける

既存記事が旧IDをslugの一部として使用しているため(例:blog-12345)、Kurocoが自動採番する新しいコンテンツIDが移行済み記事の番号と重複しないようにする必要があります。

環境設定 -> 管理画面の「次のコンテンツID」設定を使って、移行済み記事と重複しない番号までtopics_idの採番を飛ばしてください。

例えば、移行した記事の最大番号が12345の場合、次のコンテンツIDを12346以上に設定します。

ステップ3:新規記事のslugを自動生成するトリガーを作成する

対象のコンテンツ定義IDに対して、トリガー「コンテンツの追加後」を設定したカスタム処理を作成し、新規コンテンツ追加時にslugを自動設定します。

トリガーのサンプルコード

{* トリガー:コンテンツの追加後 *}
{* slug を "blog-[topics_id]" の形式で自動生成する *}

{* ループの場合は処理をスキップ *}
{if $smarty.server.HTTP_RCMS_X_API_REQUEST_CNT > 0}
{return}
{/if}

{* topics_id を使ってslugを生成 *}
{assign var='new_slug' value="blog-`$topics_id`"}

{* api_internal でコンテンツのslugを更新 *}
{assign_array var='body' values=''}
{assign var='body.slug' value=$new_slug}

{api_internal
var='response'
status_var='status'
endpoint="/rcms-api/1/topics/`$topics_id`"
method='POST'
queries=$body
member_id=$smarty.session.member_id}
ヒント

移行前のURLがゼロ埋めのIDを使っている場合は、string_format修飾子で桁数を揃えられます(例:{$topics_id|string_format:"%06d"})。詳細は修飾子を参照してください。

備考
  • $topics_id「コンテンツの追加後」トリガーで利用できる変数で、新しく作成されたコンテンツのIDがアサインされます。。
  • api_internal プラグインは内部APIリクエストを送信してコンテンツを更新します。コンテンツ更新用のエンドポイント(例:Topics::update)が設定されている必要があります。詳細はカスタム処理からKurocoのAPIを呼び出す方法をご参照ください。

ステップ4:フロントエンドでslugを使ってコンテンツを取得する

フロントエンドでは、URLから取り出したIDを使い、Topics::detailsエンドポイントへslugをパスパラメータとして渡してコンテンツを取得します。

Fetchの例(JavaScript)

// 例:/blog/12345/ のようなページでslugを使ってコンテンツを取得する
const id = '12345'; // URLパスから抽出

const response = await fetch(
`https://your-site-key.g.kuroco.app/rcms-api/1/topics_details/blog-${id}`,
{ method: 'GET' }
);

const data = await response.json();
console.log(data.details.subject); // 記事のタイトル

関連ドキュメント


サポート

お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。