投稿日:2024年12月21日
更新日:2024年12月22日
この記事は「Vektor WordPress Solutions Advent Calendar 2024」の12月21日(土)の記事になります。
一昨日 と昨日 の記事の瀬戸内ことりさんからバトンを引き継いでお届けします。
先日、下記のような相談がありました。
WordPressで、カテゴリー一覧ページを作り、絞り込み表示をさせたい。
さらに、他のページからボタンクリックで、絞り込まれた状態でページ遷移させたい。
検証しました。
最初にお見せします。
これがそのサイトです。
色々と調べたら参考になるサイトが複数ありましたが、チャレンジも兼ねて自作してみることにしました。
テーマはLightning G3 を使用。
▲Lightning G3 は2021年5月10日にリニューアルされました。
最新バージョンは15.28.2(2024年12月7日現在)になります。ビジュアルがかっこいいです!
以下がその手順です。
固定ページの作成
▲「カテゴリー一覧」と「カテゴリー検索」という固定ページを作成しました。
表示設定で「カテゴリー一覧」を投稿ページ。「カテゴリー検索」をホームページに設定してあります。
▲「カテゴリー検索」「カテゴリー一覧」の内容。
PHPに表示する内容を記述するのでタイトルだけ入力しています。
▲子テーマの内容です。
※バージョンアップに伴い、子テーマの構成が変わったりします。上図の構成や下記で記述しているソースコードが動かなくなる可能性もあるのでご注意ください。
「カテゴリー検索」は_g3内の index.php。
「カテゴリー一覧」は _g3 -> template-parts -> main-archive.php を使用します。
スタイルは、css内の style.css に持たせ、子テーマのcssと役割を分けました。
js内の costomize.js に各ロジックを記述しています。
_g3 -> template-parts -> loop-item.php
は出力されるコンテンツの詳細を保持しています。
下記のような記述になっています。
$options = array(
// card, card-noborder, card-intext, card-horizontal , media, postListText.
'layout' => 'media',
'display_image' => true,
'display_image_overlay_term' => true,
'display_excerpt' => true,
'display_date' => true,
'display_new' => true,
'display_taxonomies' => false,
'display_btn' => true,
'image_default_url' => false,
'overlay' => false,
'btn_text' => __('Read more', 'lightning'),
'btn_align' => 'text-right',
'new_text' => __('New!!', 'lightning'),
'new_date' => 7,
'class_outer' => 'vk_post-col-xs-12 vk_post-col-sm-12 vk_post-col-lg-12',
'class_title' => '',
'body_prepend' => '',
'body_append' => '',
);
VK_Component_Posts::the_view( $post, $options );
▲例えば、falseになっているところを全てtrueにすると上図にように出力されます。
2行目のコメントアウトしている箇所がデザインの種類です。
'layout' => 'media';
で上図のようになります。
任意で設定しましょう。
▲左が card。右が card-noborder。
囲み罫があるかないかの違いで横幅いっぱいの体裁になります。
▲card-intext
マウスオーバーで右図のように透過コンテンツが下からスライドアップします。
横幅いっぱいの体裁になります。
▲card-horizontal
横組みのカード形。
▲postListText
アイキャッチは出力されません。
では、各ファイルをみていきましょう。
index.php
<?php if (is_page(63)) : ?>
<p style="margin-bottom:0;">クリックで検索結果ページに遷移します。</p>
<div id="catBtnWrap">
<p class="catBtn" id="catSearchBtn01">カテゴリー01</p>
<p class="catBtn" id="catSearchBtn03">カテゴリー03</p>
<p class="catBtn" id="catSearchBtn05">カテゴリー05</p>
<p class="catBtn" id="catSearchBtn07">カテゴリー07</p>
<p class="catBtn" id="catSearchBtn09">カテゴリー09</p>
</div>
<?php endif; ?>
▲_g3フォルダ直下のindex.php
62行目辺りに site-body-container
をクラス名に出力するdiv
が記載されているので、その下に上のコードを追記します。
検索したいカテゴリー対象のボタンで、今回は奇数のカテゴリーにしてみました。
is_page()
関数で出力対象の固定ページIDを指定しています。
main-archive.php
<div id="catBtnWrap">
<p class="catBtn" id="catBtn00">全て表示</p>
<p class="catBtn" id="catBtn01">カテゴリー01</p>
<p class="catBtn" id="catBtn02">カテゴリー02</p>
<p class="catBtn" id="catBtn03">カテゴリー03</p>
<p class="catBtn" id="catBtn04">カテゴリー04</p>
<p class="catBtn" id="catBtn05">カテゴリー05</p>
<p class="catBtn" id="catBtn06">カテゴリー06</p>
<p class="catBtn" id="catBtn07">カテゴリー07</p>
<p class="catBtn" id="catBtn08">カテゴリー08</p>
<p class="catBtn" id="catBtn09">カテゴリー09</p>
<p class="catBtn" id="catBtn10">カテゴリー10</p>
</div>
▲検索ページとほぼ同じ。
56行目辺りに post-list
をクラス名に出力するdiv
が記載されているので、その上に上のコードを追記します。
customize.js
jQuery(function ($) {
// 全てのカテゴリーボタン
let allCatBtnArry = [
'#catBtn00',
'#catBtn01',
'#catBtn02',
'#catBtn03',
'#catBtn04',
'#catBtn05',
'#catBtn06',
'#catBtn07',
'#catBtn08',
'#catBtn09',
'#catBtn10'
];
// 全てのコンテンツ カテゴリー
let allCatArry = [
'.category-category01',
'.category-category02',
'.category-category03',
'.category-category04',
'.category-category05',
'.category-category06',
'.category-category07',
'.category-category08',
'.category-category09',
'.category-category10'
]
/////////////////////////////////
// ▼▼▼ 絞り込みながらページ遷移
/////////////////////////////////
const catBtnClick = (targetSearchBtn, targetQuery, targetCatrgory, targetBtn) => {
$(targetSearchBtn).click(function () {
location.href = 'home/?search=' + encodeURIComponent(targetQuery); // クエリ追加。ページ遷移 catにすると動作がおかしくなる
});
let query = location.search.split('='); // クエリを'='で分割
let catResult = decodeURIComponent(query[1]); // '='以降のクエリ
if (catResult == targetQuery) { // クエリとカテゴリー表記が同じならば
$(allCatArry.join(',')).css('display', 'none'); // 指定以外のカテゴリーを非表示にする
$(targetCatrgory).slideDown('slow'); // 対象のカテゴリーコンテンツを表示
$(targetBtn).css({ // ボタンの色を黒に
backgroundColor: '#000',
color: '#fff',
transition: '.3s'
});
$('#catBtn00').css({ // ボタンの色を白に
backgroundColor: '#fff',
color: '#000',
transition: '.3s'
});
}
}
catBtnClick('#catSearchBtn01', 'カテゴリー01', '.category-category01', '#catBtn01');
catBtnClick('#catSearchBtn03', 'カテゴリー03', '.category-category03', '#catBtn03');
catBtnClick('#catSearchBtn05', 'カテゴリー05', '.category-category05', '#catBtn05');
catBtnClick('#catSearchBtn07', 'カテゴリー07', '.category-category07', '#catBtn07');
catBtnClick('#catSearchBtn09', 'カテゴリー09', '.category-category09', '#catBtn09');
/////////////////////////////////
// ▼▼▼ ボタンクリックで対象以外を非表示
/////////////////////////////////
const slideContents = (targetBtn, targetTag) => {
$(targetBtn).click(function () {
$(targetBtn).css({ // ボタンの色を黒に
backgroundColor: '#000',
color: '#fff',
transition: '.3s'
});
let notTargetBtn = allCatBtnArry.filter(function (allCatBtnArry) { // 対象以外のボタン
return allCatBtnArry !== targetBtn;
});
$(notTargetBtn.join(',') + ',#catBtn00').css({ // ボタンの色を白に
backgroundColor: '#fff',
color: '#000',
transition: '.3s'
});
$(allCatArry.join(',')).slideUp('slow'); // 配列を文字列に変換。','でつなぐ
$(targetTag).slideDown('slow');
});
}
slideContents('#catBtn01', '.category-category01');
slideContents('#catBtn02', '.category-category02');
slideContents('#catBtn03', '.category-category03');
slideContents('#catBtn04', '.category-category04');
slideContents('#catBtn05', '.category-category05');
slideContents('#catBtn06', '.category-category06');
slideContents('#catBtn07', '.category-category07');
slideContents('#catBtn08', '.category-category08');
slideContents('#catBtn09', '.category-category09');
slideContents('#catBtn10', '.category-category10');
/////////////////////////////////
// ▼▼▼ 全てを表示
/////////////////////////////////
$('#catBtn00').click(function () {
$('#catBtn00').css({ // ボタンの色を黒に
backgroundColor: '#000',
color: '#fff',
transition: '.3s'
});
let notTargetBtn = allCatBtnArry.filter(function (allCatBtnArry) { // 対象以外のボタン
return allCatBtnArry !== '#catBtn00';
});
$(notTargetBtn.join(',')).css({ // ボタンの色を白に
backgroundColor: '#fff',
color: '#000',
transition: '.3s'
});
$(allCatArry.join(',')).slideDown('slow');
})
});
▲「カテゴリー検索」「カテゴリー一覧」のロジックを1つにまとめました。
32行目〜、「カテゴリー検索」はそれぞれのカテゴリーボタンをクリックすると、?search=カテゴリー01というクエリを持たせ、ページ遷移します。
catBtnClick関数の第2引数とクエリが一致したら、遷移先のコンテンツを一度全て非表示にし、対象のカテゴリーを表示させる仕様にしています。
ボタンの色の変更も行なっています。
64行目〜、「カテゴリー一覧」ページのロジック。
それぞれのボタンクリックで対象のカテゴリーボタンが黒で表示され、対象のカテゴリーが表示されます。
ここでも、最初に一度、全てのカテゴリーを非表示にし、対象のカテゴリーを表示する仕組みにしています。
「全て表示」クリックで「全て表示」ボタンを黒にし、全てのカテゴリーを表示します。
ポイントとして、3〜30行目で、「全てのカテゴリーボタン」と「全てのコンテンツ カテゴリー」を配列にし、85行目、106行目のfilter関数でクリックされた対象から除外、それ以外を表示非表示、cssで設定しています。
配列を文字列に変換する必要があり、 join(',')
のように操作しています。(49、87、92、109、114行目)
もう一度お見せします。
これがそのサイトです。
当初「これはできないのでは。。。」と思っていましたが、進めるにつれ「これは、できるぞ!」という確信に変わりました。
チャレンジすることは良いことですね。
最近、想像することができるようになることが増えてるような気がします。
色々と柔軟にこなしたいと思います。
と、3年前の記事を俯瞰しつつ、少々手直しをして紹介してきました。
上記は子テーマでの方法を紹介してますが、フックで対応したり、プラグイン化したり、色々と勉強したおかげで方法の選択肢も増えてきています。
WordPressのFSE対応により各テーマやプラグインの進化も顕著に感じます。
Lightningは特に対応が早く、安心して使えるテーマだと思います。
本年は1月に山梨 WordPress ミートアップ で。
▲1月に開催された山梨 WordPress ミートアップ
5月にChiba WordPress Meetupと、Lightning G3 開発者、株式会社ベクトル [ Vektor,Inc. ] 代表取締役 CEOの石川 栄和さまから非常に学びを得る年になりました。
▲5月に開催された千葉 WordPress ミートアップ
謹んで御礼申し上げます。
また、何かの機会に勉強させてください。
最後まで読んでくださりありがとうございました。
良いお年をお迎えください。
12月22日(日)は大澤も共同オーガナイザーをさせていただいている「Chiba WordPress ミートアップ 」から渡邉(たいちょ)さん、吉川さん、中山さんが共同でお届けいたします。