JSで最新投稿を強調
WordPressのHPで投稿一覧を画面に表示するのはWPデフォルトやプラグインのウィジェット配置したりテーマ自体に強調機能入ってるものも多いです。
今回は最新の投稿の強調表表を画面に埋め込むJS(+CSS)で実装します。
JS(+CSS)で作ったのは、下記の理由からです。
- 諸事情で権限的にphpファイルにアクセスできない
- 使っているテーマの強調表示が最新N件、といった指定方法で期間指定(投稿日からN日以内)ができない
また、この記事のコードは以下を前提としています。
- 固定ページ内に投稿一覧を表示しようとしている
- 「Shortcodes Ultimate」を使ってページに投稿一覧を埋め込んでいる
まずは以下のコードをページに埋め込みます。
処理の内容は大体コメントで記載していますがやってることはざっくり以下です。
- ページ内の一覧の各投稿をListで取得
- 投稿へのリンク(aタグ要素)からURLを取得
- URLに投稿日付が含まれているので取得
- ページを表示した日が投稿日からN日以内かチェック(コードは30日の例)
- 30日以内の場合インライン要素で文字列とCSSのクラスを追加
function postsBlink() {
/** 投稿一覧を取得 */
const postsList = document.getElementsByClassName('su-post');
/** 各投稿のIDを取得 */
const idList = Array.prototype.map.call(postsList, function(postsList){ return postsList.id; })
/** 日付と強調表示期間(30日) */
const today = new Date();
const term = 30;
/** 投稿から30日以内のものをピックアップ */
const newIdList = idList.map((id)=>{
let aTagElement = document.getElementById(id).firstElementChild;
/** URLから投稿日を抽出(正規表現で「0000/00/00」の形式を抽出) */
let href = aTagElement.href;
const datePattern = '[0-9]{4}/[0-9]{2}/[0-9]{2}';
const postDateString = href.match(datePattern)[0];
/** 投稿日と投稿日から30日後の日付を算出 */
const postDate = new Date(postDateString);
let postDateLimit = new Date(postDateString);
postDateLimit.setDate(postDate.getDate() + term);
/** 投稿日から30日以内の投稿であれば強調表示*/
if(postDate <= today && today <= postDateLimit) {
/** 追加要素(インライン要素)生成 */
const newElement = document.createElement("span");
const newContent = document.createTextNode(" NEW!");
newElement.appendChild(newContent);
/** 文字が点滅するCSSクラスを追加 */
newElement.classList.add('blink');
/** ニュース項目(aタグ要素)にインライン要素を追加 */
aTagElement.appendChild(newElement);
}
});
}
/* 画面描画後に処理を実行 */
window.onload = postsBlink;
JSはあくまでクラス付与してるだけなので
CSSで以下のように強調表示するようにスタイルの定義を行います。
.blink {
color: red;
-webkit-animation: blink 1s ease-in-out infinite alternate;
animation: blink 1s ease-in-out infinite alternate;
}
@-webkit-keyframes blink {
0% {opacity: 0;}
100% {opacity: 1;}
}
@keyframes blink {
0% {opacity: 0;}
100% {opacity: 1;}
}
JSとCSSが効いていれば以下のように表示されます。
(以下は常に強調表示させたいので日数制限外してます。)
- 【JSメモ】2つのオブジェクトの差分を取得
- 【ひと口レビュー】Lies of P
- 【Node】YoutubeLiveのアーカイブからチャットを取得
- 親画面に子画面の入力内容を反映する(Javascript)
- Eclipseのデバッグ中の変数値変更(特にDate型)
- Nextjsチュートリアル4(動的ルーティングとAPI)+コンテキストフック
- Nextjsチュートリアル3(レンダリングとデータ取得)
- Nextjsチュートリアル2(コンポーネントとスタイル)
- Nextjsチュートリアル番外(ESLint+Prettier)
- Nextjsチュートリアル1(テンプレート作成とルーティング)
- JSで最新投稿を強調表示する方法
- QTTabBarからの乗り換え
- はじめに
他にも少し処理とスタイルを変えることでリンク自体を点滅表示させたりできるので必要に応じてカスタマイズできます。
今回は以上です。