Web制作の現場で「毎回必ず使うのに、絶妙に書き方を忘れてググってしまう」WordPressのコードを集めました。
エスケープ処理(安全対策)などを施した実戦投入レベルのコードです。そのままコピーしてテンプレートに貼り付けてください。
リンクタグ(aタグ)や画像タグ(imgタグ)の属性値としてそのまま使えるように、esc_url()
などで安全に処理しています。
<!-- トップページのURL(リンク用) -->
<?php echo esc_url( home_url( '/' ) ); ?>
<!-- テーマディレクトリのURL(画像やCSSの読み込み用) -->
<?php echo esc_url( get_template_directory_uri() ); ?>
<!-- サイト名(タイトル) -->
<?php bloginfo( 'name' ); ?>
<!-- カスタムタイトル出力の例(記事タイトル | サイト名) -->
<?php echo esc_html( get_the_title() ) . ' | ' . get_bloginfo( 'name' ); ?>
<!-- 記事の公開日(Y/m/d形式) -->
<?php the_time( 'Y/m/d' ); ?>
<!-- テンプレートパーツの読み込み(例:inc/gnav.php) -->
<?php get_template_part( 'inc/gnav' ); ?>
アイキャッチ一覧などで、タイトルが長すぎる場合に指定文字数(この例では32文字)でカットし、「…」を付与します。マルチバイト文字(日本語)対応です。
<?php
if ( mb_strlen( $post->post_title, 'UTF-8' ) > 32 ) {
$title = mb_substr( $post->post_title, 0, 32, 'UTF-8' );
echo esc_html( $title ) . '…';
} else {
echo esc_html( $post->post_title );
}
?>
本文(the_content)から画像やHTML装飾タグを安全に取り除き、純粋なテキストだけを抽出してから指定文字数(例:50文字)で丸め込みます。
<?php
// 本文からHTMLタグを全て除去
$content = wp_strip_all_tags( get_the_content() );
if ( mb_strlen( $content, 'UTF-8' ) > 50 ) {
$content = mb_substr( $content, 0, 50, 'UTF-8' );
echo esc_html( $content ) . '…';
} else {
echo esc_html( $content );
}
?>
the_post_thumbnail()
では自動でHTMLが出力されて不都合な場合に、画像の「URLだけ」を取得して独自の
<img>
タグや背景画像として利用するための鉄板記述です。
<?php if ( has_post_thumbnail() ) : // アイキャッチ画像が設定されているか判定 ?>
<?php
// 1. サムネイルのIDを取得
$thumbnail_id = get_post_thumbnail_id();
// 2. 画像情報を配列で取得(サイズは 'thumbnail', 'medium', 'large', 'full' 等)
$img = wp_get_attachment_image_src( $thumbnail_id, 'large' );
// 戻り値の配列構造:
// $img[0] => 画像のURL
// $img[1] => 横幅 (width)
// $img[2] => 高さ (height)
?>
<!-- 独自にimgタグを組み立てる例 -->
<img src="<?php echo esc_url( $img[0] ); ?>" width="<?php echo esc_attr( $img[1] ); ?>" height="<?php echo esc_attr( $img[2] ); ?>" alt="<?php echo esc_attr( get_the_title() ); ?>">
<?php else : ?>
<!-- サムネイルがない場合の代替画像(No Image) -->
<img src="<?php echo esc_url( get_template_directory_uri() ); ?>/images/no-image.jpg" alt="No Image">
<?php endif; ?>
トップページに新着記事を出したり、サイドバーに関連記事を出したりする際に使う、最も標準的で安全な
WP_Query の構成です。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプ
'posts_per_page' => 5, // 表示件数
'orderby' => 'date', // 日付順
'order' => 'DESC', // 降順
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : ?>
<ul class="post-list">
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<!-- 繰り返す中身 -->
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>記事がありません。</p>
<?php endif; ?>
<?php wp_reset_postdata(); // 必須:グローバル変数を元に戻す ?>
single.php
のフッター等で「最新記事」や「関連記事」を
WP_Query
で出す際、いま読んでいる記事自体が一覧に混ざらないようにするための必須パラメータ(post__not_in)です。
<?php
global $post; // 現在の記事情報を取得
$args = array(
'post_type' => 'post',
'posts_per_page' => 4,
'post__not_in' => array( $post->ID ), // ← いま開いている記事を除外(配列で渡すのがポイント)
);
$the_query = new WP_Query( $args );
?>
<!-- この後に $the_query->have_posts() などのループ処理が続く -->
WP_Queryで作成したサブループに対して、プラグイン「WP-PageNavi」を正しく連動させるための必須セット($paged
の取得と query 引数の渡し方)です。
<?php
// 1. 現在のページ番号を取得
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
// 2. WP_Queryの引数に paged をセット
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged, // ← これが必須
);
$the_query = new WP_Query( $args );
?>
<!-- ここに $the_query->have_posts() などのループ処理 -->
<?php
// 3. WP-PageNavi の出力(作成したクエリを配列で渡す)
if ( function_exists( 'wp_pagenavi' ) ) {
wp_pagenavi( array( 'query' => $the_query ) );
}
wp_reset_postdata(); // ループの後に忘れずに
?>
「公開日:〇〇(更新日:〇〇)」と表示したいけれど、同じ日付のままなら更新日は隠しておきたい…という、実務で100%直面する要件をクリアする記述です。
<time datetime="<?php the_time( 'Y-m-d' ); ?>">公開日: <?php the_time( 'Y.m.d' ); ?></time>
<?php if ( get_the_modified_time( 'Y-m-d' ) !== get_the_time( 'Y-m-d' ) ) : ?>
<time datetime="<?php the_modified_time( 'Y-m-d' ); ?>">(更新日: <?php the_modified_time( 'Y.m.d' ); ?>)</time>
<?php endif; ?>
オリジナルのSNSシェアボタンを作るときや、ページのスラッグ名を取得して
body
タグのクラスに付与したい時に、「あれ、どうやって取るんだっけ?」となる記述です。
<!-- 現在のページのURLを取得 -->
<?php
global $wp;
$current_url = esc_url( home_url( add_query_arg( array(), $wp->request ) ) );
?>
<!-- 現在の固定ページのスラッグを取得(ループ外でも可) -->
<?php
$page_slug = '';
if ( is_page() ) {
$page = get_post( get_queried_object_id() );
$page_slug = $page->post_name;
}
?>
ACFなどのプラグインを使わず、WordPressの標準機能で登録したカスタムフィールドを取得する基本記述です。第3引数を
true にすると文字列で、false
にすると配列で返ります。
<?php
// 基本形:get_post_meta( 投稿ID, フィールドのキー名, 単一値で返すか )
$value = get_post_meta( get_the_ID(), 'your_field_key', true );
if ( $value ) {
echo esc_html( $value );
}
?>
<?php
// 複数値が入っている場合(第3引数をfalseにすると配列で返る)
$values = get_post_meta( get_the_ID(), 'your_field_key', false );
if ( ! empty( $values ) ) {
foreach ( $values as $v ) {
echo esc_html( $v ) . '<br>';
}
}
?>
解説:なぜこのコードなのか?
ネット上には様々なWordPressのコードが溢れていますが、当サイトのスニペットは「実際のWeb制作の現場でそのまま使える安全性と確実性」を重視して構成しています。特によく使う以下のタグ・関数については、その意味を理解しておくと応用が利きます。
-
esc_url() / esc_html()
等のエスケープ処理
出力するデータに悪意のあるコード(XSS攻撃など)が混ざっていても、無害な文字列に変換して出力するための必須関数です。リンクのURLには
esc_url()、ただのテキストには
esc_html() や
esc_attr()
を噛ませるのがプロの現場の絶対ルールです。
-
wp_reset_postdata() の重要性
WP_Query
などでサブループを作った後、これを書き忘れると「その後のページ出力(ヘッダーやサイドバーなど)が全部サブループの記事データに上書きされてしまう」という恐ろしいバグが発生します。サブループとセットで必ず記述してください。
-
have_posts() と the_post() の役割
have_posts()
は「まだ表示する記事が残っているか?」を判定し、the_post()
は「次の記事データをセットして、the_title()
などを使える状態にする」という役割を持っています。
ここにないタグ・関数の調べ方
WordPressには数千もの独自関数が存在します。自分が実現したい機能に合わせて、以下の方法で検索・調査するクセをつけるのが上達の近道です。
-
WordPress公式のリファレンスを活用する
まずは公式の
WordPress Developer Resources(英語)
や、日本語化されたCodexを確認しましょう。「引数に何を渡せるのか」「戻り値は配列か文字列か」といった正確な仕様が載っています。
-
「関数名 +
使い方」で検索時の注意点
Google等で検索する場合、古い記事(5年以上前)のコードは現在のPHPのバージョンやWordPressのセキュリティ基準に合っていない(非推奨関数が使われている)ことが多々あります。なるべく1〜2年以内の新しい記事を参考にし、そのままコピペせず「エスケープ処理はされているか?」を確認する視点を持ちましょう。
-
類似のテーマファイルの中身を覗く
公式ディレクトリに登録されている無料テーマ(LightningやSnow
Monkeyなど)のソースコードは、非常に勉強になる「生きた教材」です。「あの機能、どうやって実装してるんだろう?」と思ったら、テーマのPHPファイルを直接読んで書き方を真似るのが最も確実です。