WordPressの定型的な処理
このページでは、条件分岐やループ処理などWordPressでよく使う定型処理(構文)について説明しています。
内容は、Codex のPHP コーディング規約を参考にしています。
条件分岐
条件に応じて動作を変える。
【参考】条件分岐タグ(Codexオンラインマニュアル)
条件分岐処理の基本
<?php if(条件): ?>
条件がtrueの時に実行される動作
<?php else: ?>
条件がfalseの時に実行される動作
<?pho endif; ?>
<?php
if ( 条件1 ) {
// 条件1に該当する場合の処理
}
?>
複数の条件分岐
論理和と論理積を使った条件判定。
論理和を使った場合
// コメント機能が有効またはコメントが存在する場合にcomments_template();を実行する。
if ( comments_open() || get_comments_number() ) {
comments_template();
}
論理積を使った場合
// コメント機能が有効かつコメントが存在する場合にcomments_template();を実行する。
if ( comments_open() && get_comments_number() ) {
comments_template();
}
論理値の反転
「!」を使うことで、真→偽に偽→真に反転させることができます。
// 条件が成立しない(偽の)場合に、処理が実行される。
if ( ! 条件 ) {
処理
}
比較演算子
X == Y :等しければ真
X != Y :等しくなければ真
X > Y :XがYより大きければ真
X >= Y :XがY以上なら真
X < Y :XがYより小さければ真
X <= Y :XがY以下なら真
X === Y : 型も含めてXとYが等しければ真
複雑な分岐処理
<?php
if ( 条件1 ) {
条件1が成立したときに実行される処理
if ( 条件2 ) {
条件1が成立し条件2が成立したときに実行される処理
} else {
条件1が成立し条件2が不成立のときに実行される処理
}
} elseif ( 条件3) {
条件1が不成立で条件3が成立したときに実行される処理。
} elseif ( 条件4 ) {
条件1と条件3が不成立で条件4が成立した時に実行される処理
}
?>
条件分岐の例
index.phpの場合
<?php
/**
* The main template file
*
* This is the most generic template file in a WordPress theme
* and one of the two required files for a theme (the other being style.css).
* It is used to display a page when nothing more specific matches a query.
* E.g., it puts together the home page when no home.php file exists.
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
*
* @package WordPress
* @subpackage Twenty_Twenty_One
* @since Twenty Twenty-One 1.0
*/
get_header(); ?>
<?php if ( is_home() && ! is_front_page() && ! empty( single_post_title( '', false ) ) ) : ?>
<header class="page-header alignwide">
<h1 class="page-title"><?php single_post_title(); ?></h1>
</header><!-- .page-header -->
<?php endif; ?>
<?php
if ( have_posts() ) {
// Load posts loop.
while ( have_posts() ) {
the_post();
get_template_part( 'template-parts/content/content', get_theme_mod( 'display_excerpt_or_full_post', 'excerpt' ) );
}
// Previous/next page navigation.
twenty_twenty_one_the_posts_navigation();
} else {
// If no content, include the "No posts found" template.
get_template_part( 'template-parts/content/content-none' );
}
get_footer();
switch文
変数を異なる値と比較し、値に応じて異なった処理を行う。
// swtich 文:変数$iの値により処理が分岐する。
// $iが0の時処理1を行う。
// $iが1の時処理2を行う。
// $iが2の時処理3を行う。
// 一致する条件がない場合処理4を行う。
// case文に一致する条件が無くdefault文もない場合は処理は実行されない。
<?php
switch ($i) {
case 0:
処理1;
break;
case 1:
処理2;
break;
case 2:
処理3;
break;
default:
処理4;
}
?>
上記switch文と下記switch文は等価。
<?php
switch ($i):
case 0:
処理1;
break;
case 1:
処理2;
break;
case 2:
処理3;
break;
default:
処理4;
endswitch;
?>
switch文例
/**
* Return uniform "anonymous" data by type.
*
* @since 4.9.6
*
* @param string $type The type of data to be anonymized.
* @param string $data Optional The data to be anonymized.
* @return string The anonymous data for the requested type.
*/
function wp_privacy_anonymize_data( $type, $data = '' ) {
switch ( $type ) {
case 'email':
$anonymous = 'deleted@site.invalid';
break;
case 'url':
$anonymous = 'https://site.invalid';
break;
case 'ip':
$anonymous = wp_privacy_anonymize_ip( $data );
break;
case 'date':
$anonymous = '0000-00-00 00:00:00';
break;
case 'text':
/* translators: Deleted text. */
$anonymous = __( '[deleted]' );
break;
case 'longtext':
/* translators: Deleted long text. */
$anonymous = __( 'This content was deleted by the author.' );
break;
default:
$anonymous = '';
break;
}
繰り返し構文
while
条件が成立するまで処理を繰り返す。
// 条件が成立するまで処理を繰り返す。
while (条件) :
処理
条件の更新(更新を続けることで条件が成立するように更新する)
endwhile;
条件が成立するまで処理を繰り返す。(PHPの制御構造を用いた場合)
<?php
while(条件) {
処理
条件の更新(更新を続けることで条件が成立するように更新する)
}
?>
WordPressループ
投稿がある間は処理を繰り返す。
<?php if ( have_posts() ) : ?>
<?php while(have_posts()): the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php endif; ?>
投稿がある場合に処理を繰り返す。投稿がない場合は別の処理を行う。
<?php if(have_posts()): ?>
<?php while(have_posts()): the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php else: ?>
<!-- 投稿データがない場合の処理 -->
<?php endif; ?>
Codexでのサンプル
Codexでのループサンプル。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
処理
<?php endwhile; else : ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>
PHPの制御構造を用いた場合
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
//
// 投稿がここに表示される
//
} // end while
} // end if
?>
singular.phpでの実際
テンプレート階層で、single.phpまたはpage.phpが存在しない場合に使用されるテンプレートファイル。
// have_posts() :投稿の有無をチェックする。投稿がる場合は真を返す。
// the_post(); :次の投稿を取得して、現在の投稿としてセットアップする。
// get_template_part :テンプレートパーツをテーマの中へ読み込む。
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
get_template_part( 'template-parts/content', get_post_type() );
}
}
?>
foreach
配列の要素を順に取り出して処理を行うときに使用します。
配列$arrの要素を変数$valueに格納しながら、配列の最後の要素まで繰り返し処理を行います。
<?php
foreach ($arr as $value){
処理
}
?>
連想配列$arrのキーを変数$keyに要素を変数$valueに格納しながら配列の最後の要素まで繰り返し処理を行います。
<?php
foreach ($arr as $key => $value) {
処理
}
?>
foreach使用例
// Loop through each of the template conditionals, and find the appropriate template file.
foreach ( $tag_templates as $tag => $template_getter ) {
if ( call_user_func( $tag ) ) {
$template = call_user_func( $template_getter );
}
if ( $template ) {
if ( 'is_attachment' === $tag ) {
remove_filter( 'the_content', 'prepend_attachment' );
}
break;
}
}
for
for (初期化式; 継続条件式; 条件更新) {
処理;
}
// 0~9までの数字を出力する。
<?php
for($i = 0; $i<10; $i++){
echo $i;
}
?>
配列
複数のデーター(要素)を個々に格納するために名前を付けた入れ物。
インデックス配列
下記は、syuuという配列に月~土の文字列を格納したイメージ。
0から順番に要素を格納した配列。それぞれの格納位置をインデックスという。
インデックスは0から数えるため$syuu[0]は文字 `日' なり、$syuu[6]は文字 '土' になる。
// 配列の作成
<?php
$syuu = [];
$syuu[0] = '日';
$syuu[1] = '月';
$syuu[2] = '火';
$syuu[0] = '水';
$syuu[1] = '木';
$syuu[2] = '金';
$syuu[2] = '土';
echo $syuu[2];
?>
// 実行結果は、火になる。
// 配列の作成
<?php
$syuu = array('日', '月', '火', '水','木', '金', '土');
echo $syuu[1];
?>
// 実行結果は、月になる。
連想配列
連想配列は、要素が入れてある位置にキーを付けて管理する。、
// 連想配列の作成~1
<?php
$syuu = [];
$syuu[sun] = '日';
$syuu[mon] = '月';
$syuu[tue] = '火';
$syuu[wed] = '水';
$syuu[thu] = '木';
$syuu[fry] = '金';
$syuu[sat] = '土';
echo $syuu['wed'];
?>
// 実行結果は、水になる。
// 連想配列の作成 ~2
<?php
$syuu = array(
'sun' => '日',
'mon' => '月',
'tue' => '火'
'wed' => '水',
'thu' => '木',
'fry' => '金'
'sat' => '土'
);
echo $syuu['wed'];
?>
// 実行結果は、水になる。
連想配列例
$tag_templates = array(
'is_embed' => 'get_embed_template',
'is_404' => 'get_404_template',
'is_search' => 'get_search_template',
'is_front_page' => 'get_front_page_template',
'is_home' => 'get_home_template',
'is_privacy_policy' => 'get_privacy_policy_template',
'is_post_type_archive' => 'get_post_type_archive_template',
'is_tax' => 'get_taxonomy_template',
'is_attachment' => 'get_attachment_template',
'is_single' => 'get_single_template',
'is_page' => 'get_page_template',
'is_singular' => 'get_singular_template',
'is_category' => 'get_category_template',
'is_tag' => 'get_tag_template',
'is_author' => 'get_author_template',
'is_date' => 'get_date_template',
'is_archive' => 'get_archive_template',
);
真偽判定条件
真と判定する場合
正の値 1 ~
負の値 ~ -1
倍角文字
文字列 true
条件が成立する場合
※ trueは、1と評価される。
// 下記を実行すると1が表示される。
<?php echo true ?>
偽と判定する場合
0
文字列 false
条件が成立しない場合
※ false は半角スペースと評価される。
// 下記を実行すると1 2 3が表示される。
<?php if(5-5): ?>
<?php echo true ?>
<?php else: ?>
<?php echo 1?>
<?php echo false ?>
<?php echo 2 ?>
<?php echo false ?>
<?php echo 3 ?>
<?php endif; ?>