Wordpressの出力内容を制御するときの基本

#まえがき
※この記事は「[カスタム投稿タイプをゼロから作ってウェブサイト上に表示させるまで](https://qiita.com/yomogenium/items/32979df92721483a81e1)」
の続き。
前回の記事では書ききれなかった重要ポイントを書いていく。
なお、この記事は**PHPどころかプログラムがろくに分からない人向けの記事である。**


#基本原則１：表示と出力

[前回の記事](https://qiita.com/yomogenium/items/32979df92721483a81e1)で、以下のようなコードが登場した。

```php:single-newspaper.php
<?php get_header(); ?>

	<section id="primary" class="content-area">
		<main id="main" class="site-main">

			<?php
			if( have_posts() ):
				while( have_posts() ) : the_post(); ?>
				<!-- 投稿（1個あたり）の内容ここから -->

				<!-- タイトル -->
				<h2><?php echo get_the_title(); ?></h2>

				<!-- アイキャッチ画像 -->
				<?php
				if ( has_post_thumbnail() ) : ?>
					<div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div>
					<?php
				endif; ?>

				<!-- 本文 -->
				<p><?php the_content(); ?></p>

				<!-- 投稿（1個あたり）の内容ここまで -->
				<?php
				endwhile;
			endif; ?>


		</main>
	</section>

<?php
get_footer(); ?>
```

もうご存知の人もいるだろうけれど、Wordpressはただ管理画面にナニかを入力しただけでは動かない。
**その入力内容に対応したphpファイルを用意し、その中に規定のプログラムを書いてやらなければ**、ページは白紙のままだ。

たとえばここから、タイトルを表示させるコードを書き換えて以下のようにする。

```php:single-newspaper.php
<?php get_header(); ?>

	<section id="primary" class="content-area">
		<main id="main" class="site-main">

			<?php
			if( have_posts() ):
				while( have_posts() ) : the_post(); ?>
				<!-- 投稿（1個あたり）の内容ここから -->

				<!-- タイトル -->
				<h2></h2>

				<!-- アイキャッチ画像 -->
				<?php
				if ( has_post_thumbnail() ) : ?>
					<div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div>
					<?php
				endif; ?>

				<!-- 本文 -->
				<p><?php the_content(); ?></p>

				<!-- 投稿（1個あたり）の内容ここまで -->
				<?php
				endwhile;
			endif; ?>


		</main>
	</section>

<?php
get_footer(); ?>
```

今回は`<?php echo get_the_title(); ?>`を消してみた。
すると、ユーザーから見える個別記事のページには、アイキャッチ画像と本文だけが表示され、ページタイトルは見えなくなる。
ここんとこ、前回の記事通りにカスタム投稿タイプを作ってくれた人なら試して分かってくれているだろう。

もちろんタイトルのデータ自体が消えたわけではない。ページが表示された時点でタイトルもちゃんと読み込まれてはいるのだ。**マシンに表示させろと命令していないから見せていない、**というだけで。

……というわけで出力のためのコードが必須なのだが、ただ書くだけじゃダメで、実際にはいくつかの制約が存在する。


#基本原則２：ループ内に書く

先ほどのコード例に、以下のような記述があった。

```php:single-newspaper.php
			<?php
			if( have_posts() ):
				while( have_posts() ) : the_post(); ?>


				<?php
				endwhile;
			endif; ?>
```

まあざっくり言えば、先ほどの「出力のためのコード」（`<?php echo get_the_title(); ?>`とか`<?php the_content(); ?>`とか）はwhile文の内側に書いてやらなくてはならないのだ。たとえばタイトルを表示させたい場合。以下のような書き方が正解となる。

```php:page-newspaper.php

<?php
if( have_posts() ):
    while( have_posts() ) : the_post(); ?>
   

    <?php echo get_the_title(); ?>

    <?php
    endwhile;
endif; ?>

```

なぜこのようにするのかというと、外側のhave_posts()等はいわゆる「主語」の役割で、中にいる<?php echo get_the_title(); ?>にどの記事のタイトルを取ってくればいいかを伝えているからなのだ。
逆に言えば、主語となるものさえあればよいということ。なので以下のような書き方もできる。

```php:page-hoge.php

<?php echo get_the_title('67'); ?>

```

これなら、上記のカッコ内（ループ内）かどうかを問わずどこにでも書ける。
ちなみにこれは「IDが67番になってる記事のタイトルを呼び出す」という意味のコードになる。

[この記事（※筆者が書いた記事ではないです）](https://www.akecre.com/wordpress/display_scf/)の「関連する投稿のタイトル・URLを表示する」で似たようなことをやっているが、原理は同じ。あちらは投稿をまるごと取ってくる`get_post()`を、`get_post( 取ってきたい投稿のID )`として利用しているのだ。


#基本原則３：「取得」と「表示」は別物
※ここは、すでに他の動的言語を習得している人にとってはわかり切った内容なので読み飛ばしてOKだ。

見た目を操作するHTMLとは違い、phpではデータそのものの操作を行う。
要するに、パソコンに「このデータは〇〇に持っていけ」とか「このファイルには〇〇という名前をつけろ」とかいう、何らかの作業を命令するのだ。そんで、パソコンが命令した通りに仕事をすれば成功というわけ。
例えるなら、HTMLは舞台そのものの設計図であり、phpやjavascriptはその舞台でやる劇の台本なのだ。

で、そのPHP（に限らず動的言語全般）の重要な要素に「変数」というのがある。
変数について知っておくべきことは３つ。

- phpでの変数は基本的に頭に`$`さえついてれば、好きな名前をつけることができる（`$tamago_no_kimi`みたいなのでも全然オッケー。ただ、名前を付けるときは見やすさ、分かりやすさを考えた方がいい。）

- 変数は入れ物である。変数に何らかのデータを取り込み入力することを「格納する」という。

- まったく同じ名前の変数は同じイレモノとして扱われる。同じ変数に２回以上データを格納した場合（２個以上、ではないのがポイント）、先に入れた方は上書きされて消える




phpは「取得」と「表示」の2種類の方法でデータを呼び出すことができることも覚えておこう。

|　　|表示|取得|
|:----------------------------------------|:----------------------------------------|:----------------------------------------|
|**概要**| 呼び出したデータをユーザーに見えるように表示させること。         | 呼び出したデータを、ユーザーからは見えないようにしつつコンピュータに記憶させること。         |
|**補足**| 一度表示したら後から書き換えができないので、文字のトリミングなどの処理は表示する前に終わらせよう。| 変数に格納するときには必ずこちらを使う必要あり。そのままだと存在はしてもユーザーから見えないので、ユーザーに見せたいときは「表示する」コード（echoやprintなど）が別途必要になる。|         
|**例**| `echo get_the_title();`         | `$title = get_the_title();`         |

ちなみに、ちょくちょく出てきている`echo`とはPHP関数のひとつで、`echo 〇〇;`と書いたとき、〇〇部分に書いてあるデータを出力する、というプログラムだ。


たとえば、Wordpress公式が出しているコードにしたって、表示用のものと取得用のものの２種類ある。

|　　| 表示| 取得|
|:----------------------------------------|:----------------------------------------|:----------------------------------------|
|**概要**| 出力に echo が不要。変数に格納はできない| タイトルを出力するにはechoが必要だが、変数に格納できる。いろいろと加工できるのもこちら。途中で切ったり数字だけ抜き出したり書き換えたりとか。|
|**例**|`the_title();`|`get_the_title();`|


～用例「変数への格納」～

```php:page-hoge.php
<?php
$test = 'あうえい';
// この場合、変数に文字列の「あうえい」を格納したことになる。ちなみに、文字列を入力する場合は両側を""か''でかこわなければならない。また、文末には;をつけること。

$test = 1;
$test = '1';
// 上の場合では変数に文字列の「1」を格納した。下の場合では変数に数値の「1」を格納した。
// 上の1は四則計算に使えないが、下の1は四則計算に利用できる。
// 当たり前だが「あうえい」みたいな文字列を数値として格納することはできない。

$test = get_field('hinichi');
// 変数にカスタムフィールドの値を格納したパターン。
// 管理画面のカスタムフィールド「hinichi」で入力したデータが取得され、ここに格納される。
?>
```

#基本原則４：配列に気をつけよう
「出力の時には`echo`を利用すればよい」と上では書いた。上では。
これはウソじゃない。だが、例外もある。**「配列」「連想配列」「オブジェクト」と呼ばれるタイプの値では、もうひと手間が必要なのだ。**

###What is 配列？
さきほど変数についての解説をした。「変数には値を格納することができる」と。
これはなにも一つだけとは限らない。ひとつの変数に、２つ以上の値を格納することだってできる。これをやっているのが配列だ。
うーん、まあ、大雑把だが、配列がいかなるものかという話はどうでもいい。ググればすぐ出てくるだろうし。重要なのは実際の使い方だ。

まず、例をお見せしよう。

```php:page-hoge.php

$hensu01 = array(8, 'grad', 'conrad'); // 配列です

$hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。

echo $hensu01;

```
さて問題。最後に`$hensu01`をechoで表示しようとしたが、これをやると何が表示されるだろうか。
もっとストレートに言おう。**`$hensu01`の中には3つの値が格納されているが、これをechoしたときに表示されるのは8, grad, conradのうちどれだろうか。**


正解は非常にシンプルだ。
**実際にこれをやろうとすると、どれ一つまともに表示されずエラーが起きる**のだから。
ってことは、配列(と、オブジェクト)に限っては、表示の際に単純な`echo`を使ってはダメなのである。

で、ここから先は配列、連想配列、オブジェクトの出力のやり方を書いていく。
……連想配列の説明がない？オブジェクトの説明がない？下手に解説すると混乱するだろうから、ここでは説明を省く。
今はとりあえず、配列と同じものだと思っておけばいい。

###配列の中身をぜんぶ出力する

```php:page-hoge.php

$hensu01 = array(8, 'grad', 'conrad'); // 配列です

$hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。

foreach($hensu01 as $key => $value){
 echo $value;
}
// 結果： 8gradconrad

foreach($hensu01 as $key => $value){
 echo $value;
 echo '---';
}
// 結果： 8---grad---conrad

foreach($hensu02 as $key => $value){
 echo $value;
}
// 結果： neru-neru-neru-ne
```

###配列のある特定の値だけを出力する
```php:page-hoge.php

$hensu01 = array(8, 'grad', 'conrad'); // 配列です

$hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。

echo $hensu01[0];
// 結果： 8

echo $hensu01[1];
// 結果： grad

echo $hensu01[2];
// 結果： conrad

echo $hensu01[0];
// 結果： neru-neru-neru-ne
```
変数の後ろに何やら変な番号がついているが、これは、「キー」という。
変数が配列になったとき、見えはしないが、そこに入っている各々の値には自動的に必ず「キー」というナンバーが振られる仕組みになっている。このナンバーは**0から始まり、**前から順番に振られていく。つまり、この番号を指定して「`$hensu01`の２番目」みたいな指定の仕方をしてやれば取り出せるというわけだ。

###連想配列の中身をぜんぶ出力する
```php:page-hoge.php

$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です

foreach($hensu01 as $key => $value){
 echo $key;
 echo '-and-';
 echo $value
 echo ' ';
}
// 結果： first-and-8 second-and-grad third_hogehoge-and-conrad

```
上で話に取り上げた「キー」だが、これは自分で指定することもできるし、すでに指定してある場合もある。
「特に指定されなければ自動で前から番号が振られる」というだけであって、自分で好きなキーを指定することだってできるのだ。
で、このように、キーが自前で指定されている配列のことを「連想配列」と呼ぶ。

###連想配列のある特定の値だけを出力する
```php:page-hoge.php

$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です

echo $hensu01['first'];
// 結果： first-and-8 

```

###オブジェクトのある特定の値だけを出力する
```php:page-hoge.php

$hensu01 = new Fruit();
/*
$hensu01 = object(Fruit)#1 (3) {
  ["name"]=> string(5) "fruit"
  ["color"]=> array(3) { ["red"]=> int(0) ["green"]=> int(0) ["blue"]=> int(0) }
  ["comment"]=> string(7) "nothing"
}
*/

echo $hensu01->name;
// 結果： fruit

$hensu_instant = $hensu01->color;
foreach($hensu_instant as $key => $value){
 echo $key;
 echo '-and-';
 echo $value
 echo ' ';
}
// 結果： red-and-0 green-and-0 blue-and-0
// $hensu01の中に入っているのは「オブジェクト」だが、$hensu01の中のcolorに入っているのは「連想配列」。
```

オブジェクトは……説明しようとするとオブジェクト指向の話に入り込んで難解になってしまうので、さわりだけ。
オブジェクトが連想配列と似ているものだが、これを表示しようとした場合、`変数->キー`のように、矢印でつなぐ必要がある。




#さいごに
分からないこと等あったら編集リクエストおねがいします