ど素人から毛を生やす。<延>

カスタム投稿を含む記事一覧

Web > WordPress > カスタム投稿 2014年6月3日(最終更新:2年前)

このページは2014.6.3に作成されています。時代の流れとそぐわない可能性があったり、僕が今以上のど素人だった頃の記事だったりするので、新しい記事を探してみるのも良いかもしれません。

どもです。
MAD巡りした結果、テイルズ熱が再燃した餅。です。

TOX2は1周しかしてませんが、ボイス付きの2周目に手を出してみようかしら。
TOVの3周目でも良いな!
TOVはファンもアンチも多い作品ですが、僕は大好きです。
なんというか、TOIとは別の意味で皆人間臭くて良いです。
パーティ全員に共感できるRPGってそうないと思うの。

 

それはともかくWordPress。

今回の要件は
「カスタム投稿を使って投稿者が特定のブログにのみ投稿できるようにする。」
「記事一覧や月別アーカイブは共通のものを設置する」
でした。

前者については、こちらのサイト様を参考にすれば楽に実現できます。

が、後者は簡単にできそうに見えてよくわからない。
query_postsについて、ちょっと真面目に学んでみる必要がありました。

<?php
$posts_ = array(
    'post_status'=>'publish',
    'post_type' => array('post','カスタム投稿タイプ①','カスタム投稿タイプ②'),
	);

query_posts( $posts_ );
?>

query_postsのパラメータの1つであるpost_typeに、
post(通常の投稿)の他にカスタム投稿タイプを記載します。

これで、カスタム投稿を含めた全記事が、最も一般的なループである

<?php if(have_posts()) : while(have_posts()) :	the_post(); ?>
    記事があるとき
<?php endwhile; else: ?>
    記事がないとき
<?php endif; ?>

で、表示できるようになります。

が、これだけだとページ送りができません。

ので、

<?php
$query = get_query_var('paged');
if($query == 0){
	$start = 1;
}else{
	$start = ($query - 1) * $per_page + 1;
}

$posts_ = array(
    'post_status'=>'publish',
    'paged'=>$query,
    'post_type' => array('post','カスタム投稿タイプ①','カスタム投稿タイプ②'),
	);

query_posts( $posts_ );
?>
<?php if(have_posts()): ?>
<?php while(have_posts()):the_post(); ?>
    記事があるとき
<?php endwhile; else: ?>
    記事がないとき
<?php endif; ?>

このように記載します。
これでページ送りにも対応できます。

 

月別アーカイブの場合はもう一手間必要です。

まずは、URLを分解して取得する必要があります。
詳しくはこちらのサイト様を参考にしてください。

取得できましたら、query_postsのパラメータにyearとmonthnumを追加します。
具体的にはこんな感じ。

<?php
$data = $_SERVER["REQUEST_URI"];
list($domain,$dir_01,$dir_02,$dir_03) = explode("/",$data);

$query = get_query_var('paged');
if($query == 0){
	$start = 1;
}else{
	$start = ($query - 1) * $per_page + 1;
}

$posts_ = array(
	'post_status'=>'publish',
	'paged'=>$query,
    'post_type' => array('post','カスタム投稿タイプ①','カスタム投稿タイプ②'),
	'year'=> $dir_02,
	'monthnum'=> $dir_03,
	);

query_posts( $posts_ );
?>
<?php if(have_posts()): ?>
<?php while(have_posts()):the_post(); ?>
    記事があるとき
<?php endwhile; else: ?>
    記事がないとき
<?php endif; ?>

これでアーカイブの表示ができます。
但し、「アーカイブページ」が構築されているのは、
「postに記事がある月のみ」です。
つまり、カスタム投稿のみに記事がある場合、
archive.phpではなく、404.phpが読み込まれてしまいます。
ので、404とarchiveのテンプレートを同じにしてしまいます。
幸い、上記の方法でURLを取得すると404が読み込まれていようが
URLで指定した月の記事を読み込むことが可能です。

そうすると真に404エラーなときにき表示が変になりますが…
対策するなら$dir_01がdateでないなら、
$dir_02や$dir_03が数字でないなら、みたいなif文を書いておきましょう。

で、そうすると今度はアーカイブ一覧の出力にも困ります。
アーカイブページが作られていないページへのリンクは普通、作られません。

ので、その辺はもうそろそろ疲れたことですし力技で行きます。

<select name="月別一覧" onChange='document.location.href=this.options[this.selectedIndex].value;'>
<option  selected="selected"> ▽選択してください  </option>
<?php
$year_ = date("Y");
$month_ = date("n");
$year = intval($year_);
$month = intval($month_);
	  for ( $iiii = $month; $iiii >= 1; $iiii-- ) {
		?><option value='<?php echo '/date/'.$year.'/'.$iiii.'/' ?>'><?php echo  $year.'年'.$iiii.'月' ?></option><?php
	  };
  for ( $ii = $year-1; $ii > ブログ開設年; $ii-- ) {
	  for ( $iii = 12; $iii >= 1; $iii-- ) {
		?><option value='<?php echo '/date/'.$ii.'/'.$iii.'/' ?>'><?php echo $ii.'年'.$iii.'月' ?></option><?php
	  };
  };
	  for ( $i = 12; $i >= ブログ開設月; $i-- ) {
		?><option value='<?php echo '/date/ブログ開設年/'.$i.'/' ?>'><?php echo 'ブログ開設年'.$i.'月' ?></option><?php
	  };
?>
</select>

これでおkです!w

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった  (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (1)