実際の実装はこちらここは検証のページです。
パーマリンクは/%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を用意する