[WordPress] 通常ページとAMPページで表示内容を切り替えるショートコード

通常ページとAMPページで表示する内容を切り替えるためのショートコードの実装方法です。

AMP対応広告の出し分けをするために作成しました。

通常広告はテキストリンクにしたけど、AMPはバナーしか対応しておらず、前後の説明テキストを含めて切り替える必要があったからです。

WordPressのfunctions.phpに記載して使用します。

AMPページの判別方法は「Simplicity2」および「Cocoon」というテーマに合わせて作成していますので、AMPの実装方法によっては、修正が必要になります。

【追記】
本ショートコード内にショートコードを設定した場合に展開できない問題があったので、展開できるように2箇所の追加・修正をしました。

スポンサーリンク

表示する内容を切り替えるショートコード


///////////////////////////////////////////////
//通常ページとAMPページの内容を出しわけるショートコード
///////////////////////////////////////////////

//AMPページ
function add_amp_page($str, $amp_str = null) {

    //文字列に含まれているショートコードを展開する ※追加箇所 1
    $amp_str = do_shortcode($amp_str);

    //ページがAMPページか判別する関数に渡して判別
    if(is_amp()){
        //AMPページならAMP用の文字列を返却
        return $amp_str;
    }
    //通常ページなら終了
    return;

}
//[add_amp]AMPページ用文字列[/add_amp]でショートコードを呼び出す
add_shortcode('add_amp', 'add_amp_page');

//通常ページ
function add_normal_page($str, $nml_str = null) {

    //文字列に含まれているショートコードを展開する ※追記箇所 2
    $nml_str = do_shortcode($nml_str);

    //ページがAMPページか判別する関数に渡して判別
    if(!is_amp()){
        //通常ページなら通常ページ用の文字列を返却
        return $nml_str;
    }
    //AMPページなら終了
    return;

}
//[add_nml]通常ページ用文字列[/add_nml]でショートコードを呼び出す
add_shortcode('add_nml', 'add_normal_page');

//AMP判別関数
//?amp=1パラメーターを使用(simplicity用)
function is_amp(){
  //AMPチェック
  $is_amp = false;
  if ( empty($_GET['amp']) ) {
    return false;
  }

  //ampのパラメーターが1かつ投稿ページの
  //かつsingleページのみ$is_ampをtrueにする
  if(is_single() &&
     $_GET['amp'] === '1'
    ){
    $is_amp = true;
  }
  return $is_amp;
}

// 指定したショートコード内のbrタグを空白に置換
function shortcode_br_delete($the_content) {

    // ショートコードのパターンを格納
    $shortcode_pattern = '/\[add_amp\].+?\[\/add_amp\]|\[add_nml\].+?\[\/add_nml\]/ims';
    
    // 指定したショートコード内のbrタグを空白に置換
    $the_content = preg_replace_callback($shortcode_pattern, 
        function($matches) {
            $str = preg_replace('/<br \/>/ims', '', $matches[0]);
            return $str;
        }
        , $the_content);
    return $the_content;

}

// wpautop実行後、ショートコード実行前にbrタグを削除する
add_filter('the_content', 'shortcode_br_delete',10);
スポンサーリンク

説明

通常ページだけに表示したい内容は、


[add_nml]通常ページ用文字列[/add_nml]

AMPページだけに表示したい内容は、


[add_amp]AMPページ用文字列[/add_amp]

のようにショートコードで囲むように投稿本文に記載して使用します。

「AMP判別関数」の判別方法が、「Simplicity2」および「Cocoon」というテーマに合わせて作成してありますので、AMPの実装方法によっては修正が必要になります。

「指定したショートコード内のbrタグを空白に置換」の関数は、ショートコード内に書かれた文字列に改行が含まれていると自動で挿入されてしまうbrタグを削除するためのものです。

広告タグの改変をなるべくしない為の処理となりますが、ショートコード内のすべての改行が削除されるので、必要ない場合はここだけ削除してください。

【追記】
追加箇所 1および 2の「文字列に含まれているショートコードを展開する」の部分で、処理対象の文字列としてショートコードが渡された場合にも、再帰的に展開します。