MENU

【WordPress×PHP】オブジェクトとクラスの基本を解説

【WordPress×PHP】オブジェクトとクラスの基本を解説
目次

はじめに

【WordPress×PHP】条件分岐タグでページを判定する方法では、ページの種類を調べる条件分岐タグを解説しました。

ここまでの回で、$wp_query->found_postsやSWELL_Theme::get_setting()のように、->(矢印)や::(コロン2つ)を使った書き方が何度か出てきました。今回は、この書き方のもとになっているオブジェクトとクラスの基本を解説します。自分でクラスを作れるようになるところまでは目指さず、WordPressやSWELLのコードを読めるようになることをゴールにします。

このシリーズの全15回の構成は、第1回の記事の冒頭にまとめています。

クラスとオブジェクトとは?

クラスは、データ(値)と、そのデータを使う処理(関数)をひとまとめにした「設計図」です。オブジェクトは、その設計図から作った「実物」です。

クラスの中の値をプロパティ、クラスの中の関数をメソッドと呼びます。

簡単な例で見てみましょう。本の「タイトル」と「価格」を持つBookというクラスです。

class Book {
	public $title;  // プロパティ
	public $price;  // プロパティ

	public function __construct( $title, $price ) {
		$this->title = $title;
		$this->price = $price;
	}

	public function get_label() {  // メソッド
		return $this->title . '(' . $this->price . '円)';
	}
}

$book1 = new Book( 'PHP入門', 2000 );
$book2 = new Book( 'WordPress入門', 2500 );

echo $book1->title;       // PHP入門
echo $book2->get_label(); // WordPress入門(2500円)

実行すると、コメントのとおり「PHP入門」と「WordPress入門(2500円)」が表示されました。

  • new Book( … )で、設計図からオブジェクトを作る。1つのクラスから、中身の違うオブジェクトをいくつでも作れる
  • __construct()は、newでオブジェクトを作ったときに自動で実行されるメソッド
  • $thisは、クラスの中で「このオブジェクト自身」を指す
クラスとオブジェクトの関係。Bookクラスという設計図から、newで「PHP入門・2000円」と「WordPress入門・2500円」の2つのオブジェクトが作られ、それぞれがtitleとpriceのプロパティを持つ

【PHP】関数の作り方と使い方を解説で解説した関数と、【PHP】配列の基本と使い方を解説で解説した配列を、ひとまとめにしたもの、とイメージすると分かりやすいでしょう。

「->」と「::」の違い

「->」:オブジェクトのプロパティとメソッド

->は、オブジェクトのプロパティやメソッドを使うときの書き方です。

$book1->title;        // プロパティを取り出す
$book2->get_label();  // メソッドを実行する

メソッドには()を付け、プロパティには付けません。

「::」:クラスに直接つながるもの

::は、オブジェクトを作らずに、クラスそのものに用意されているものを使うときの書き方です。主に次の3つがあります。

書き方名前意味
クラス名::メソッド名()静的メソッドオブジェクトを作らずに呼び出せるメソッド
クラス名::$プロパティ名静的プロパティクラスに1つだけある値
クラス名::定数名クラス定数変更できない決まった値

消費税の計算をするTaxクラスで試してみます。

class Tax {
	const RATE = 0.1;  // クラス定数

	public static function add( $price ) {  // 静的メソッド
		return (int) ( $price * ( 1 + self::RATE ) );
	}
}

echo Tax::RATE;        // 0.1
echo Tax::add( 2000 ); // 2200

実行すると「0.1」と「2200」が表示されました。newでオブジェクトを作らずに使えている点が、->との違いです。staticが付いたメソッドが静的メソッドです。また、クラスの中では、自分のクラスをself::で指します。

「->」と「::」の違い。「->」は$book1のようなオブジェクト(変数)の後ろに付けてプロパティやメソッドを使う。「::」はTaxのようなクラス名の後ろに付けて、静的メソッド・静的プロパティ・定数を使う

見分け方は、左側が変数($で始まる)なら->、クラス名なら::です。

WordPressのオブジェクトを読む

WordPressでは、記事やカテゴリーのデータが、オブジェクトの形で渡されます。

記事のデータ:WP_Post

get_post()に投稿IDを渡すと、その記事のデータがWP_Postというクラスのオブジェクトで返ってきます。

$post_obj = get_post( 1 );

echo $post_obj->post_title;  // Hello world!
echo $post_obj->post_date;   // 2026-10-06 22:32:42

ローカル環境で調べると、WP_Postのオブジェクトには24個のプロパティがありました。よく使うものは次のとおりです。

プロパティ中身
ID投稿ID
post_titleタイトル
post_content本文(保存されたままの形)
post_date公開日時
post_modified最終更新日時
post_status状態(publishなら公開中)
post_type種類(postなら投稿、pageなら固定ページ)
post_author投稿者のID

そのほかの16個は、次のとおりです。

プロパティ中身
post_date_gmt公開日時(世界標準時)
post_modified_gmt最終更新日時(世界標準時)
post_excerpt抜粋(入力した場合のみ)
post_nameスラッグ(URLに使われる名前)
post_parent親ページのID(親がなければ0)
menu_order並び順(固定ページの「順序」)
post_password閲覧用のパスワード(設定した場合のみ)
comment_statusコメントを受け付けるか(openなら受け付ける)
comment_countコメントの数
ping_statusピンバック・トラックバックを受け付けるか
to_pingピンバックを送る予定のURL
pingedピンバックを送ったURL
guid記事を識別するための値(URLの形だが、リンクには使わない)
post_mime_typeファイルの種類(メディアの場合のみ。例:image/jpeg)
post_content_filteredプラグインなどが加工した本文を一時的に保存する場所(通常は空)
filterWordPressの内部で使う値の状態(通常はraw)

記事のURLを使いたいときは、guidではなく第5回で紹介したget_permalink()を使います。guidは記事を作った時点の値のまま変わらないため、パーマリンクの設定を変えると実際のURLと一致しなくなります。

SWELLのparts/single/post_head.phpでも、$post_data = get_post( $the_id );で記事のオブジェクトを受け取り、$post_data->post_authorで投稿者のIDを取り出しています。

カテゴリーのデータ:WP_Term

第5回で、get_the_category()は「カテゴリーの情報をまとめた配列」を返すと紹介しました。この配列の中身は、WP_Termというクラスのオブジェクトです。

$cats = get_the_category( 1 );

echo $cats[0]->name;     // 未分類
echo $cats[0]->slug;     // uncategorized
echo $cats[0]->count;    // 1(このカテゴリーの記事数)

$cats[0]で配列の1つ目を取り出し、その中のオブジェクトから->nameで名前を取り出しています。[ ]は配列、->はオブジェクト、と分けて読むのがポイントです。

get_the_categoryの戻り値の構造。配列の中にWP_Termオブジェクトが入っていて、$cats[0]で配列の1つ目のオブジェクトを取り出し、->nameで名前を取り出す

メインクエリ:WP_Query

第6回の実務サンプルで使った$wp_queryは、WP_Queryというクラスのオブジェクトです。$wp_query->found_postsは、そのプロパティを取り出していたわけです。

実は、ループで使ったhave_posts()も、中で$wp_query->have_posts()というメソッドを呼び出しています。テンプレートタグの多くは、こうしたオブジェクトを使いやすくするための関数なのです。

SWELLのコードを読む

SWELLは、テーマの機能の多くをSWELL_Themeというクラスにまとめていて、::で使っています。ローカル環境で、実際に値を取り出してみました。

SWELLのコード種類取り出した値
SWELL_Theme::get_setting( 'color_main' )静的メソッド#04384c(メインカラーの設定)
SWELL_Theme::$list_type静的プロパティcard(記事一覧の表示形式)
SWELL_Theme::DB_NAME_CUSTOMIZERクラス定数loos_customizer(設定を保存している場所の名前)

また、SWELLのファイルの冒頭には、次のような1行がよく出てきます。

use \SWELL_Theme as SWELL;

これは「このファイルの中では、SWELL_ThemeをSWELLという短い名前で呼びます」という意味です。そのため、SWELL::get_setting()とSWELL_Theme::get_setting()は同じものを指します。

よくあるエラー

オブジェクトの扱いを間違えたときに表示されるエラーを、ローカル環境で確かめました(ファイルの場所は省略しています)。

オブジェクトを配列のように書いた

$post_obj = get_post( 1 );
echo $post_obj['post_title'];

これは「WP_Postのオブジェクトを配列として使うことはできません」という意味です。$post_obj->post_titleと書きます。

存在しない記事のプロパティを取り出した

$post_obj = get_post( 9999 );  // 存在しない投稿ID
echo $post_obj->post_title;

get_post()は、記事が見つからないとnull(何もない)を返します。nullからプロパティを取り出そうとして、警告が出ました。これは警告なので、処理は止まらずに続きます。取り出す前に、if ( $post_obj )で確認しておきましょう。

存在しないメソッドを呼び出した

WP_Postにはget_title()というメソッドはありません。タイトルは->post_title(プロパティ)で取り出します。

WP_Postで、存在しないプロパティ名(たとえば$post_obj->title)を書いても、エラーにはならず、空の文字列が返ってきました。WP_Postには、知らない名前のプロパティを指定されたときに、その名前のカスタムフィールド(第14回で解説します)を探す仕組みがあるためです。エラーが出ないぶん気付きにくいので、プロパティ名は正確に書きましょう。

実務サンプル:記事の文字数と読み終わるまでの目安を表示する

ここまでの内容を使って、記事のタイトルの上に「この記事は約1,200文字です(読み終わるまでの目安:約3分)」と表示してみましょう。

子テーマのfunctions.phpに、次のコードを追加します。

/**
 * 記事の文字数と、読み終わるまでの目安時間をタイトルの上に表示する
 */
add_action( 'swell_before_post_head', function( $post_id ) {
	$post_obj = get_post( $post_id );
	if ( ! $post_obj ) {
		return;
	}

	$text    = wp_strip_all_tags( $post_obj->post_content );
	$text    = preg_replace( '/\s+/u', '', $text );
	$length  = mb_strlen( $text );
	$minutes = max( 1, (int) ceil( $length / 500 ) );

	echo '<p class="kurumico-reading-time">この記事は約' . number_format( $length )
		. '文字です(読み終わるまでの目安:約' . $minutes . '分)</p>';
} );

子テーマのstyle.cssには、次のCSSを追加します。

.kurumico-reading-time {
	margin-bottom: 1.5em;
	font-size: .85em;
	color: #666;
}

本文が1,200文字の記事を開くと、次のように表示されました。

SWELLの投稿ページ。タイトル「文字数を数える記事」の上に「この記事は約1,200文字です(読み終わるまでの目安:約3分)」と表示されている

コードのポイントは次のとおりです。

  • get_post()で記事のオブジェクト(WP_Post)を受け取り、->post_contentで本文を取り出している
  • 記事が見つからなかったとき(null)に備えて、if ( ! $post_obj )で確認してから使っている
  • wp_strip_all_tags()でHTMLタグを取り除き、preg_replace()で空白と改行を取り除いてから、mb_strlen()で文字数を数えている
  • 1分あたり500文字として、ceil()(小数点以下の切り上げ)で分数を計算している。1,200文字なら2.4分なので、切り上げて3分

500の部分を変えれば、目安の速さを調整できます。

よくある質問・エラー対処

Q. オブジェクトにどんなプロパティがあるか調べたいです

→ ローカル環境で、var_dump( $post_obj );やprint_r( $post_obj );を実行すると、中身がすべて表示されます。WordPressの公式リファレンス(developer.wordpress.org)で、クラス名(WP_Postなど)を調べる方法もあります。


Q. 「?->」という書き方を見かけました

→ PHP 8から使えるようになった書き方(nullsafe演算子)です。$post_obj?->post_titleと書くと、$post_objがnullのときは警告を出さずにnullを返します。ローカル環境でも、存在しない記事に使って警告が出ないことを確認しました。

おわりに(まとめ)

まとめ

「->」と「::」の意味が分かれば、WordPressやSWELLのコードがぐっと読みやすくなります。

  • ✅ クラスは設計図、オブジェクトはそこから作った実物
  • ✅ クラスの中の値はプロパティ、関数はメソッド
  • ✅ 「->」はオブジェクト(変数)、「::」はクラス名の後ろに付ける
  • ✅ 記事のデータはWP_Post、カテゴリーのデータはWP_Termのオブジェクト
  • ✅ SWELLの機能の多くは、SWELL_Theme::get_setting()のような静的メソッドで使われている
  • ✅ オブジェクトを使う前に、nullでないことを確認する

次回は、ここまで何度も使ってきた「add_action」の仕組み、アクションフックについて解説します。解説します。

次回は、アクションフック(add_action)について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次