特徴
- HTMLがPHPファイル内で書ける
- <?php 処理 ?>これだけでコードが走る
- <?php 〜処理 ?>はファイル内で何回も書ける、HTMLの途中で一行だけ書いてそれを複数書くとかもできる
- 終わりの ?> の部分は省略できる
- エントリーポイントがわかりにくい(PHPを扱う環境によって調べ方があるようだ。)
- 動的型付け言語なので、変数の型を自由に変更できる
|
1 2 3 4 5 6 7 8 9 10 |
$a = []; function test(){ $c = ['1' => 'a', '2' => 'b']; return $c; } $a = test(); print_r($a); //正常終了 |
<?= ?>
<?= ?>は値をHTMLに出力する専用タグ(<?php echo ... ?>の短縮形)です。<?=は主にテンプレート表示で便利ですが、基本は<?phpを使い、HTML埋め込み時には<?=を使うのが一般的です。
変数
- 頭に【$】をつける。
- 変数の型は推論型で型指定不要。
- 予約語が使えるが非推奨。
- floatはdoubleで返される。正確な型を知るには【var_dump(変数)】を使用する。
- ブール型は true で 1 だが false は何も入らない。
- 文字、文字列を扱う時はシングルコーテーションを使う。HTMLは普通にダブルコーテーション。
- スコープ特殊で関数外変数は関数内と同じ変数名を使用しても別扱いとなる。関数外の変数を扱う場合 $変数 の前に global を付けて宣言し直す。例 global $変数;
スーパーグローバル変数
元々PHPで定義されている変数のこと、$GLOBALS以外は $_ から始まる。
PHP内のどこからでも呼べる
- $GLOBALS
- $_SERVER[]
- $_GET[‘キー’]
- $_POST[‘キー’]
- $_FILES[‘キー’]
- $_COOKIE[‘キー’]
- $_SESSION[‘キー’]
- $_ENV[‘キー’]
- $_REQUEST[‘キー’]
$_SERVER
主な引用元https://qiita.com/With21/items/1c0520921d8729813473
- $_SERVER[‘PHP_SELF’]
- $_SERVER[‘GATEWAY_INTERFACE’]
- $_SERVER[‘SERVER_ADDR’]
- $_SERVER[‘SERVER_NAME’]
- $_SERVER[‘SERVER_NAME’]
- $_SERVER[‘SERVER_PROTOCOL’]
- $_SERVER[‘REQUEST_METHOD’]
- $_SERVER[‘REQUEST_TIME’]
- $_SERVER[‘REQUEST_TIME_FLOAT’]
- $_SERVER[‘QUERY_STRING’]
- $_SERVER[‘DOCUMENT_ROOT’]
- $_SERVER[‘HTTPS’]
- $_SERVER[‘HTTP_ACCEPT’]
- $_SERVER[‘HTTP_ACCEPT_CHARSET’]
- $_SERVER[‘HTTP_ACCEPT_ENCODING’]
- $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]
- $_SERVER[‘HTTP_CONNECTION’]
- $_SERVER[‘HTTP_HOST’]
- $_SERVER[‘HTTP_REFERER’]
- $_SERVER[‘HTTP_USER_AGENT’]
- $_SERVER[‘REMOTE_ADDR’]
- $_SERVER[‘REMOTE_HOST’]
- $_SERVER[‘REMOTE_PORT’]
- $_SERVER[‘REMOTE_USER’]
- $_SERVER[‘REDIRECT_REMOTE_USER’]
- $_SERVER[‘SCRIPT_FILENAME’]
- $_SERVER[‘SERVER_ADMIN’]
- $_SERVER[‘SERVER_PORT’]
- $_SERVER[‘SERVER_SIGNATURE’]
- $_SERVER[‘PATH_TRANSLATED’]
- $_SERVER[‘SCRIPT_NAME’]
- $_SERVER[‘REQUEST_URI’]
- $_SERVER[‘PHP_AUTH_DIGEST’]
- $_SERVER[‘PHP_AUTH_USER’]
- $_SERVER[‘PHP_AUTH_PW’]
- $_SERVER[‘AUTH_TYPE’]
- $_SERVER[‘PATH_INFO’]
- $_SERVER[‘ORIG_PATH_INFO’]
ファイル関連
- ABSPATH
- __DIR__
- require_once
- wp_enqueue_script()
- wp_enqueue_style()
データベース関連
$wpdb->get_charset_collate()
データベーステーブルを作成または更新する際に、WordPress環境(wp-config.phpで設定された文字セットと照合順序)と一致する文字セット(Character Set)と照合順序(Collation)を取得するためのメソッドです。
使用例
通常、dbDelta() 関数と一緒に使用します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
global $wpdb; $table_name = $wpdb->prefix . 'my_table'; // 文字セットと照合順序を取得 $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, data varchar(255) NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; // ここで適用 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); |
戻り値の例
通常、DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci のような文字列が返されます。
まとめ
プラグインやテーマ開発で独自のテーブル(CREATE TABLE)を作成する際は、必ずこの関数を使って文字セットを設定すべきです。特に多言語サイトや、日本語を扱う場合に重要です。
dbDelta()
dbDelta()関数は、SQLのCREATE TABLE文を元に、テーブルの新規作成や既存テーブルの構造更新(ALTER)を自動で行う強力な関数です。データや既存のカラムを維持しながら、プラグインのバージョンアップ等に合わせてデータベース構造を最新に保つ効果があります。
主な効果と特徴:
- 安全な構造更新: テーブルが存在しない場合は作成し、存在する場合は
ALTER TABLEを発行して差分を更新する。 - バージョン対応: プラグイン有効化時やアップグレード時にスキーマを自動更新できる。
- 制約: カラム定義は1行に1つずつ記述し、
PRIMARY KEYの前後にはスペースが2つ必要など、厳密な書式が求められる。
使用する際は、require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );で関数を読み込む必要があります。
⚠️注意
テーブル追加、変更した場合は一度:
- プラグイン停止
- プラグイン削除しないでOK
- 再度有効化
してください。
そうすると新テーブルが作られます。
$wpdb->get_results()
データベースから複数行のデータを取得する際に使用されます。
1. 第一引数:$query(文字列 / 必須)
実行したい SQL文(SELECTクエリ) を指定します。
セキュリティ(SQLインジェクション対策)のため、外部からの入力値を含む場合は必ず $wpdb->prepare() でラップしたクエリを渡すのが推奨されます。
2. 第二引数:$output_type(定数 / 任意)
返り値の データ形式 を指定します。デフォルトは OBJECT です。
| 指定できる定数 | 説明 | データの取り出し方 |
|---|---|---|
OBJECT (初期値) | 数値添字配列の中に、各行がオブジェクトとして格納される | $results[0]->column_name |
ARRAY_A | 数値添字配列の中に、各行が連想配列(カラム名がキー)として格納される | $results[0]['column_name'] |
ARRAY_N | 数値添字配列の中に、各行が数値添字配列として格納される | $results[0][0] |
OBJECT_K | 第一カラムの値をキーとした、行オブジェクトの連想配列を返す | $results['key_value']->column_name |
基本的な使い方の例
|
1 2 3 4 5 6 7 8 9 10 11 12 |
global $wpdb; // 1. クエリを準備 $query = $wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_status = %s", 'publish'); // 2. 連想配列形式で取得 $results = $wpdb->get_results($query, ARRAY_A); // 3. 結果の表示 foreach ($results as $row) { echo $row['post_title']; } |
$wpdb->prepare()
SQL文の中に変数を安全に埋め込むためのメソッドです。主な引数は、「SQLの雛形(クエリ)」と「埋め込む値」の2つ(またはそれ以上)です。
1. 第一引数:$query(文字列)
埋め込みたい場所に 「プレースホルダ」 と呼ばれる記号を置いたSQL文を指定します。
よく使われるプレースホルダ:
%d:整数(integer)%s:文字列(string)%f:浮動小数点数(float)%i:テーブル名やカラム名(identifier) ※WP 6.1以降
2. 第二引数以降(または配列):$args
プレースホルダに当てはめる 「実際の値」 を指定します。
- 個別指定(可変長引数):
$wpdb->prepare($sql, $val1, $val2, ...)のように順に並べます。 - 配列指定:
$wpdb->prepare($sql, array($val1, $val2))のように、値をひとまとめにした配列を渡すことも可能です。
具体的な使用例
プレースホルダを使うことで、WordPress Developer Resources で解説されている通り、クォート処理(' で囲むなど)が自動で行われ、SQLインジェクションを防ぐことができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
global $wpdb; $user_id = 5; $status = 'active'; // %d は整数、%s は文字列に置き換わります $query = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}users WHERE ID = %d AND user_status = %s", $user_id, // %d に入る $status // %s に入る ); $results = $wpdb->get_results($query); |
注意点
- クォートは不要: プレースホルダ自体を
'(シングルクォート)で囲む必要はありません(例:WHERE name = %sでOK、'%s'とは書かない)。 %記号の扱い:LIKE検索などで%を文字として使いたい場合は、%%と重ねて記述するか、WordPressの公式ガイド にあるように値を渡す側で調整します。
データベースの注意点
user_id のようなカラム名は【insert()】等で %s で明示しないと数値扱いされて文字列を入れたときに 0 になる。
|
1 2 3 4 5 6 7 8 9 10 11 |
$wpdb->insert( $table, [ "user_id" => $user_id, "display_name" => $display_name ], [ "%s", "%s" ] ); |
コメントアウト
C言語と同じ。
// 一行
/**/ 範囲
配列
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $aaa = array(2); $aaa[0] = 1; $aaa[1] = 2; $bbb = array('ああ', 'いい'); $ccc = ['ああ', 'いい'] //多次元 $ddd = [ ['ああ', 'いい'],['うう', 'ええ'] ]; echo ($ddd[1][0]); //結果 //うう |
連想配列の書き方
通常の配列の宣言に => を使うと左がキー、右が値の連想配列ができる。
PHPの配列は配列の中に配列を入れられるので連想配列を連結することができます。
主にJSON形式にする場合に使用する
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?php $a = array('aaa' => '1', 'bbb' => '2'); $b = [ 1 => 'a', 2 => 'b' ] $aa = [ [ 'title' => 'タイトル1', 'reportDateTime' => '2025-09-07', 'weather' => '晴れ' ], [ 'title' => 'タイトル2', 'reportDateTime' => '2025-09-08', 'weather' => '曇り' ] ]; //キー毎にまとめる $bb = [ 'forecast1' => [ 'title' => 'タイトル1', 'reportDateTime' => '2025-09-07', 'weather' => '晴れ' ], 'forecast2' => [ 'title' => 'タイトル2', 'reportDateTime' => '2025-09-08', 'weather' => '曇り' ] ]; //アクセス方法 echo $a['aaa']; //出力 1 echo $b[1]; //出力 a echo $aa[1]['title']; //出力 タイトル2 echo $bb['forecast1']['reportDateTime']; //出力 2025-09-07 //要素の追加 $a['追加キー'] = '追加する値'; //要素の削除 unset($a['削除したいキー']); //要素の連結 $c = array_merge($a, $b); |
演算子
演算子はC言語とほぼ同じ。
イコール3つ === は厳密等価演算子と呼ばれ、値と型の両方が一致しているかを比較する
if文の書き方
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $a = 1; if($a == 1){ echo ('あ'); }else if ($a == 2){ echo ('い'); }else{ echo ('う'); } ?> //結果 //あ |
繰り返し処理
foreachはC言語とかと変数の配置が逆かつ as を表記
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php //for(スタート値; 継続条件; 増減){} for($i = 0; $i <= 3; $i++){ echo $i.'\n' //'\n'は改行'<br>'でも可 } ?> //break continue は使用可能 //結果 //1 //2 //3 //while <?php $i = 0; while($i < 3){ echo $i.','; $i++; } ?> //結果 //0,1,2 //foreach <?php foreach($配列とか as $取り出されて入る変数){ 処理 } ?> |
関数の書き方
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php function aaa($a){ echo $a.'\n'; return $a++; } $b = aaa(1); //変数に代入が可能 $c = function($d){ echo $d; }; //セミコロン必須 $c($b); //結果 //1 //2 |
デフォルト関数(getが付く物はHTML内で使う時はechoを頭につける)
- echo
- var_dump()
- print_r()
- echo_count()
- var_export()
- get_theme_file_url(‘テーマディレクトリからのパス’)
- home_url(‘必要なファイルのパス’)
- get_header() & get_footer
- have_posts()
- the_posts()
- the_title()
- the_date()
- the_content()
- the_permalink()
- get_sideber()
- is_admin()
- is_main_query()
- is_front_page()
- is_home()
- is_single()
- is_singulare()
- the_posts_pagination()
- add_action()
- add_filter()
API関連でよく使う関数
- register_rest_route()
- register_rest_field()
- wp_send_json()
wp_remote_get()/wp_remote_post()- rest_ensure_response()
- is_user_logged_in()
- current_user_can()
クラス
変数や関数にアクセスするには -> を使う、その時変数の$が取れる。
public protected private 使用可能。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php class Aaa { //PHPではクラスの頭文字を大文字にするのが慣習 public $a; public function __construct(){ //コンストラクタ、アンダーバー2つ echo 'hello'.'\n'; $this->a = 0; //$取れる } function aaa(){ echo 'あ' } } $b = new Aaa(); //インスタンス化 $b->a = 1; //$取れる $b->aaa(); echo $b->a.'\n'; //結果 //hello //あ //1 //未定義の変数は使用してもエラーが出ない、そして何も代入されない |
コロン構文
{}を使わない書き方 : と end~ に置き換える書き方。
これを使うと処理をまとめて書ける。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php for(): //処理 endfor; while(): //処理 endwhile; foreach(): //処理 endforeach; ?> //複数処理をまとめて書く <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> //表示処理 <?php endwhile; endif; ?> |
サブクエリ(任意のページのデータをDBから取得する)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $a = [ //クエリする条件を連想配列にする 'post_type' => 'post', //記事の種類 通常の記事(カスタムではない) 'posts_per_page' => 5 //ページ数 ]; $b = new WP_Query($a); //引数の条件のデータを取得するクラスをインスタンス化 ?> <?php //通常のデータ表示処理にインスタンス化した変数を追加 if ($b->have_posts()){ while ($b->have_posts()){ $b->the_post(); //表示灯の処理 } } wp_reset_postdate(); //メモリの解放(the_post()の)、必須 ?> |
アクションフック
特定の関数に処理を追加、または変更することができる
例:メインクエリで取ってくる最新の投稿10件分を特定の投稿タイプの時だけ9件に変更する
※functions_php に書く
API作成例
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php function change_set_post($query){ if(is_admin() || !$query->is_main_query()) { return; } if(&query->is_post_type_archive('works')) { //worksタイプの投稿なら $query->set('posts_per_page', 9); //取ってくる最新の投稿記事数を9件に return; } } add_action('pre_get_posts', 'change_set_post'); //フック関数、第一引数にフックする関数第二引数に自作関数 //pre_get_postsはメインクエリが実行される直前の関数 |
add_action() 主要な第一引数の一覧
サイトの読み込み・初期化関連
init | WordPress本体の読み込みが完了した直後に実行。テーマやプラグインの初期設定で最も使われる。 |
after_setup_theme | テーマのfunctions.phpが読み込まれた直後に実行。テーマサポートの設定に最適。 |
wp_loaded | WordPressが完全に読み込まれた後に実行。 |
管理画面関連 (Administration)
admin_menu | 管理画面のメニューに項目を追加する時。 |
admin_init | 管理画面の各ページが表示される前に実行。 |
admin_enqueue_scripts | 管理画面のCSS/JSを読み込む時。 |
フロントエンド(テーマ)関連
wp_enqueue_scripts | テーマのフロントエンドでCSSやJSを読み込む(wp_enqueue_script)時に使用。 |
wp_head | <head> タグの閉じる直前(wp_head()関数内)にコードを追加。 |
wp_footer | </body> タグの直前(wp_footer()関数内)にコードを追加。 |
get_sidebar | サイドバーを表示する前に実行。 |
コンテンツ・投稿関連
wp_insert_post | 投稿がデータベースに追加・更新された直後に実行。 |
publish_post | 投稿が公開された時。 |
save_post | 投稿が保存(新規・更新)された時に実行。 |
delete_post | 投稿が削除された時に実行。 |
コメント関連
comment_post | コメントが投稿された直後に実行。 |
wp_set_comment_status | コメントのステータス(承認/スパムなど)が変更された時。 |
ユーザー関連
wp_login | ユーザーがログインした時に実行。 |
wp_logout | ユーザーがログアウトした時に実行。 |
user_register | 新しいユーザーが登録された時に実行。 |
add_action の基本構成
|
1 |
add_action( '第一引数:アクションフック名', 'コールバック関数名', 優先順位, 受け取る引数の数 ); |
第一引数は上記の通り、do_action('タグ名')で定義されたフック名です。
xmlを扱う
準備として
file_get_contents()でxmlファイルを読み込み、
simplexml_load_string()でオブジェクト化する。
simplexml_load_file(‘ファイルパス’)でもok、これなら一行。
出来たオブジェクトからアロー演算子でアクセスする。
|
1 2 3 4 5 6 7 8 9 |
//xml中身 <Body>あああ</Body> <?php $a = simplexml_load_file('~~.xml'); echo $a->Body; //結果 //あああ |
xpathが使用可能
要素にアクセスする場合に xpath で指定することができ、直接アクセス可能。
ただし xml に名前空間(xmlns属性)がある場合、SimpleXMLElementのxpathはそのままでは要素を見つけられません。
xmlns= “~~” がある場合は registerXPathNamespace(‘変数’, ‘~~’) を使用してからパスの前に : を使って記述する。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php //xml中身 <Control><Body>あああ</Body></Control> <?php $a = simplexml_load_file('~~.xml'); echo $a->xpath('//Body')."\n"; //xml中身 <Report xmlns="~~/" xmlns:jmx="~~" xmlns:jmx_add="~~"> // <Control><Body>いいい</Body></Control> $b = simplexml_load_file('~~.xml'); $c->registerXPathNamespace('変数', '~~'); // 実際のXMLの名前空間URIに合わせて変更(目的のパスの直上にあるxmlns=" ") echo $c->xpath('//変数:Body'); //結果 //あああ //いいい |
json変換
|
1 2 3 4 5 |
<?php $obj = simplexml_load_file('~~.xml'); $json = json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); //json形式へ $test = json_decode($json, true); //配列にデコード |
その他
- false は int にキャストすると 0 になる
コメント