みなさんこんにちは。とってもイケてるWordPressテーマ Lightning 及びベクトルプロダクト制作監督の石川です。

本記事では「WordPressでホームページを運用していてテーマの機能にないカスタマイズをしたい」という人向けに必要最低限のPHPの基礎を解説します。

この記事は「Vektor WordPress Solution Advent Calendar 2020」の12月8日の記事になります。

カスタマイズの前に

  • WordPressのサイトでPHPでカスタマイズする場合、カスタマイズするプログラムは状況によっていろいろな場所に書く事ができますが、ここでは子テーマファイルに書く事を想定して進めます。
  • PHPは書き方を間違えるとサイトが停止します。この記事の内容を試してみたり、実際運用中のサイトをカスタマイズする時はテスト用のWordPressサイトを用意して行ってください。
  • 開発の際は wp-config.php に define( 'WP_DEBUG', true ); と一行追加してデバッグモードを有効にするとPHPの致命的以外のエラーも表示してくれます。詳しくはこちら。

PHPの書式の基本

php の開始タグと終了タグ

PHPはHTMLの中に動的な処理を簡単に埋め込む事ができます。
例えば下記のように<h1>というhtmlの中に <?php で はじめて、 ?> までの部分に書く事ができます。

<h1><?php echo get_bloginfo( 'name' ); ?></h1>

以下のように、HTMLの中にいきなり the_title() など書いても、PHPと認識されないのでそのまま表示されてしまいます。

<h1> echo get_bloginfo( 'name' ); </h1>

下記のように ?> で閉じるのを忘れるとエラーになってサイトが表示されなくなります。

<h1><?php echo get_bloginfo( 'name' ); </h1>

ファイルの最後は閉じなくてよい

functions.php などHTMLではなくプログラム主体で書かれているファイルは最初に <?php ではじまっていますが、ファイルの最後に ?> がなくてもエラーにはなりません。

文字列を表示したりする時は ‘ あるいは ” でくくる

phpで文字列を表示したり変数(後述)に代入する場合は ‘ (シングルクォート)あるいは ” (ダブルクォート)でくくります。

<?php 'やまだ' ?>

ただし、今の状態では何も表示されません。

echo文

echo は表示するための命令です。まずは echo を書くと、echo に続く文字列などが画面に表示されます。

<?php echo 'やまだ' ?>

行の最後は ; で終わる

phpでは行の最後は ; で終了します。<?php echo 'やまだ' ?> は 1行で終了しているのでエラーになりませんが、複数行の処理がある場合は、行の最後は ; を書きます。

<?php 
echo 'やまだ';
echo 'たろう';
?>

プログラムとして処理しないコメントの書き方

phpでは以下のように // を書くとその行をプログラムとしては認識しません。

<?php // これはコメントなので、文字列なのに ' でくくらなくてもエラーになりません。?>  

長いコメントなどを書く場合は /* と */ の間がコメントとして扱われます。

<?php /*
これは複数行のコメントです。
改行して書く事もできます。
*/ ?>

変数

変数は $ で始まる英字の文字列にいろいろなものを格納できます。まずは以下を入力して表示を確認してみましょう。

<?php
// '表示します' を 変数 $a に代入
$a = '表示します';
// 変数 $a を表示
echo $a; 
?>

画面に「表示します」という文字が表示されるのが確認できるはずです。

= は「等しい」ではなく右辺を左辺に代入

phpなどのプログラムでは = は数学でいう所の「等しい」ではなく、右辺を左辺に渡す意味を持ちます。
先の例では右辺の「表示します」という文字列を左辺の変数 $a に入れて、次の行で $a を表示しています。

値が空の変数を使うとNoticeが表示されるようになる

以下の例では $a を echo で表示しようとしています。

<?php echo $a; ?>

しかしながら、$a がそもそも何であるか事前に定義されずにいきなり使われているので、デバッグモードを有効にしていると

Notice: Undefined variable: a in 〜

というnotice(注意)が表示されます。

文字列などは . で連結できる

ピリオドを使うと、文字列と文字列や、文字列の格納された変数と文字列を連結させる事ができます。

<?php echo 'やまだ' . 'たろう'; ?>

実際には以下のような感じで使われたりします。

<?php 
$title = 'ステキなWordPressテーマ Lightning';
$count = 3;
echo $title . ' に ' . $count . ' 件のコメントがあります。';
// 表示結果
// ステキなWordPressテーマ Lightning に 3 件のコメントがあります。
?>

変数に入っている文字列に別の文字列を追加

変数 $text に ‘WordPressテーマ’ と入っていて、そこに ‘ Katawara’ を足して表示する例を見てみましょう。

<?php 
$text = 'WordPressテーマ';
$text = $text . ' Katawara';
echo $text;
// 出力結果 : WordPressテーマ Katawara
?>

2行目の時点で、右辺の $text には WordPressテーマ が入っているので、そこに文字列を追加したものを 左辺の $text に代入しています。

しかし、ちょっと長いので下記のように .= で書くことができます。

<?php 
$text = 'WordPressテーマ';
$text .= ' Katawara';
echo $text;
// 出力結果 : WordPressテーマ Katawara
?>

出力結果は同じです。 .= を使うと左辺にある変数などにそのまま右辺の文字列を追加する事ができます。非常によく使うので覚えておきましょう。

シングルクォートとダブルクォートの違い

ダブルクォートだと変数が文字列の時に展開して表示してくれます。

<?php 
$title = 'ステキなWordPressテーマ Lightning';
$count = 3;

// シングルクォートの場合
echo '$title に $count 件のコメントがあります。';
// $title に $count 件のコメントがあります。

// ダブルクォートの場合
echo "$title に $count 件のコメントがあります。";
// ステキなWordPressテーマ Lightning に 3 件のコメントがあります。
?>

データの型

先の項で、$title = 'ステキなWordPressテーマ Lightning'; と ‘ でくくっているのに $count = 3; はそのまま数字を書いているので不思議に思った方も多いのではないでしょうか?PHPに限らずプログラムにはデータの型が存在しますのでよく使う代表的なものを紹介します。

文字列(string型)

読んで字の通り「文字」です。文章などを扱う時に使います。文字列を扱う時は必ず ‘ か “” でくくらないとエラーになります。

$string = "これはテキストです";

論理値(真偽値 / bool型)

値が真(true)か偽(false)かで使います。例えばサイドバーを表示する事になっているかそうでないかの2択の時のデータの保有形式です。’ や “” は不要です。

$is_sidebar_display = true;

数値(整数 (int) / 浮動小数点数 (float, double))

数値です。数式で計算する値など扱う場合は数字をそのまま使用します。 ‘ や “” は不要です。

$a = 1.1;
$b = 2;
echo $a + $b;

データの型を調べる時は var_dump() を使う

例えば $a = 1 $a = "1" ではecho するとどちらの値も1ですが、型が違うので厳密には同じではありません。型が違うかどうかは以下のように var_dump() 関数を使うと調べる事ができます。

$a = 1;
var_dump( $a );
$b = '1';
var_dump( $b );

条件分岐(if文)

PHPでWordPressのカスタマイズで「固定ページの時」とか「トップページの時」など特定の条件の時に処理や表示を切り替えたりをするのに多用するのがif文です。簡単な例から見てみましょう。

左右が等しいかどうか

まずは2つの値が等しいかどうかを比較して処理をわける書き方を見てみましょう。

<?php
$theme = 'Lightning';

// $theme の中身が 'Lightning' と等しいかどうか
if ( 'Lightning' === $theme ) {
  echo 'テーマはLightningです。';
} else {
  echo 'その他のテーマです。';
}
?>

if のあとの ( ) の中が条件になります。=== は左右が等しいかどうかを比較しています。 左辺と右辺が等しいので、結果は true(条件に合致している)となり、続けて記載されている { } 内の処理を実行します。

左右が等しいか比較する比較演算子 === で左右が等しくない場合は、結果は false(条件に合致していない)となり、else { 以降の処理が実行されます。

等しくないかどうか

今度は逆に「等しくないかどうか」という条件を見てみます。

<?php
$theme = 'Katawara';

// $theme の中身が 'Lightning' と等しくないかどうか
if ( 'Lightning' !== $theme ) {
  echo 'テーマはLightningではありません。';
} else {
  echo 'テーマはLightningです。';
}
?>

等しいかどうかは === で比較しましたが、等しくないかどうかの比較は !== になります。
上の例では $theme の中値は Katawara で Lightning とは等しくないため、比較した結果は true(条件に合致している)となります。

比較がない条件分岐

先の項では左右の値を比較していましたが、以下のように比較演算子のない条件分岐も使われます。

<?php
$name = 'Lightning';
if ( $name ) {
  echo 'ステキなWordPressテーマの名前は '. $name . ' です。';
} else {
  echo 'ステキなWordPressテーマの名前がわかりません。';
}
?>

この場合、$name の中に Lightning という文字列が入っているので、true の扱いになります。

条件の前に ! をつけると逆の意味になる

先の項では左右の値を比較していましたが、以下のように比較演算子のない条件分岐も使われます。

<?php
$name = '';
if ( ! $name ) {
  echo '名前の記入がありません';
}
?>

WordPressで用意されている条件分岐タグ

WordPressで用意されている条件分岐タグは非常によく使うので覚えておきましょう。

<?php
echo '今表示しているページは ';
if ( is_front_page() ) {
  echo 'トップページ';
} elseif ( is_home() ) {
	echo '投稿トップ';
} elseif ( is_page() ) {
  echo '固定ページ';
} elseif ( is_single() ) {
  echo '投稿詳細ページ';
} elseif ( is_category() ) {
  echo 'カテゴリーアーカイブページ';
} elseif ( is_year() ) {
  echo '年別アーカイブページ';
} elseif ( is_search() ) {
  echo '検索結果ページ';
} elseif ( is_404() ) {
  echo 'Not Foundページ';
} else {
  echo 'その他のページ';
}
echo ' です。';
?>

is_ で始まる条件分岐タグは他にもいろいろあるので、必要に応じて調べてください。

a あるいは b の条件の場合

複数の条件のどちらかに合致するかどうかの場合に処理する場合は以下のように || で複数の条件を指定します。

<?php
echo '今表示しているページは ';
if ( is_front_page() || is_page() ) {
  echo 'トップページ あるいは 固定ページ';
} else {
  echo 'トップページでも固定ページでもないページ';
}
echo ' です。';
?>

a なおかつ b の条件の場合

複数の条件どちらも合致している場合に処理したい場合は && で複数の条件を指定します。

<?php
echo '今表示しているページは ';
if ( is_front_page() && is_page() ) {
  echo 'トップページでなお且つ固定ページ';
}
echo ' です。';
?>

カスタムフィールドの表示例

カスタムフィールド age が用意してあったとして、その値を表示する例を見てみましょう。

※ 下記のコード実行の際は事前に ‘age’ というカスタムフィールドを作ってください。
※ 表示したい記事のIDは任意で書き換えてください。

<table>
<tr><th>名前</th><td>山田太郎</td></tr>
<?php
// カスタムフィールド age の値を取得して変数 $age に代入
$age = get_post_meta( get_the_ID(), 'age', true );
if ( $age ) {
  echo '<tr><th>年齢</th><td>' . esc_html( $age ) . '</td></tr>';
} ?>
</table>

条件分岐の書き方は複数ある

条件分岐は、今まで紹介した { } の中に処理を書く方法と、 : で処理を区切る書き方があります。

<?php
$theme = 'Lightning';
if ( $theme === 'Lightning' ) {
    echo '<p>テーマはLightningです。</p>';
} else {
    echo '<p>テーマはLightningではありません。</p>';
}?>
<?php 
$theme = 'Lightning';
if ( $theme === 'Lightning' ) : ?>
<p>テーマはLightningです。</p>
<?php else : ?>
<p>テーマはLightningではありません。</p>
<?php endif; ?>

とちらも処理結果は同じです。

関数

関数はまとまった処理を繰り返し行いたい場合に便利です。WordPressで使われている the_title() や is_page() などはWordPressで用意されている関数です。

関数の基本の書式

関数は functions.php などのphpファイル内に以下のような書き方で定義します。

function 関数名(){
    処理内容
}

実際に簡単な関数を作ってみましょう

例えば今表示しているページの種類を表示する関数は以下のようになります。

function my_the_page_info(){
  echo '今表示しているページは ';
  if ( is_front_page() ) {
    echo 'トップページ';
  } else if ( is_page() ) {
    echo '固定ページ';
  } else if ( is_single() ) {
    echo '投稿詳細ページ';
  } else if ( is_category() ) {
    echo 'カテゴリーアーカイブページ';
  } else {
    echo 'その他のページ';
  }
  echo ' です。';
}

関数名は my_display_page_type としてありますが、半角英字とアンダーバーなら好きな名前で構いません。関数名にハイフンを使うとエラーになるので使えません注意してください。

実際に使う時は <?php my_the_page_info(); ?> で呼び出す事ができます。

同じ関数名はエラーになる

PHPでは同じ関数名が複数定義されていると、呼び出された時にどちらの処理をしたら良いのかわからないのでエラーになってしまいますので、既にある関数名は使えません。

また、ありがちな名前の関数を作ってしまうと、他のプラグインなどで同じ関数名が定義されてエラーになったりするので、独自に作る関数は関数名の最初に my_ や vk_ など、識別用の接頭辞をつけましょう。

値を返すだけの関数

前項で作った my_the_page_info(); は echo で処理結果を表示していましたが、表示はせずに結果を返すだけの関数も非常によく使われます。

function my_get_page_info(){
  $page_info = '今表示しているページは ';
  if ( is_front_page() ) {
    $page_info .= 'トップページ';
  } else if ( is_page() ) {
    $page_info .= '固定ページ';
  } else if ( is_single() ) {
    $page_info .= '投稿詳細ページ';
  } else if ( is_category() ) {
    $page_info .= 'カテゴリーアーカイブページ';
  } else {
    $page_info .= 'その他のページ';
  }
  $page_info .= ' です。';
  // $page_info を返す
  return $page_info;
}

return で 値を返して関数の処理を終了しています。「返す」というのがピンとこないかもしれません。

以下をheader.phpなどどこかのテンプレートファイルに貼り付けて挙動を確認してみてください。

<p>値を返しているだけなので何も表示されない</p>
<?php my_get_page_info();?>

<p>返ってきた値を echo を使って表示する</p>
<?php echo my_get_page_info();?>

引数を使った関数

関数には、中で同じ処理をするばかりでなく、関数に引数を渡す事で、引数に応じて違う結果を返す事ができます。

function my_the_comment_title( $title ){
  if ( $title ){
    echo '<h4>' . $title . ' へのコメント</h4>';
  }
}

関数名の後ろの ( ) の中にある $title が引数です。引数は複数設定する事もできます。

実際に使う時は下記のように文字列や変数などを渡して使います。

<?php my_the_comment_title( 'Lightningはステキ' );?>

変数(配列)

何らかのプログラム言語を経験した事がない人にとって難しいのが、変数には単一の数字や文字列が入るわけではないという事です。例えば $post_types という変数の中に入っている値は単語1つだとは限りません。

以下の例を見てみましょう。

<?php
// 変数 $post_types に 配列で post と page と event を代入
$post_types = array( 'post', 'page', 'event' );

echo $post_types[0].'<br />'; // 配列の中の0個目の値を表示
echo $post_types[1].'<br />'; // 配列の中の1個目の値を表示
echo $post_types[2].'<br />'; // 配列の中の2個目の値を表示
?>

$post_types という一つの変数の中に配列で post と page と event という3つの値を持たせています。
プログラムでは数を数える時は 1 からではなく 0 からスタートなので、最初の値は $post_types[0] で取り出す事ができます。

キーと値

ここで 配列の中の番号の部分を キー と呼び、中に入っている post という文字列が 値 になります。

変数 $post_types の キー が 0 の値は post となるわけです。
変数 $post_types の キー が 1 の値は page になります。

変数(連想配列)

先の配列では、配列のキーには 0, 1, 2 と順番に自動で番号が振られていますが、この名前を任意につける事ができます。

<?php
$args = array(
  'post_type' => 'page',
  'posts_per_page' => 5,
);
?>

$args の中には post_type が page で posts_per_page は 5 というように情報が格納されています。

連想配列の値の取り出し方

連想配列の入った変数は [ ] 内にキーを指定する事で取り出せます。

<?php
// 変数 $args を連想配列で定義
$args = array(
  'post_type' => 'page',
  'posts_per_page' => 5,
);
// 配列の中身を呼び出す
echo $args['post_type'].'<br />';
echo $args['posts_per_page'].'<br />';
?>

配列の中身を調べる

$args の中身がどういう状態なのか調べる時は、以下のように書くとざっくりわかるので便利です。

<?php
// 以下のような変数 $args があったとして
$args = array(
  'post_type' => 'page',
  'posts_per_page' => 5,
);

// 配列の中身を調べる
print '<pre style="text-align:left">';
print_r($args);
print '</pre>';
?>

エスケープ処理

ざっと超基本的な事を解説しましたが、悪意のあるプログラムを埋め込まれて実行されないように、表示する時には無害化する関数を経由しますが…そこはまたそれだけで長くなりますので、こちらの記事を参照ください。

詳しくは各自勉強しましょう

いかがでしょう?なんとなくテンプレートに書かれているPHPが読めるようになってくるのではないかなと思いますが正直PHPの事から書き出すと書かないといけない事が膨大すぎて際限がなくなるので、ドットインストールProgateなどで勉強してみるのをお勧めします。

今回の内容がピンとこなかった人も近日アクションフックとフィルターフックについて解説しますので、そちらで実用例が確認できると思います。

おまけ

こちらも是非ご一読を。

WordPress超初心者でもできる! 簡単なデザイン(CSS)カスタマイズ方法徹底解説

Follow me!

この記事を書いた人

石川栄和代表取締役
名古屋のウェブ制作会社数社に10年程度務めた後、株式会社ベクトル設立。
企画・運営・コンサルティング〜WordPressを中心としたシステム開発まで幅広く携わる。
[ 著書 ]
・いちばんやさしいWordPressの教本(共著)
・現場でかならず使われているWordPressデザインのメソッド(共著)
[ 最近のWordPressコミュニティでの活動 ]
2019 WordCampNiigata セッションスピーカー
2019 WordCampHaneda セッションスピーカー
2018 WordCampOsaka セッションスピーカー
2017 WordCampKyoto セッションスピーカー

リリース記念キャンペーン!
G3 Pro Unit を買って


Evergreen


無料でダウンロードしよう

Lightningで使えるおしゃれなデザインスキン / コンテンツデータを試せるチャンス!

2021年9月29日(水) ~ 10月31日(日)23:59 まで