FaustJSのPreviewで、遷移先URLが`/preview`にならない場合の対応覚書
FaustJSのプレビュー機能をセットアップ中にハマったので、やったことをまとめました。 起きたこと ドキュメントを参考に、プレビュー機能をセットアップしました。 https://faustjs.org/docs/nex […]
目次
FaustJSのプレビュー機能をセットアップ中にハマったので、やったことをまとめました。
起きたこと
ドキュメントを参考に、プレビュー機能をセットアップしました。
https://faustjs.org/docs/next/guides/post-page-previews
が、WordPress管理画面からプレビューに遷移した時のURLが想定と異なるものでした。
- 想定していたもの:
https://example.com/preview?xxxx
- 実際のURL:
https://example.com/post-name/?preview=true&xxx
Next.js側で、個別記事ページを表示するために/pages/[slug].tsx
を利用しています。
そのため、このURLではプレビュー用のファイル/pages/preview.tsx
ではなく/pages/[slug].tsx
でリクエストが処理されていました。
考えられる原因
コードをざっと追いかけたのですが、FaustJSや関連プラグインの挙動ではなさそうでした。
パーマリンクの設定を/%postname%/
にしていることで、WP APIまわりの実装時にハマることがありましたので、今回もこれが原因かなと思っています。
対応: プレビューのURLをフックで書き換える
個人で運用しているサイトなので、プレビューのURLを差し替えてしまうことにしました。
プレビューのURLをWordPress側で変更する
以下のコードをプラグインとして実装し、https://example.com/preview/post-name?xxx
がプレビューURLになるようにしました。
add_filter( 'preview_post_link', function( $link, $post ) {
$post_name = $post->post_name;
if ( preg_match( '/\/preview\//', $link ) ) {
return $link;
}
// For new post
if ( ! $post_name ) {
$site_url = get_site_url();
$new_link = preg_replace( '{' . $site_url . '}', $site_url . '/preview/new' , $link );
return $new_link;
}
$new_link = preg_replace( '{' . $post_name . '}', 'preview/' . $post_name , $link );
return $new_link;
}, 10, 2);
Next.js側のプレビューファイルを移動
続いてFaustJSドキュメントにあるPreview
ファイルを、以下のパスに変更します。
- 変更前:
/pages/preview.tsx
- 変更後:
/pages/preview/[slug].tsx
補足
新規記事など、post_name
が存在しない場合のURLを/preview/new
にしています。
これはNext.js側でpages/preview/[slug].tsx
しか配置していないためです。
もし/preview
で遷移させたい場合は、pages/preview/index.tsx
も用意しましょう。