という質問があり、実際に試して回答しました。
これについての情報が見当たらなかったので、ここで備忘録としてメモしておきます。どういう考えて修正してうまくいったのかも書き出しておきます。SQL文の勉強になるかもですよ! それに筆者も、またどこかで使えるかもしれませんので、残しておくのは役立ちます。
これについての情報が見当たらなかったので、ここで備忘録としてメモしておきます。どういう考えて修正してうまくいったのかも書き出しておきます。SQL文の勉強になるかもですよ! それに筆者も、またどこかで使えるかもしれませんので、残しておくのは役立ちます。
やりたいこと
記事のアーカイブを、各記事に設置した カスタムフィールド(date_field)に沿って、日別アーカイブ表示したいというもの
2017/09/02 (1)
2017/08/19 (2)
2017/07/02 (3)
とかそういう感じに出すってことです。
そして日付をクリックしたら、カスタムフィールド(date_field)の日付が一致したものの一覧がでるということですね。
そして日付をクリックしたら、カスタムフィールド(date_field)の日付が一致したものの一覧がでるということですね。
がちょうど年月のアーカイブができるので、これに日をたせればできるんじゃない?ってことで実際にやってみました。
利用方法
Step 1. テーマの functions.php に下記のソースコードを追加
ソースコード:https://ideone.com/BavQDi
ここでは説明のために デフォルトテーマ「Twenty Seventeen」の index.php に書き込み、トップページの記事の一番上に表示するようにします。
下記のコードを図のように if ( have_posts() ) : の下に追加してみてください。
my_get_year_archives( array(
'date_field' => 'date_field',
) );
Step 2. 表示するコードを追加(例 index.php)
ここでは説明のために デフォルトテーマ「Twenty Seventeen」の index.php に書き込み、トップページの記事の一番上に表示するようにします。
下記のコードを図のように if ( have_posts() ) : の下に追加してみてください。
my_get_year_archives( array(
'date_field' => 'date_field',
) );
そうすればトップページに日付一覧が降順に表示されるはずです。
【WordPress】カスタムフィールドの日付でカスタム投稿の年月別アーカイブ(pronet)では、カスタムフィールド(date_field)は、YYYY/MM/DD (2017/07/02)を元にしていました。このあたりはいろいろ変更できます。
さて備忘録なので、実際にどういう変更をしたのかも説明しておきます。
さて備忘録なので、実際にどういう変更をしたのかも説明しておきます。
変更点
変更1)カスタムフィールドの値から 年月だけでなく 日も取り出すSQL文に書き換える
$select = "SELECT SUBSTRING($field,1,4) AS `year`, SUBSTRING($field,6,2) AS `month`, SUBSTRING($field,9,2) AS `day`, count(p.ID) AS posts";
$query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4), SUBSTRING($field,6,2), SUBSTRING($field,9,2) ORDER BY $field DESC $limit";
赤い部分の追加です。
YYYY/MM/DD 、1文字 = 1バイト(1バイト英数記号)と仮定すると、
- 1,4 = 1文字目から4文字分(YYYY)
- 6,2 = 6文字目から2文字分(MM)
- 9,2 = 9文字目から2文字分(DD)
を付与すればよいということです。
※全角(日本語)のように 2017/08/19 とした場合に、SQLクエリの方でなんとかしたいなら、CATをつかうとよいようです。
変更2)HTMLコード出力に日データを追加
$url = add_query_arg( array( 'meta_key' => $date_field ), get_day_link( $arcresult->year, $arcresult->month, $arcresult->day) );
$text = sprintf( '%d', $arcresult->year ).'/'.sprintf( '%02d', $arcresult->month ).'/'.sprintf( '%02d', $arcresult->day );
->year, ->month, ->day の year, month, day については、変更1)の AS `year`、 AS `month`、AS `day` に紐付いています。
<li><a href='https://demo.dev/2017/09/02/?meta_key=date_field'>2017/09/02</a> (1)</li>
<li><a href='https://demo.dev/2017/08/30/?meta_key=date_field'>2017/08/30</a> (1)</li>
<li><a href='https://demo.dev/2017/07/02/?meta_key=date_field'>2017/07/02</a> (1)</li>
<li><a href='https://demo.dev/2017/09/02/?meta_key=date_field'>2017/09/02</a> (1)</li>
<li><a href='https://demo.dev/2017/08/30/?meta_key=date_field'>2017/08/30</a> (1)</li>
<li><a href='https://demo.dev/2017/07/02/?meta_key=date_field'>2017/07/02</a> (1)</li>
のようなコードが出力されます。
変更3)WordPress の検索クエリのカスタマイズに日を追加
下記の赤文字の部分が追加分です。
WordPress での投稿日付は、年 = year、 月 = monthnum、日 = day に保存されます。
ので下記のような追加になります。
ので下記のような追加になります。
function my_pre_get_posts( $query ) {
if ( $query->is_day ) {
$meta_query = array(
array(
'key' => $query->get( 'meta_key' ),
'value' => $query->get( 'year' ).'/'.sprintf('%02d', $query->get( 'monthnum' )).'/'.sprintf('%02d', $query->get( 'day' )),
'compare' => 'LIKE'
),
);
$query->set( 'meta_query' , $meta_query );
$query->set( 'year' , '' );
$query->set( 'monthnum' , '' );
$query->set( 'day' , '' );
$query->set( 'date' , '' );
$query->set( 'meta_key' , '' );
$query->set( 'post_type' , 'post');
}
}
2017.9.9 @kimipooh
0 件のコメント:
コメントを投稿