質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

157閲覧

年ごとに月別アーカイブリストを作りたい

obito

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2024/07/15 09:04

実現したいこと

月別アーカイブのリストをつくり、更にそれを年ごとにグループ分けしたい

例)
2024ねん
1がつ 2がつ 3がつ 4がつ

2023ねん
1がつ 2がつ 3がつ 4がつ 5月

このように月ごとのアーカイブリンクを更に年ごとで動的に出力したいです。
例えば、現在2024年なので来年の2025年の1月に記事を投稿したとすると

例)
2025ねん
1がつ

2024ねん
1がつ 2がつ 3がつ 4がつ

2023ねん
1がつ 2がつ 3がつ 4がつ 5月

といったように自動で増えていくようにしたいです
2023ねんという文字はリンク無しで、年数だけを動的にテキストで表示させたいです
1がつ 2がつ...の文字は記事が投稿されている月をリンク付きで出力したもので、クリックするとその月のアーカイブページに遷移します。

発生している問題・分からないこと

以下のようにwp_get_archives()を使い月別アーカイブをリストで出力するところまではできているのですが、年数の部分を動的にする方法が分かりません。

該当のソースコード

PHP

1<aside class="aside"> 2 <div class="aside__year"> 3 <p class="aside__year-heading">年数が入ります</p> 4 <ul class="aside__year-list"> 5 <?php 6 $args = array( 7 "type" => "monthly", 8 'post_type' => '〇〇', 9 ); 10 wp_get_archives($args); 11 ?> 12 </ul> 13 </div> 14</aside>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

⓵$current_year = date('Y');
echo $current_year;
を使う
→現在の年数が出力されただけで記事の年数とは別だった

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

obito

2024/07/16 08:23

<aside class="aside"> <p class="aside__heading">アーカイブ</p> <div class="aside__year"> <?php global $wpdb; // 投稿のある年を取得 $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' ORDER BY post_date DESC"); ?> <?php foreach ($years as $year) : ?> <p class="aside__year-heading"> <?php echo $year; ?>ねん </p> <ul class="aside__year-list"> <?php $months = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT MONTH(post_date) AS month, COUNT(ID) as post_count FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' AND YEAR(post_date) = %d GROUP BY month ORDER BY month ASC", $year )); foreach ($months as $month) : ?> <?php // 月の数字を日本語表記に変換 $month_name = get_japanese_month($month->month); // リンクURLを生成する $month_link = get_month_link($year, $month->month); ?> <li> <a href="月別アーカイブのリンクが入ります"> <?php echo $month_name; ?> </a> </li> <?php endforeach; ?> </ul> <?php endforeach; ?> </div> <?php // 月の数字を日本語表記に変換する関数 function get_japanese_month($month_number) { switch ($month_number) { case 1: return '1がつ'; case 2: return '2がつ'; case 3: return '3がつ'; case 4: return '4がつ'; case 5: return '5がつ'; case 6: return '6がつ'; case 7: return '7がつ'; case 8: return '8がつ'; case 9: return '9がつ'; case 10: return '10がつ'; case 11: return '11がつ'; case 12: return '12がつ'; default: return ''; } } ?> </aside> これでなんとか理想の表示までは再現できました。 しかし年ごとの月別アーカイブのリンクの出力がうまく行かずに困っています。 wp_get_archivesでは年の指定ができないようで困っています。 $yearに投稿のある年数、$month->monthに投稿のある年の月をいれるところまではできています。 あと少しなのですがこれをつかってどうかできないでしょうか?
obito

2024/07/16 09:07

<aside class="aside"> <p class="aside__heading">アーカイブ</p> <div class="aside__year"> <?php global $wpdb; // 投稿のある年を取得 $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' ORDER BY post_date DESC"); ?> <?php foreach ($years as $year) : ?> <p class="aside__year-heading"> <?php echo $year; ?>ねん </p> <ul class="aside__year-list"> <?php $months = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT MONTH(post_date) AS month, COUNT(ID) as post_count FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' AND YEAR(post_date) = %d GROUP BY month ORDER BY month ASC", $year )); foreach ($months as $month) : ?> <?php // 月の数字を日本語表記に変換 $month_name = get_japanese_month($month->month); ?> <li> <a href="<?php echo home_url("/").'/'.$year.'/'.'0'.$month->month.'/?post_type=投稿タイプスラッグ名'; ?>"> <?php echo $month_name; ?> </a> </li> <?php endforeach; ?> </ul> <?php endforeach; ?> </div> <?php // 月の数字を日本語表記に変換する関数 function get_japanese_month($month_number) { switch ($month_number) { case 1: return '1がつ'; case 2: return '2がつ'; case 3: return '3がつ'; case 4: return '4がつ'; case 5: return '5がつ'; case 6: return '6がつ'; case 7: return '7がつ'; case 8: return '8がつ'; case 9: return '9がつ'; case 10: return '10がつ'; case 11: return '11がつ'; case 12: return '12がつ'; default: return ''; } } ?> </aside> このコードで解決しました
obito

2024/07/16 09:22

<aside class="aside"> <p class="aside__heading">アーカイブ</p> <div class="aside__year"> <?php global $wpdb; // 投稿のある年を取得 $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' ORDER BY post_date DESC"); ?> <?php foreach($years as $year) : ?> <p class="aside__year-heading"> <?php echo $year; ?>ねん </p> <ul class="aside__year-list"> <?php $months = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT MONTH(post_date) AS month, COUNT(ID) as post_count FROM $wpdb->posts WHERE post_type = 'komorebi' AND post_status = 'publish' AND YEAR(post_date) = %d GROUP BY month ORDER BY post_date DESC", $year )); foreach ($months as $month): // 月の数字を日本語表記に変換 $month_name = get_japanese_month($month->month); ?> <li> <a href="<?php echo home_url(" /").'/'.$year.'/'.sprintf('%02d', $month->month).'/?post_type=komorebi'; ?>"> <?php echo $month_name; ?> </a> </li> <?php endforeach; ?> </ul> <?php endforeach; ?> </div> <?php // 月の数字を日本語表記に変換する関数 function get_japanese_month($month_number) { switch ($month_number) { case 1: return '1がつ'; case 2: return '2がつ'; case 3: return '3がつ'; case 4: return '4がつ'; case 5: return '5がつ'; case 6: return '6がつ'; case 7: return '7がつ'; case 8: return '8がつ'; case 9: return '9がつ'; case 10: return '10がつ'; case 11: return '11がつ'; case 12: return '12がつ'; default: return ''; } } ?> </aside> このコードで解決しました。 ※上の補足したコード(削除されていなければ)は誤りです
guest

回答1

0

自己解決

年を指定して月別アーカイブを出力するテンプレートタグがないっぽいので<?php home_url('/'); ?>を使い手動でリンクを書きました。
$month->monthには取得した月が数字として入っていますが、その段階では0がついていません
月が1桁の数字の場合は前に0をつけないとリンクがうまくいかないのでsprintf('%02d', $month->month)とすることで、1桁の数字の場合、例えば1の場合は01となるようにしています。
これを忘れないように気を付けて下さい。

投稿2024/07/16 09:26

obito

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問