
【ワードプレス】single.phpで、カテゴリーやターム毎に、別の広告を表示したい
この記事内で紹介する商品等のリンクには、アフィリエイトシステムが使用されています。記事内のリンクを経由して商品が購入されることで、僕に収益が入ることがあります。
ただし、メーカーから商品を提供されたり、報酬を得て記事を書くことはありません。実際に使用した商品を公平な立場でレビューしております。詳しくは、「このサイトのこと」をお読みください。
今日はすごい風でしたね。外出したついでに、近くの公園で写真でも…と思いました、強風で花や木がグワングワン揺れていたので、カメラを出すことを断念いたしました。
さて、今日もお仕事関連。というか、そのうちこのブログは、WEB技術関連の記事で埋め尽くされるのではないかと危惧しております。まぁ、でもある意味、これが本当の僕の日常であり、「日々」なので、仕方ないかな…
今回は、WORDPRESS(ワードプレス)のテンプレートPHPの編集についての小ネタ。(というか、ただの備忘録です。)毎度ながらの注意ですが、当方JSやPHPは初心者ですので、あくまで参考程度にご覧ください。動作の保証はできません。間違っていることもあります。
個別投稿ページの広告を、カテゴリーやターム毎に変更したい
今回やりたかったことは、ワードプレスの個別投稿ページ(single.php)に表示させる広告を、カテゴリーやタームを判別して変更したい、ということです。広告に限らず、表示を変更したい場合にも、役立つと思います。ちなみにこれから説明する方法は、ワードプレスのテンプレートPHPファイルを、直接編集する手順です。自己責任でお願いします。
個別投稿ページ(single.php)の全体の構造はこんな感じ
今回編集したsingle.phpのざっくりとした構成は、こんな感じです。
<?php get_header(); ?>
<article>
<?php while (have_posts()) : the_post(); ?>
<!-- 記事のタイトル -->
<h2><?php the_title(); ?></h2>
<!-- 日付 -->
<time><?php the_time('Y.n.j');?></time>
<!-- 記事の本文 -->
<p><?php the_content(); ?></p>
<?php endwhile; ?>
</article>
<!-- ページナビ -->
<p class="nav_prev"><?php previous_post_link('%link'); ?></p>
<p class="nav_next"><?php next_post_link('%link'); ?></p>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
分岐した後は、get_template_partで個別のパーツを読み込む
分岐の方法の前に、分岐した後の処理について。直接、ifの分岐の間に記述してもいいと思いますが、僕的には個別のphpファイルのパーツを読み込む方が、管理しやすいなぁと思いまして。
例えば、「パソコン」というカテゴリーの記事の場合はパソコン関連の広告を、「カメラ」カテゴリーの記事の場合はカメラ関連の広告を表示させたいなぁと思う場合、それぞれの広告タグを「single-slag_pc.php」「single-slag_camera.php」などのPHPファイルに書いておけば、書き換えたい時にすぐに書き換えて、そのファイルだけアップロードして更新すればいいかなと。
パーツを読み込むときなんですが、お恥ずかしながら今まで、include();
を使っていたんですよね。そしたら、こちらワードプレスの現在のバージョンでは非推奨とのこと。w
include('sample.php');
今はget_template_part();
を使うそうです。確かに、そう言えば。w
get_template_part('sample');
ということで任意のファイル名で、空のphpファイルを作り、そこにそれぞれ個別に表示したい広告(内容)を書き込んでおきます。
デフォルトの投稿ページの、カテゴリー情報を取得して、分岐させて表示を変える場合
通常の投稿ページのsingle.phpの場合は、カテゴリーを取得することになると思います。こんな感じ。
<?php
// カテゴリースラッグがsample01だったら、single-slag_sample01.phpというテンプレートを表示
if (in_category('sample01')) {
get_template_part('single-slag_sample01');
}
// カテゴリースラッグがsample02だったら、single-slag_sample02.phpというテンプレートを表示
else if (in_category('sample02')) {
get_template_part('single-slag_sample02');
}
// それ以外のカテゴリースラッグだったら、single-common.phpというテンプレートを表示
else {
get_template_part('single-common');
}
?>
カテゴリーの判別は、以下で行えます。
in_category('カテゴリースラッグ or 名前 or ID')
上のサンプルは、カテゴリースラッグが、sample01か、sample02か、それ以外かという感じの分岐ですが、増やしたければ、sample02の次に、「else if」を増やしていけばOKです。
できあがったコードはこんな感じ!
<?php get_header(); ?>
<article>
<?php while (have_posts()) : the_post(); ?>
<!-- 記事のタイトル -->
<h2><?php the_title(); ?></h2>
<!-- 日付 -->
<time><?php the_time('Y.n.j');?></time>
<!-- 記事の本文 -->
<p><?php the_content(); ?></p>
<?php endwhile; ?>
</article>
<!-- ページナビ -->
<p class="nav_prev"><?php previous_post_link('%link'); ?></p>
<p class="nav_next"><?php next_post_link('%link'); ?></p>
<!-- ここから切り替える広告部分 -->
<?php
// カテゴリースラッグがsample01だったら、single-slag_sample01.phpというテンプレートを表示
if (in_category('sample01')) {
get_template_part('single-slag_sample01');
}
// カテゴリースラッグがsample02だったら、single-slag_sample02.phpというテンプレートを表示
else if (in_category('sample02')) {
get_template_part('single-slag_sample02');
}
// それ以外のカテゴリースラッグだったら、single-common.phpというテンプレートを表示
else {
get_template_part('single-common');
}
?>
<!-- 切り替える広告部分 ここまで -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
カスタム投稿タイプの、ターム情報を取得して、分岐させて表示を変える場合
一方、カスタム投稿タイプで追加した個別投稿ページ(single-タクソノミー名.php)の場合は、カテゴリーは使えないので、タクソノミーのタームを取得することになると思います。こんな感じ。
<?php
// タームがterm01だったら、single-tax_sample01.phpというテンプレートを表示
if (is_object_in_term( $post->ID, 'タクソノミー名を入れます', 'term01')) {
get_template_part('single-tax_sample01');
}
// タームがterm02だったら、single-tax_sample02.phpというテンプレートを表示
else if (is_object_in_term( $post->ID, 'タクソノミー名を入れます', 'term02')) {
get_template_part('single-tax_sample02');
}
// それ以外のタームだったら、single-tax_common.phpというテンプレートを表示
else {
get_template_part('single-tax_common');
}
?>
タームの判別は、以下で行えるそうです。
is_object_in_term( $post->ID, 'タクソノミー名を入れます', 'ターム名を入れます')
以下のサイトを参考にさせていただきました。知らなかった…。ありがとうございます。
https://www.communitycom.jp/2012/05/27/is_object_in_term/
カテゴリーでの分岐の場合同様、term01か、term02か、それ以外かという感じの分岐ですが、増やしたければ、term02の次に、「else if」を増やしていけばOKです。
できあがったコードはこんな感じ!
<?php get_header(); ?>
<article>
<?php while (have_posts()) : the_post(); ?>
<!-- 記事のタイトル -->
<h2><?php the_title(); ?></h2>
<!-- 日付 -->
<time><?php the_time('Y.n.j');?></time>
<!-- 記事の本文 -->
<p><?php the_content(); ?></p>
<?php endwhile; ?>
</article>
<!-- ページナビ -->
<p class="nav_prev"><?php previous_post_link('%link'); ?></p>
<p class="nav_next"><?php next_post_link('%link'); ?></p>
<!-- ここから切り替える広告部分 -->
<?php
// タームがterm01だったら、single-tax_sample01.phpというテンプレートを表示
if (is_object_in_term( $post->ID, 'タクソノミー名を入れます', 'term01')) {
get_template_part('single-tax_sample01');
}
// タームがterm02だったら、single-tax_sample02.phpというテンプレートを表示
else if (is_object_in_term( $post->ID, 'タクソノミー名を入れます', 'term02')) {
get_template_part('single-tax_sample02');
}
// それ以外のタームだったら、single-tax_common.phpというテンプレートを表示
else {
get_template_part('single-tax_common');
}
?>
<!-- 切り替える広告部分 ここまで -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
カテゴリーの取得のin_category
は、今までも使っていたのですが、タームの判別をするis_object_in_term
は知らなかったです。便利ですね。今まではget_the_terms
で取得していたのですが、こちらの方がスマートです。