2023年10月1日から始まった「ステマ規制」。

規制開始後だけでなく、以前に公開されたページについても対応が必要になることから、ステマ規制対応に悩んだ方もいるのではないでしょうか。

本記事では、今後、よりきめ細かな表示の対応が必要になったときなどに参考になるようなカスタマイズを投稿タイトルに「【PR】」を付ける、投稿本文の先頭に「本記事にはプロモーションが含まれています」というテキストを追加するという例をもとに紹介します。

「ステマ規制」とは

2023年(令和5年)10月1日からステルスマーケティングが景品表示法違反となり、ステマ(ステルスマーケティング)に対する規制が始まりました。

これを「ステマ規制」と呼び、企業から商品提供や依頼を受けてレビュー記事を作成していたサイトや、アフィリエイトサイトなどでも本文の前に「プロモーションを含みます」のような表示を追加したり、ページの上部に「PR」や「広告」という文言を表示させたりするなど、ステマ規制の対応が必要になっています。

対象になるのは規制が始まってから公開されたページだけでなく、過去に公開したページも対象になるため、アフィリエイトサイトを作成している運営者などは対応に頭を悩ませた方も多いのではないかと思います。

ステマ規制に関連する参考ページはこちら(消費者庁Webサイト)

WordPress サイトでステマ規制対応のためのカスタマイズ方法を考える

本記事では、わたしが自身の WordPress サイトで対応したり相談を受けて対応した中から比較的シンプルに対応できるカスタマイズ方法について紹介します。

配布・販売されているテーマの中にはステマ規制に関連する機能が実装されているものもありますが、自作のテーマ・ステマ規制対応機能のないテーマ・テーマに実装されている機能より複雑な制御をしたい場合は自分でカスタマイズする必要があります。

そのため、今回はなるべく特定のテーマに依存しない方法でカスタマイズをしてみます。

また、本記事ではステマ規制対応として「どのような文言を表示すべきか」という点については扱わず、「どのようなやり方があるか」といった WordPress サイトのカスタマイズ方法についてを紹介しています。

フィルターフックについての簡単な説明

まず、「特定のテーマに依存しない」という方針・縛りのような中でカスタマイズを進めるために WordPress の「フィルターフック」という仕組みを利用します。

フィルターフックを使うことで、テーマのテンプレートを編集せずに、ある関数の結果に対して加工をして出力できます。

ただ、フィルターフックが定義されている必要があるため、フィルターフックを使ったカスタマイズする場合、まずは自分の望む場所にフィルターが用意されているか、フィルターで受け取れる値・返却する値でカスタマイズができるかを調べる必要があります。

この後に登場するサンプルコードでは add_filter という関数がフィルターフックを使う上でポイントになる関数です。

▼例

// 「the_content」フックで「my_blog_the_content」を実行して値を加工する
add_filter( 'the_content', 'my_blog_the_content' );

// フックのタイミングで実行する関数
// 引数はフックの種類によって変わるが、以降の処理で使われる予定の値は必ず一番目の引数に入っている

function my_blog_the_content( $content ) {
    // 何か処理をする
    return $content;
}

フィルターフックを含むフックについての参考ページはこちら

本記事で動作を確認しているWordPressバージョンとテーマ

WordPress バージョン:6.3.2

使用テーマ:Twenty Twenty-One、Twenty Twenty-Three

PHPバージョン:8.2.12

本文の先頭に「本記事にはプロモーションが含まれています。」を追加するカスタマイズ

まず、クラシックテーマの「Twenty Twenty-One」を使ってカスタマイズをしていきます。

ハイブリッドテーマについても、同様のカスタマイズになります。

※クラシックテーマ・ハイブリッドテーマは single.php などの PHP ファイルによって作成されたテンプレートファイルで構成されたテーマです。本記事執筆時点ではブログ向けテーマなどで多く採用されている方式です。

本文の先頭に文章追加

まず、シンプルに本文の先頭に「本記事にはプロモーションが含まれています。」を追加してみます。

投稿本文に対して何かの処理をしたい場合は「the_content」を使用します。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    $html = '<p>本記事にはプロモーションが含まれています。</p>';
    return $html . $content;
}

▼編集画面(左)とページ表示(右)を並べた図

※画像では「本記事にはプロモーションが含まれています。」部分を見やすくするために、スタイルの調整をしています。

編集画面で入力していない「本記事にはプロモーションが含まれています。」が追加できました。

画像には1記事しか写っていませんが、サイト内の全記事の先頭に同じテキストが追加されています。

ただし、このカスタマイズだけでは、一覧ページや詳細ページ以外でも本文の先頭にテキストが追加される問題があるため、条件を追加していきます。

▼投稿一覧ページにも「本記事にはプロモーションが含まれています。」が表示されてしまった図

投稿詳細ページのみで表示する条件分岐を追加

投稿一覧ページで各投稿の先頭に「本記事にはプロモーションが含まれています。」と表示する必要はありません。したがって、テキストの追加は投稿詳細ページのみに限定します。

「is_single()」関数を使用して、投稿詳細ページのみに絞り込みます。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    if ( is_single() ) {
        return '<p>本記事にはプロモーションが含まれています。</p>' . $content;
    }
    return $content;
}

▼投稿一覧(左)と詳細ページ(右)を並べた図

投稿一覧ページからは表示が消え、詳細ページにのみ表示されるようになりました。

これで問題ないと思ったら、フッターに表示している投稿一覧の本文にもテキストが表示されてしまいました。

▼フッターの投稿一覧ウィジェットにテキストが追加されてしまった図

投稿詳細のメインコンテンツのみで表示

投稿詳細ページの本文以外の部分にテキストを追加する必要はありませんので、さらに条件を絞ります。

「in_the_loop()」関数を使用して、メインループ内のコンテンツだけに絞り込みます。

WordPressの「メインループ」とは、開いたページに表示すべき投稿データを処理している部分を指します。

フッターなどに表示している投稿一覧は本来このページに表示するべき投稿データとは別に取得をしているため、メインループの外側での処理となり、in_the_loop()で判定できます。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    if ( is_single() && in_the_loop() ) {
        return '<p>本記事にはプロモーションが含まれています。</p>' . $content;
    }
    return $content;
}

▼本文先頭にはテキストが追加され(左)、フッターの投稿一覧(右)にはテキストが表示されなくなった図

これで投稿本文の上部にのみテキストが表示されるようになりました。

特定のタグがついた記事だけ表示

ここからは、投稿本文の上部のみテキストを追加する条件に加え、サイトを運用する上で便利そうなカスタマイズをいくつか紹介します。

まず、「特定のタグ」がついた記事のみを表示する方法について説明します。

サイト内には、プロモーション内容が含まれている記事と、含まれていない記事が混在している場合、タグの有無で表示を切り替える方法が有効です。

投稿に特定のタグがついているかどうかは「has_tag」関数を使用して判定できます。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    if ( is_single() && in_the_loop() ) {
        // 「pr」タグがついているときだけ表示する
        if ( has_tag( 'pr' ) ) {
            return '<p>本記事にはプロモーションが含まれています。</p>' . $content;
        }
    }
    return $content;
}

上の例では「pr」というスラッグのタグが設定されていたら「本記事にはプロモーションが含まれています。」を表示する例です。

また、タグごとに表示する文言を変えるのもいいかもしれません。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    $html = '';
    if ( is_single() && in_the_loop() ) {
        // 「pr」タグがついているときだけ表示する
        if ( has_tag( 'pr' ) ) {
            $html = '<p>本記事にはプロモーションが含まれています。</p>';
        }
        // 「ad」タグがついているときだけ表示する
        if ( has_tag( 'ad' ) ) {
            $html = '<p>本記事は商品の提供を受けて執筆しています。</p>';
        }
        // 上記ではprとadの両方のタグがついていた場合、adがついていた場合のテキストが表示される
        // 複数タグついていた場合にすべてのテキストを結合していくのか、
        // 運用ルールで複数付けないようにするのかなど検討が必要
    }
    return $html . $content;
}

特定のカテゴリーがついた記事だけ表示

タグと同様に、特定のカテゴリーが付いている記事だけを表示する方法についても紹介します。

特定のカテゴリーがついているかは「has_category」関数を使用して判定できます。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    if ( is_single() && in_the_loop() ) {
        // 「review」カテゴリーがついているときだけ表示する
        if ( has_category( 'review' ) ) {
            return '<p>本記事にはプロモーションが含まれています。</p>' . $content;
        }
    }
    return $content;
}

本文内に特定のURLがある場合のみ表示

アフィリエイトリンクのURLが含まれている場合や、本文内に特定のワードが存在する場合に、表示を制御したり文言を変更するカスタマイズ方法です。

add_filter( 'the_content', 'my_blog_the_content' );
function my_blog_the_content( $content ) {
    if ( is_single() && in_the_loop() ) {
        // 本文内に「example.com」があれば表示する
        if ( false !== strpos( $content, 'example.com' ) ) {
            return '<p>本記事にはプロモーションが含まれています。</p>' . $content;
        }
    }
    return $content;
}

上記の例より複雑な条件での判定が必要な場合、正規表現を利用すると良いでしょう。

タイトルに「【PR】」を追加するカスタマイズ

次に、記事のタイトルに「【PR】」を追加する方法を試してみます。

投稿本文にテキストを追加する方法と条件分岐の方法はほぼ同じになるので、タイトルのカスタマイズのために使うフックの紹介と、本文のカスタマイズでは発生しなかった問題の対処法を紹介します。

投稿タイトルに「【PR】」を追加

投稿タイトルを加工するためには「the_title」フックを使います。

add_filter( 'the_title', 'my_blog_the_title' );
function my_blog_the_title( $title ) {
    if ( is_single() && in_the_loop() ) {
        return '【PR】' . $title;
    }
    return $title;
}

投稿詳細ページのみ・フッターやサイドバーなどでは「【PR】」が追加されないような絞り込みをしています。

ただ、投稿タイトルは投稿本文に比べて使用される場面が多いため、細かな調整が必要かもしれません。

▼フッターの投稿一覧には「【PR】」はないが、「次の投稿」部分には表示されている

たとえば、上の画像の例では、フッターの投稿一覧には「【PR】」は表示されていませんが、「次の投稿」部分には表示されています。

テーマによってはメインループ内に複数の投稿タイトル表示部分があるため、「in_the_loop」だけでは表示を制御できない場合もあります。

今回の例では、「【PR】」を表示するのは投稿本文の上にあるタイトル部分のみなので、did_filter という関数を使って、投稿本文の出力前であれば「【PR】」を追加するようにカスタマイズしてみます。

add_filter( 'the_title', 'my_blog_the_title' );
function my_blog_the_title( $title ) {
     if ( is_single() && in_the_loop() ) {
        // the_contentの実行前であればPRを追加
        if ( ! did_filter( 'the_content' ) ) {
            return '【PR】' . $title;
        }
    }
    return $title;
}

しかし、この方法でも投稿タイトルとページ本文の間で「the_title」フックが実行される関数を使用している場合、「【PR】」が追加されてしまいます。

なるべくテーマに依存しないようなカスタマイズ方法を紹介しましたが、どうしてもテーマの仕様に影響される部分もあります。

そのような場合、テーマのテンプレートを編集するのか、表示・非表示の切り替えに適した条件を探すのかは、カスタマイズにかかる時間や方針と相談して対応していきましょう。

WordPressのさまざまな条件分岐の関数などについてはこちらが参考になります

ブロックテーマでは別の対応方法が必要

ここまでは、クラシックテーマ・ハイブリッドテーマでのカスタマイズ方法でした。

しかし、ブロックテーマでは同じ方法でカスタマイズができない場合もあり、他の対応方法が必要になります。

ブロックテーマとクラシックテーマで結果が違う関数

メインループ内かどうかを判定する in_the_loop という関数については、ブロックテーマとクラシックテーマ・ハイブリッドテーマで結果が違います。

例として、「head」に各種 HTML タグを出力するために使われる「wp_head」フック時点での in_the_loop の結果を確認してみます。

add_action( 'wp_head', function () {
    var_dump( in_the_loop() );

    // クラシックテーマ・ハイブリッドテーマ→false(メインループ外の判定)
    // ブロックテーマ→true(メインループ内の判定)
} );

このため、サンプルコードで紹介していた「 if ( is_single() && in_the_loop() ) 」という記述は期待通りの動作をしなくなります。

今後の WordPress 本体のバージョンアップによって改善されるかもしれませんが、ブロックテーマでは従来の方法だけではカスタマイズできない場合があるということを知っておくと、1つの方法にこだわらず、他の方法に移りやすくなります。

PR記事用ブロックテンプレートを作成する方法

ブロックテーマでの対応方法の例として、PR記事用のテンプレートを作成してみます。

ブロックテーマでは、管理画面から「外観」→「エディター」を選び、各ページのテンプレートの編集や新規追加ができます。

「テンプレート」を開き、「テンプレート」というメニュータイトル右側の「+」をクリックします。

「テンプレートを追加」のポップアップから「カスタムテンプレート」をクリックします。

テンプレート名を入力する欄が表示されるので、わかりやすい名前を付けてテンプレートを作成します。

テンプレートが作成できたら、既存の投稿詳細用テンプレートからすべてのブロックをコピーするなどして、投稿テンプレートのベースを作り、カスタマイズしていきます。

ブロックの編集で「【PR】」や「本記事にはプロモーションが含まれています。」を段落ブロックでテンプレートに追加しました。

ステマ規制対応が必要なページの「テンプレート」から作成したテンプレートを選択します。

この方法では編集画面から各ページのテンプレートを変えなければならないというデメリットがありますが、プログラム的な対応が必要なく、編集画面のみで操作が完結する点はうれしいポイントです。

フィルターフックで対応する方法

ブロックテーマでもフィルターフックで対応することは可能です。

ただ、the_title や the_content フックは投稿本文以外にも影響する可能性が高くなってしまうため、ブロックに対してのフックを使用します。

「render_block_{ブロック名}」というフックを使えば、特定のブロックに対してフックすることができます。

「タイトル」ブロック(投稿のタイトル)と「投稿コンテンツ」ブロック(投稿本文)部分の表示をカスタマイズします。

// 投稿タイトル
add_filter( 'render_block_core/post-title', 'add_pr_post_title' );
function add_pr_post_title( $content ) {
    if ( is_single() ) {
        return "【PR】{$content}";
    }
    return $content;
}

// 投稿本文
add_filter( 'render_block_core/post-content', 'add_pr_post_content' );
function add_pr_post_content( $content ) {
    if ( is_single() ) {
        return "<p>本記事にはプロモーションが含まれています。</p>{$content}";
    }
    return $content;
}

注意点として、「render_block_{ブロック名}」のフックはブロックが生成したHTMLに対して処理をおこなうため、上記の例では見出しタグの外側に「【PR】」が挿入されることになります。

そのため、追加したテキストがタイトル表示から離れてしまったり、他コンテンツと表示位置が合わなくなる場合があります。

その場合は、下記例のように外側にHTMLを追加してCSSでレイアウトを調整したり、正規表現置換でブロックが出力するHTMLの内側にテキストを追加したりして調整していくことになります。

// 前後省略
return "<div>【PR】{$content}</div>";

ステマ規制へのより細かな対応が必要な場合の参考にしてください

投稿タイトルや投稿本文のカスタマイズの方法、「〜の場合は」という条件分岐で使用できそうなものを紹介しました。

今後、ステマ規制対応について「こういう書き方をした方がいい」「この書き方ではわかりづらい」といったことが出てくるかもしれません。

ユーザーがより理解しやすく、混乱しない表示が必要になった場合に紹介した方法が何かの参考になれば幸いです。

(文:よしあかつき

presented by paiza

Share