投稿を利用して、トップを固定ページ風に

2021年3月19日

最新投稿のトップに固定ページを挿入するようなことを考えていたが、どうにも上手く行かず、結局、一つの投稿を利用しトップに配置(先頭に固定)することで、それっぽく改変した。もちろん、Wordpressやテーマの設定だけではできず、一部テンプレートも弄ることに。

レイアウト設定

Luxeritas ルクセリタス テーマの場合:「外観」ー「カスタマイズ」ー「グリッドレイアウト」のリスト型トップページの項目で最初の何件を通常スタイルにするかを決める。ここでは、固定ページ風にするので1件。

固定ページ風の投稿を作る

新規投稿にて、設定する投稿を作る。その際に、「ブログのトップに固定」にチェックを入れる。この設定よりこの投稿は 「sticky_post」となり、表示形式も全文表示(抜粋しない)となる

新しく作成したトップ固定表示用の投稿

不要なタイトルやメタデータなどを非表示に

固定ページ風に見せるために、投稿で表示される「タイトル」、「メタデータ(日付)」、「readm more」を非表示にする。これを実現するには、通常の設定からでは難しかったので、テンプレートファイル(ここでは、loop-grid.phplist-content.php)を弄ることに…。ソースコードの解析を行って、当たりを付けたソースコードの中からそれぞれのHTMLを生成している部分を試行錯誤(やはり print分が活躍)の末に探し出し、トップページかどうかの条件分岐を追加。

  • home.php:トップページ
  • loop-grid.php:グリッド表示用PHP → タイトル、メタデータの非表示
  • list-content.php:リスト型表示用PHP → read moreの非表示

記事のnext<->prevから固定ページ風投稿を除外

記事の詳細で表示されるページのnext <-> prevの対象から、この固定ページ風の投稿を除外する必要がある。そのために本投稿のカテゴリを新たに”fixed“とし、このカテゴリの投稿を除外することとした。

  • single.php: 投稿ページ表示用PHP →get_adjacent_pots()関数でcategory_IDを引数として指定すること除外
  • カテゴリー名からカテゴリーIDを得る関数 →get_category_ID()

(余談)カテゴリー一覧からカテゴリーIDを知る方法 → 記事一覧のURLで、category&tag_ID=XXXをチェック

関連記事から固定ページ風投稿を除外

関連記事に表示されているこの固定ページ風の投稿を除外する必要がある。ソースコード(related.php)を解析してみるとpost_idは、同じカテゴリーに属する投稿、同じタグを持つ投稿に限定されているが、何故だかカテゴリ名:fixedで指定された投稿も対象となっている。

さらに詳しく調べると、どうやらこの関数内で利用している WP_Query()関数の仕様として下記のような記述を発見!!。

post__inにて投稿IDをセットしているが、先頭固定表示も投稿については常に取得されるらしい。(そりゃ、あかんわなあ~)

さらにさらに、突っ込んで調べるとクエリ―の引数アレイで、除外する設定があるらしい。その方法がこちら

  1. get_option( 'sticky_posts’ ) で、先頭固定表示の投稿を得る。
  2. 引数アレイに 'ignore_sticky_posts’  を追加。 trueなら除外する。
  3. 引数アレイに 'post__not_in’ 除外対象の投稿を追加。1.で得られたarrayを渡す。

ソースコードを上に書き換えたらOK。

サイドバーからLuxeritasオリジナルの新着記事から固定風投稿を除外

※Wordpress5.7へアップデートしたことにより、テーマであるLuxeritasのアップデートを実施した結果、これが正常に機能しなくなっている。原因は、親テーマ内にあるwidget.phpが上書きされてしまい、カスタマイズした部分が消えてしまったからである。どのような修正が必要か調査する必要あり。

固定サイドバーに表示しているLuxeritasオリジナルの新着記事一覧表示から先頭固定表示の投稿を表示させないようする必要がある。ソースコードの解析の結果、サイドバーの作成はウイジェットからできており、対象となるソースは。incフォルダーにあるwidget.php。div IDは、"thk-new“。

上記、関連記事の場合と同様に、WQ_Query()関数への引数で同様の処理を追加。