【PHP・wordpress】AMP対応時にオブジェクトバッファリングを使ってウィジェットタイトルを削除する方法

私が通常のページをAMP対応する時に、ウィジェットのタイトルを削除した方法について説明します。

ウィジェットのタイトルを削除したいのなら、cssのdisplay:none;で削除しようと思ったのですが、AMPページでdisplay:none;を記述すると「無効なAMPページ」とされてしまうみたいです。その為オブジェクトバッファリング(ob)で削除することにしました。

①AMPHTML仕様ページ

AMP HTML Specification
AMP HTML is a subset of HTML for authoring content pages such as news articles in a way that guarantees certain baseline performance characteristics.

②AMP テストページ

AMP テスト - Google Search Console

 

 

ソースコード

<section class="widget">
    <?php dynamic_sidebar( 'test_widget' ); //ウィジェット読み込み?>
</section>

通常は上記のようにdynamic_sidebar単体でウィジェットを表示させると思いますが、これだけだと表示した際にウィジェットのタイトルが表示されてしまいます。今回はこのウィジェットタイトルが表示されてほしくないので、下記のソースコードに変更しタイトルを削除しました。

 

 

<section class="widget">
    <?php ob_start(); // 記録開始 ?>
    <?php dynamic_sidebar( 'test_widget' ); ?>
    <?php ob_get_flush();//記録をフラッシュ(送信)して出力バッファリングを終了 ?>
    <?php $test_widget = ob_get_clean();//取得して記録元を破棄 ?>
        
    <?php
     //タイトルを削除して、widgetを表示
        $title_delete_widget = preg_replace('/<h2 class="widgettitle">.+?<\/h2>/m','',$test_widget);
        echo $title_delete_widget;
    ?>
</section>

赤文字の部分でオブジェクトバッファリング(以下ob)を活用しています。obとは何かよく分からない方もおられると思いますが、イメージとしてはob_start以降がメモリに保存されるようになり、ob_get_flushなどで出力バッファリングを終了することでメモリへの保存を終了。そしてそのメモリに保存した内容を文字列に変換という動作を今回はしています。

要するにobとは内部バッファ(メモリ)みたいなものだと思っていいと思います。オブジェクトバッファリングについて詳しく知りたい方は下記リンクをご覧下さい。

ob_start:https://www.php.net/manual/ja/function.ob-start.php

 

 

その後青文字の部分でpreg_replaceを使ってタイトルを削除し、echoでタイトル削除したウィジェットを表示させました。ちなみに今回タイトル削除する為の正規表現を右のようにしていますが、もしかすると「使用する文字列」や「wordpress」のアップデートでclass名が変わるなどでこの正規表現では不可能となるかもしれないので、個人で確認よろしくお願い致します。‘/<h2 class=”widgettitle”>.+?<\/h2>/m’

 

 

まとめると今回やっているのはこうです。

<section class="widget">
    メモリに保存開始
    ----この部分にある処理がメモリに保存される----
    メモリに保存終了

    <?php
     メモリに保存したウィジェットのタイトル削除
     タイトル削除したウィジェット表示
    ?>
</section>

※今回ob_get_flush()と、ob_get_clean()を使用していますがob_get_flush()のみで今回の動作が可能だと思ったのですが、ob_get_flush()のみだと何故か「記録元のウィジェット(dynamic_sidebar)」と「メモリに保存したウィジェット」がどちらとも出力されウィジェットが2つ表示されているという変な表示になったので、ob_get_clean()で1つを削除しました。これが正しいやり方かどうかは分かりません。

 

 

まとめ

オブジェクトバッファリングを使用してwidgetタイトルを削除するやり方について説明しました。私のとても優秀な上司の方が「オブジェクトバッファリングは困った時に色々使える」とおっしゃっていたので覚えると便利だと思います。なかなか使う場面は少ないと思いますが、今回のような事があった時に便利だと思いますのでぜひ活用ください。

 

最終学歴高卒。実務未経験から自社開発&受託開発をしている企業に入社した、入社1年目のエンジニア。20代前半。
WordPress・PHP / Laravel・JavaScript

ひろきをフォローする

コメント

タイトルとURLをコピーしました