実際の実装はこちらここは検証のページです。
パーマリンクは/%category%/%year%/%post_id%/ となっているが、
要望として、
- カテゴリー一覧ページに年代出せる機能
- URLがhttp://kato.space/カテゴリー/2017/ とさせたい。
- ページャーがクリックで、http://kato.space/カテゴリー/2017/page/4/ となるので、
単純にURLを取得するだけだとエラーになる。
まずはcategory-スラッグ.phpを用意する
実際のパーマリンクを取得してみる。
一度、get値取るか?
検証1
http://kato.space/wp/wordpress/2017/ としたとき、
print_r($_GET);では配列は0 Array ( )となる。
パーマリンクを基本にすると、
http://kato.space/wp/?cat=5
Array ( [cat] => 5 ) となり、
http://kato.space/wp/?cat=5&m=201702
http://kato.space/wp/?cat=5&m=201302
http://kato.space/wp/?m=201302
上記であれば取得できる。
Array ( [m] => 201302 )
検証2
年代ごとの取得は可能のよう
@See http://qiita.com/noqua/items/a26cfcb378300ba20bb1
archiveFunc() という関数がある模様
<?php /*============================================== 年別アーカイブ表示 ==============================================*/ function archiveFunc($year){ if(have_posts()) : query_posts('posts_per_page=-1&year='.$year.''); ?> <div class="archives"> <h2><?php print $year; ?></h2> <dl> <?php while(have_posts()) : the_post(); ?> <dt><?php the_time('Y-m-d'); ?></dt> <dd><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></dd> <?php endwhile; ?> </dl> </div> <?php endif; wp_reset_query(); ?> <?php } ?>
@See 年別 アーカイブの表示方法について
@See WordPressのアーカイブページで投稿を年度別に一覧表示したかった。
<?php function archiveFunc($year){ $newslist = new WP_Query( array( 'post_type' => 'works', 'posts_per_page' => -1, 'year' => $year )); ?> <h3><?php echo $year; ?>年</h3> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <th width="15%">■期間</th> <th width="20%">■発注者</th> <th>■工事名</th> </tr> <?php if($newslist->have_posts()): while($newslist->have_posts()): $newslist->the_post(); ?> <tr> <td><?php the_field('works_period'); ?></td> <td><?php the_field('works_orderer'); ?></td> <td><strong><?php the_title(); ?></strong></td> </tr> <?php endwhile; endif; wp_reset_postdata(); ?> </tbody> </table> <?php } $thisyear = date('Y'); for ($year=$thisyear; $year >= 2010; $year--) { archiveFunc($year); } ?>
検証3
単純にカテゴリーページで年代でフィルタリンクかければ良いのでは?
問題は/page/2/とかの問題
$args = array( //'posts_per_page' => 5, 'offset' => 0, 'category' => '', 'year' => '2017', 'category_name' => '', 'orderby' => 'date', 'order' => 'DESC', 'include' => '', 'exclude' => '', 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'post_mime_type' => '', 'post_parent' => '', 'author' => '', 'post_status' => 'publish', 'suppress_filters' => true ); $posts = get_posts($args);
上記で取得2017年とかは絞込みは可能
なので、
$year = '2013'; $args = array( 'category' => '5', 'year' => $year, );
この$yearをgetから取得できれば完璧か。
http://kato.space/wp/wordpress/2017/
もしくは
http://kato.space/wp/wordpress/2017/
http://kato.space/wp/wordpress/page/2/
要望は
http://kato.space/wp/wordpress/2017/
http://kato.space/wp/wordpress/2017/page/2/
だが
URLから抜き出すしかないのか?
WordPressで現在のURLのパスを配列で取得する
@See https://watanabemitsutoshi.com/wordpress-get-url-path
検証4
/%category%/%year%/
で、
http://kato.space/wp/wordpress/2013/
http://kato.space/wp/wordpress/2016/
でもいけるが、リンクが取得できない。
/%category%/%year%/%post_id%/ じゃなきゃだめだよね。
検証5
とりあえず、
$args = array( 'category' => '5', 'year' => $year, ); $posts = get_posts($args); global $post; if($posts): foreach($posts as $post): setup_postdata($post); ?> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"> <?php the_title(); ?></a><br> <?php endforeach; endif;?>
という感じで取得できるし、
URLが
http://kato.space/wp/wordpress/2013/
http://kato.space/wp/wordpress/2013/page/2/
http://kato.space/wp/wordpress/2017/
http://kato.space/wp/wordpress/2017/page/2/
上記でもアクセスできるので、あとは、
<?php wp_get_archives(‘type=yearly’); ?> このリンクを修正したい。
http://kato.space/wp/wordpress/2013/page/2/でページ移管ができない
調べると、http://kato.space/wp/wordpress/2017/もページャーが効かない
↓
$args = array( 'category' => '5', 'year' => $year, 'paged' => $paged
現在のページが不明になっていた模様
@See http://webimemo.com/wordpress/1813
検証6
get_archives_linkを加工する
通常だと
http://kato.space/wp/date/2016/ となる
これを ↓
http://kato.space/wp/カテゴリー名/2016/ のリンクとしたい。
@See 「wp_get_archives()」で出力されるHTMLタグをカスタマイズ[WordPress]
純粋に年代記事があるか検索はできないのだろうか?
wp_get_archives ではクエリ文を投げている。
$query = "SELECT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date $order
じゃ、これ普通にクエリ作ればいいのか
SELECT * FROM `wp_posts` WHERE DATE_FORMAT(`post_date`, ‘%Y’)=2013;
SELECT DATE_FORMAT( `post_date` , "%Y" ) AS y, COUNT( id ) AS count FROM `wp_posts` GROUP BY DATE_FORMAT( `post_date` , "%Y" )
SELECT DATE_FORMAT( `post_date` , “%Y” ) AS y, COUNT( id ) AS count FROM `wp_posts` GROUP BY DATE_FORMAT( `post_date` , “%Y” )
@See
mysqlでdate型を月毎に集計する
http://y0m0r.hateblo.jp/entry/20140618/1403105741
じゃ、これで関数を作るか。
検証7
コメンドアウトはテストで出力、そのままちと残す。
function years_li_links($string){ $sql = "SELECT DATE_FORMAT( `post_date` , \"%Y\" ) AS y, COUNT( id ) AS count\n" . "FROM `wp_posts` \n" . "GROUP BY DATE_FORMAT( `post_date` , \"%Y\" ) "; global $wpdb; $rows = $wpdb->get_results($sql); print_r($rows); echo '<hr>'; foreach( $rows as $key => $value) { echo '<li>'; //echo "<a href='topic'>"; //echo site_url(); //echo $string.'/'; //echo $rows[$key]->y.'/'; $li_link = site_url().'/'.$string.'/'.$rows[$key]->y.'/'; //echo $li_link; echo "<a href='{$li_link}'>"; echo $rows[$key]->y; echo '</li>'; } }
検証8
ページャーで空のページがある。
@See http://xtra-blog.net/pagination/
@See https://2inc.org/blog/2012/09/06/1947/
どうやら「posts_per_pageの値が「1ページに表示する最大投稿数」よりも小さいとページングが正しく動作しない」というのは定説らしい。
$args = array( 'posts_per_page' => get_option('posts_per_page'), 'category' => '5', 'year' => $year, 'paged' => $paged, );
上記で解決。
http://kato.space/wp/wordpress/2017/
http://kato.space/wp/wordpress/2017/page/2/
でも動作するな。
では、%year%が取得できればいいのか
パーマリンクのテスト
wp_get_archives
デモ
http://kato.space/test_archives.php
http://kato.space/wp/date/2017/page/4/
これを
http://kato.space/カテゴリー/2017/page/4/
として動作させたい
まずはcategory-スラッグ.phpを用意する