CMSのバージョンを移行してから調整を続けていますが、記事の日付表示が直ったので今回はそれについて書いてみます。
これは実際には2つの問題でした。
- 表示フォーマット
- 公開日時データ
まずは表示フォーマットの点です。
標準では表示するかしないか切り替えられるだけ(日時表現だけは可)で、日時だけとか投稿者だけという設定はできません。日時も最初に投稿した時刻に固定です。
Drupal 7ではsubmitted_byというまさにこの表示フォーマットを変更するモジュールが存在しました。これを利用していたのですが、残念ながらDrupal 8以降には対応していません。
これは私だけでなく変更したい需要は多いと思うので類似のモジュールはあるだろうと探していたのですが……
モジュールは見つかりませんでしたがテンプレートを使用する方法があることがわかりました。
テンプレートというのはHTMLの中に{{ date }}
などと書いて置くとこの部分が実際の日付に置換されるといった機能です。簡単なプログラムも書けるのでかなりのことができます。
これで日時を公開日時に変更できました。
続いて公開日時データなのですが、実はこれデータ移行に失敗していまして、データ移行日時になってしまっています。そもそも移行できないデータだったのか移行作業に何か間違いがあったのかわかりませんが、気付いたのが遅くて移行作業からやり直す気にはなれません。
新しい記事は公開日時、移行した記事は初保存日時(前に作成開始日時と書きましたが正確には初保存日時でした)の表示としてお茶を濁そうかとも思ったのですが…… データベースのテーブル構造を見ていたらこれだけ移行できそうだったので挑戦してみました。
まずDrupal 7では公開日時はpublication_date
というテーブルに以下のような形式で記録されています。
nid | published_at
------+--------------
737 | 1508153920
830 | 1514188950
790 | 1510324303
日時はUNIX時刻ですね。
一方、Drupal 10ではリビジョンごとに持っていて、node_field_data
, node_field_revision
の両方に含まれています。以下は前者(後者も似ています)の先頭部分です。
nid | vid | type | langcode | status | uid | title | created | changed | promote | sticky | default_langcode | revision_translation_affected | ds_switch | published_at | content_translation_source | content_translation_outdated
------+-------+---------------+----------+--------+-----+---------------------------------------------------------------------------------+------------+------------+---------+--------+------------------+-------------------------------+-----------+--------------+----------------------------+------------------------------
1313 | 3521 | image_article | ja | 1 | 3 | 最近のお買い物(2019/10) | 1572515086 | 1572529026 | 1 | 0 | 1 | 1 | | 1572529026 | und | 0
1314 | 3523 | image_article | ja | 1 | 3 | MX8315 | 1572703570 | 1572704935 | 1 | 0 | 1 | 1 | | 1572704935 | und | 0
3018 | 8541 | device | und | 1 | 3 | 74F138N | 1666774800 | 1666853199 | 0 | 0 | 1 | 1 | | 1666774800 | und | 0
公開日時は後ろの方のpublished_at
なので、nid
をキーにしてここを書き換えればよいわけです。
私はAWKスクリプトを書いて各nid
毎に以下のようなSQL文を生成してDrupal 10のデータベースに適用しました。もちろん実行前にバックアップを取っています。
update public.node_field_data set published_at = 1508153920 where nid = 737;
update public.node_field_revision set published_at = 1508153920 where nid = 737;
コメントを追加