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

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

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

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

PHP

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

Q&A

解決済

2回答

2930閲覧

投稿一覧に年と月の見出しを付けたい

8-0_nyan5

総合スコア2352

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/10/06 05:27

###前提・実現したいこと
こちらの記事「WordPress 投稿一覧に年と月の見出しを付ける方法」を元にコードを書き換えたが、うまく動作しません。

日付の代わりに、カスタムフィールドの値を使って、同じことを実現しようとしています。

カスタムフィールド('meta_key' => 'publication_date')には、テキストで日付が入っています。
例:2016/10/06、デフォルトで、11/11/11(記事の投稿時点で日付がわからないものがあるため)。

###該当のソースコード

<?php // 投稿一覧に年と月の見出しを付ける $args = array( 'post_type' => 'shop', // 任意のカスタム投稿タイプを指定 'posts_per_page' => -1, // 1ページに表示する最大投稿数を指定、-1は全てを表示 'order' => 'DESC', // 降順でソート 'orderby' => 'meta_value', 'meta_key' => 'publication_date', ); $the_query = new WP_Query($args); if($the_query->have_posts()): $post_year = false; // 年の比較用変数の初期化 $post_month = false; // 月の比較用変数の初期化 $now0 = post_custom('publication_date'); $now2 = date("Y",strtotime($now0)); $now3 = date("m",strtotime($now0)); echo '<h1>投稿一覧</h1>'; while ($the_query->have_posts()): $the_query->the_post(); if( $post_month != $now3 ) { // 比較の値と投稿月が異なる場合に以下を出力 if ( $post_month !== false ) { // 比較の値と投稿月が異なる場合に以下を出力 echo '</ul>'; } if ( $post_year != $now2 ) { // 比較の値と投稿年が異なる場合に年を出力 echo '<h2>'.$now2.'年</h2>'; //投稿の年を出力 } echo '<h3>'.$now3.'月</h3>'; //投稿の月を出力 echo '<ul>'; } echo '<li><a href="'.get_the_permalink().'">'.post_custom('publication_date').'</a></li>'; // 投稿のリンクとタイトルを出力 $post_year = $now2; // 年月の比較用の変数に今の投稿の年月を代入 $post_month = $now3; // 年月の比較用の変数に今の投稿の年月を代入 endwhile; wp_reset_postdata(); echo '</ul>'; endif; ?>

表示結果
表示結果

なぜか、1970年の01月になってしまいます。

参考にしたサイトのまま、投稿日を元にしたものだとちゃんと表示されます。

解決の糸口が見つかればありがたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
wordpress4.6.1

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

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

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

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

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

guest

回答2

0

そもそも「$now0」には何が入っているんでしょうか(echoなりprintなりして確かめてみてください)。
おそらく「1970/01/01」が表示されているのは日付が正しく取得できていないためだと思われます。

投稿2016/10/06 15:04

goute

総合スコア216

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

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

8-0_nyan5

2016/10/07 00:01

ループの中で「$now0」を表示すると、何も表示されません。 「$now2」が1970、「$now3」が01を返します。 どうしたものでしょう。
8-0_nyan5

2016/10/07 01:00

直接値を入れてみました。 ``` $now2 の代わりに date("Y",strtotime(post_custom('publication_date'))); $now3 の代わりに date("m",strtotime(post_custom('publication_date'))); ``` うまくいったように見えたのですが、1970年からしか扱えないようで、 デフォルトで使用する日付が使えません。 (11/11/11が2011/11/11になってしまう) DateTimeというのがあるみたいなのですが、 これを直接入れる方法がわかりません。 どうしたものでしょう。
guest

0

ベストアンサー

post_custom はループ内で使わないと何も値が入りません。厳密に言うと $the_query->the_post(); の後でないと値が入りません。

PHP

1// $now0などの初期化が必要であればこの位置で。 2while ($the_query->have_posts()): $the_query->the_post(); 3 if ( empty( $now0 ) ) { 4 $now0 = post_custom('publication_date'); 5 $now2 = date("Y",strtotime($now0)); 6 $now3 = date("m",strtotime($now0)); 7 } 8 /* 省略 */ 9}

投稿2016/10/07 02:31

kei344

総合スコア69606

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

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

8-0_nyan5

2016/10/07 03:15

ありがとうございます。 if ( empty( $now0 ) ) { これの使い方がよくわかりません。 これなしで、$the_query->the_post(); の後に$now、、 を入れると1970年まではいいのですが、それより前が1970年の扱いになってしまいます。 if ( empty( $now0 ) ) { の使いどころが肝なのでしょうか。
kei344

2016/10/07 03:23

> 1970年まではいいのですが、それより前が1970年の扱いに 何年からありますか?またサーバOSはWindowsですか? 【PHP関数講座:date | そふぃのphp入門】 http://php-beginner.com/function/datetime/date.html > 通常では有効なタイムスタンプの範囲が 1901年12月13日 20:45:54 GMT ~ 2038年1月19日 03:14:07 GMT までです。Windowsでは 1970年1月1日 ~ 2038年1月19日 GMT に制限されます。
8-0_nyan5

2016/10/07 04:17

ありがとうございます。 >何年からありますか? 1940年前後から >サーバOSはWindowsですか? 現在は、ローカル環境(windows10)でしています。 アップ予定のサーバーは、Linux(バージョン不明)のようです。 そのサーバーで試してみたところ、 4桁(1111)はそのままいけるようですが、 3桁(111)は1970に2桁は(11)は2011になるようです。 理由がわかったので、デフォルトの数値を変更して対処したいと思います。 つまずいたらまた質問したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問