• ..

NodeJS

    Contentful Preview API で参照中の投稿のフィールド値を URL で使いたい

    結論から言うとできません。参照

    (2019-02)時点のこのサイトでは、 Post コンテンツタイプで親となる Note コンテンツタイプの投稿を必ず1つ参照しなければならないという形で管理しています。そしてあまり無意味な URL にしてはいけなかったので、 Post コンテンツタイプを表示するページ(?note=xxx&post=yyy)では、

    • xxxnoteというフィールド名で参照する Note コンテンツタイプのslugフィールド値
    • yyyは Post コンテンツタイプのtitleフィールド値

    のような形にしました。ですのでコンテンツプレビュー API でもその2つの値を取得する必要があります。

    確認したこと

    コンテンツプレビューの URL ではentryで投稿オブジェクトが格納されていてこれを JavaScript のオブジェクトアクセスのように辿って、使いたい値を使うという感じです。またそれは{}で囲んで使います。

    なので僕は以下のような Post コンテンツタイプのプレビュー URL に以下のように設定しました。(domain.comは適当です)

    http://domain.com/note/post?note={entry.fields.note.fields.slug}&post={entry.fields.title}

    しかし、これはうまく動きません。entry.fields.note.fields.slugの箇所がundefinedとなってしまいます。

    次はこんな URL を試しました。なぜsys.idが分かったかというと確かドキュメントに書かれてたからじゃなかったからかなと思います。(忘れた;)

    http://domain.com/note/post?note={entry.fields.note.sys.id}&post={entry.fields.title}

    これはちゃんと何かしらの値が埋められた URL が発行されました。つまり参照のメタ情報(sys)は扱えるが、フィールド値は使うことができない仕様のようでした。

    一応このことについて問い合わせてみたいのがトップの参照リンクです。

    The slug of content type Note can be obtained by passing entry ID of content type Post, however, unfortunately it is not possible to be used in content preview directly.

    なんとかコンテンツプレビュー API に対応する

    コンテンツプレビュー API で渡ってくる値用のクエリを定義して、「そのクエリが含まれている URL ならコンテンツプレビューで表示する」というようにするしか無いかなと思います。つまり、コンテンツプレビューように、

    http://domain.com/note/post?__noteId={entry.fields.note.sys.id}&__postId={entry.sys.id}

    みたいな。一応プライベートなものですよみたいに_を頭に付けるなどでやるしかないかなと思います。