WordPress でサイドバーウイジェット内か判定する方法

WordPress で固定ページや投稿ページ等の判断で is_single(), is_page() 等を使っているのですが、サイドバーウイジェット内かどうか判定する関数が見つからなかったので作成してみました

そんな判断はあまり使われないのか検索してみたのですが見つけられず、それならスタックの履歴から何か判断できるのではないかと検索すると、PHPには、debug_backtrace() という関数があることがわかりこれを使って見ました。

なぜこの機能が欲しかったかというと、現在作成中のプラグイン post6widgetarea でループの最初と終わりにアクションフックしているのですが、トップページ等で投稿記事を表示しない場合等にループ処理がない場合のページがあります。

この場合でも通常は、アクションフックしないだけなので特に問題もないのですが、トップページにサイドバーウイジェットがありそこで何か記事を表示するようなプラグインを導入している場合に問題が起きる場合があります。

プラグインがウイジェット内で記事を処理するためにループ処理を使用している場合があります。この時にループにアクションフックしてしまい意図しない所で実行される可能性があります

作成したPHPコードは、ここに貼り付けておきます
特に説明することもないのですが、トレースデータを取得して、そのスタックトレースのデータ内にある呼び出し関数名に “dynamic_sidebar” があるかチェックしているだけです。いろいろと応用できそうな気もしますので、必要な方がいれば適当に修正して使って下さい

function in_dynamic_sidebar()
{
    $in_flag = false;
    $trace = debug_backtrace();
    foreach ($trace as $stp) {
        if(isset($stp['function'])){
            if($stp['function'] === "dynamic_sidebar"){
                $in_flag = true;
                break;
            }
        }
    }
    return $in_flag;
}

PHPに関しては、まだ初心者ですので、これは良くないやり方だよというご意見があるかも知れません。動作優先ということでデバッグ用の関数ですが使用しました。

他にもっと良い方法を知っていると言う方がいらしたらぜひご教授下さい m(__)m


まとめ記事紹介

go-to-top