WordPressアーカイブが長いので短くしたい
昔の記事をインポートしたら10数年分の記事となり、アーカイブ=過去記事のリストを「2022年 7月」というふうな文字を縦に羅列しているので長くなりすぎてかっこ悪い。ネットで調べると何種類かあるが、どれも決定打がない。定番とかもなさそう。いま段階ではまだ試行錯誤して楽しんでいる段階の内容である。
目次
候補
- wordpress元々のアーカイブブロックの設定で「年」「月」「週」「日」ごとの表示が選べる
- プラグイン「Compact Archives」のインストール
- 表示部分のPHPを変更。アーカイブ取得のIFに最近のものは「月」で昔のは「年」で指定
- function.phpの変更にてアーカイブ取得IFにフィルターを掛けて、年ごとに月をまとめて表示する
手っ取り早い順に記述しましたが、調査の段階では3.→4.→.2.→1.と発見したので、欲張り表示にしたいとかPHPをいじりたいとか言う気持ちになっている。
最終やりたいのは3.+4.の最近のものは4.で「年ごとに月をまとめて表示」、過去の年のものは「年単位で表示」としたい。
これを目指して調査して試して実践していき、ここのページは更新していきます。
候補1.ブロック種別ごとに細かく設定
外観→ウィジットでサイドバーとかフッターごとにブロックの表示を設定できます。その中でアーカイブを表示しているところがありますが、そのアーカイブブロックの設定を変更して「ドロップダウンで表示」「投稿数を表示」とかもできる。だが、なんかわかりにくいのでイマイチ。最近の記事は細かく月単位、昔の記事は幅広く年単位でリンクしたい。なんだかんだ、ブロックについて勉強になった。
候補2.プラグイン「Compact Archives」のインストール
これが手っ取り早いか、一律「2022:07 06 05」となる、やはり3.4.を見たからこのハイブリッドがしたい。頑張ってみて、イマイチだったらプラグインにしよう。
「jQuery Archive List Widget 」というのもあるらしい。
候補3.表示部分のPHPを変更。アーカイブ取得のIFに最近のものは「月」で昔のは「年」で指定
参考サイト
https://qiita.com/noqua/items/02307a2f45f61c882714
これ、いいですね。
問題
多少問題ありで、sidebar.phpなどを変更と書いていましたが、どこに書いていいのかがよくわからないくて、とりあえず今までいじってきたlighttnigのテーマの中でサイドバーを表示している場所があるのでそこを修正。表示できるようになりました。
このやり方での問題は「アーカイブのブロック」と「アーカイブのブロックを使ってないところ」の2箇所に変更を加えなければなりません。そして、もうlightningのテーマはいじりまくってまして更新による後戻りが怖くなってきてますが、次の候補4はfunction.phpにアディショナルでコードを追加するのでその点、安全。しかもアーカイブ取得関数自体に影響するのでブロックでもsiteのphpでもその関数を使っているので一律影響させれます。
ということで試してますが、最終この3.と4.のハイブリッドになるのではないかと思っております。アディショナルなプラグインが作れれば良いですね。
ちなみに、ここでずっと疑問に思っていた「lightningはカテゴリーを2重に表示してしまう問題」の謎にも衝突。これは別記事で解説と解決策を書きます。そして、Wordpressの概念がちょっと理解でき勉強になりました。
候補4.アーカイブ取得の関数にフィルターを入れる
function.phpにget_archives_link()のフィルターのコードを追加
このサイトを参考にやりましたが、
https://usortblog.com/widgetarchiveshorter/
function.phpに独自のコードを書き、既存コードが吐き出す文字列=htmlコードにフィルターを掛け、変更することができるようです。
lightningのfunction.phpは2つあり、function.phpどっちでも反映されるみたい。_g3下と上位位置のlightning直下がありますが上位位置のfunction.phpを修正する。
問題
色々半端でそのまま使えませんでしたので修正しています。
1.リンクのURLが固定で「/サイトのurl/年/月/」
わたしのサイトでは「/サイトのurl/date/年/月」でそのまま使えず、dateだけ追加しても良かったのですが、そもそも元々のURLをそのまま使えばいいでしょってことでPHPを結構調べて、正規表現で「''」に囲まれたパスを抽出することに落ち着く。正規表現って覚えられなくていつも調べている。
2.このフィルターは年/月だけでなく、年のみでも呼ばれるため、その場合、空白になる
本サーバーでは使ってませんでしたが、ローカルテストサーバーでは12個以降は年だけ表示にしていたので、気づいた。他にもあるかもしれないが、「月」を含む場合のみ処理をして、含まない場合はそのままの文字列を返すようにした。ちなみに、「週」「日」でも呼ばれます。
3.12月に投稿が無い年は年表示がされない。12月をキーに表示しているので。後から気づきました。その年が初めてかのフラグで管理
4.現在の年の月の記事が1つも書かれてないとき、年が表示されない
5.余分なhtmlタグが出ている
現在のコード
/* ウィジェットで表示されるアーカイブを短く表示させます
* 1.リンクが/サイトurl/2022/07というように固定される。リンクは設定次第で変わるので、リンクはそのまま使いたい。 →解決
* 2.月や週や日で指定された場合の考慮がない →解決
* 3.12月に記事がない年は年表示がされない →解決
* 4.今月記事を書いてないと年表示がされない →解決
* 5.今年の記事しかなく、今月の記事がない場合、2回アーカイブを呼ばれると年が表示されない。→未解決
* 月表示の後不要なhtmlタグが出ている「</a></li>」 →解決
* もうガンガン作り変えます
*/
function my_archives_link($link_html){
$currentMonth = date('n');
$currentYear = date('Y');
//年指定の場合は何もしない
if(strpos($link_html,'月') != true){
return $link_html;
}
//年/月/(日でもOK?)の場合
// アーカイブの年月HTMLを編集
$ym = explode('年', $link_html); //ym[0]=<li><a href='http://localhost/?m=202206'>2022 ym[1]=6月</a></li>
$monthArray = explode('月', $ym[1]); //$monthArray[0]=6 [1]=</a></li>
$month = $monthArray[0]; //=6
$year = intval(strip_tags($ym[0])); //2022 remove php html tags
//$linkMonth = substr('0'.$month, -2); //0+月の後ろ2文字 012 → 12, 07→07、2桁にしている いらない
//リンク先
preg_match_all('/\'.+?\'/', $ym[0], $urlArray);//正規表現で''で囲まれたURLを抽出
$url = $urlArray[0][0];
//echo '$urlEX =';echo $url;var_dump ($linkMonthArray); //for debug
$linkMonth = '<a href='.$url.' style="white-space: nowrap;">'.$month.'月 </a>';
$linkYear = ''; //条件により生成する
$formatYear = '<span style="font-weight:bold;">%s年</span><br />';
//$linkYearを条件により作成し、$_SESSION['printyear']を今処理中の年を入れる。これは1年に1度しか処理させないため
//今まで出力していた年とは違う場合=初めてその年を出力するとき
if ($_SESSION['printyear']!=$year) { //初期値は""空白である。2回目以降呼び出されると最後に処理した年となる
//※今年の記事しかない場合に2回目に呼ばれると$_SESSION['printyear']が今年から更新されないので引っかからない
$linkYear = sprintf($formatYear, $year); //1年目「年+改行」
$_SESSION['printyear']=$year; //[年+改行]出力した年を記録
if($currentYear != $year){ //今年ではない場合
$linkYear = '<br />'.$linkYear; //さらに頭に[改行]を加える「[改行]+年+[改行]」
}
}
//2回目に呼ばれた時の対策1.:今月だったら間違いなし。不十分。今月書いてなかったらダメ
else if (($currentMonth == $month) AND ($currentYear == $year)){
$linkYear = sprintf($formatYear, $year); //1年目「年+改行」
$_SESSION['printyear']=$year; //[年+改行]出力した年を記録
}
//そうでない場合は初期値$linkYear = ''
//'[改行]or[無]2020[改行]' or '無' + '<a href='.$url.' style="white-space: nowrap;">6月</a>'
return $linkYear.$linkMonth; //$link_htmlを$linkYear + $linkMonthに加工して返す
}
add_filter('get_archives_link', 'my_archives_link');
結果の表示
3.+4.の結果です。3.により、月別表示の12個分とそれより以前は年別表示になってます。更に、月別表示の分は元々「2022年7月[改行]2022年6月」と冗長に表示していたものが4.のフィルターにより2022とかの年表示は1回だけになり、その後月だけを羅列する表示になりました。
上記は問題の1.と2.を解決した状態の結果です。
ここまでやって問題ない気分でしたが、実は昔の記事とかは12月に記事がないものがあって、「3.」の対応を切ると見えたのですが、そのパターンはちゃんと年の表示ができてませんでした。
その後、3.4.までの課題を解決しましたが、
5.今年の記事しかなく、今月の記事がない場合、2回アーカイブを呼ばれると年が表示されない。→未解決
2回目呼ばれるようなことをしなければよいので、これで良しとするか?lightningのデフォルトは2回呼ぶのでその次に書いてある対策記事も読んでください。
PHPコードの編集
これまでシェルでsshしてemacsでコードを変えてました。具体的にはローカル環境で試して、完成したらサーバーに置く。
これが、wordpress上でも気軽にできるみたい。
外観-テーマファイルエディターを選択するとPHP他ファイルを編集できます。しかもこちらは保存時に構文間違えをチェックしてくれるのがよい。でもなんだか日本語コメントの文字コードがおかしいのか、それでエラーになることもある。他人のコードをコピペしたり、ちょっと変更するのはこれが良い。