web-dev-qa-db-ja.com

サイドバー/ウィジェットのコンテキストでフィルタが呼び出されているかどうかを判断する方法

そのため、私はページ/投稿/カスタム投稿タイプのコンテンツに強化された著者の略歴を追加または追加するプラグインを持っています。

これはthe_contentまたはthe_excerptのいずれかにフックし、プラグインの設定に従ってコンテンツを追加/追加することで行います。

作者の略歴がサイトのサイドバーにウィジェットを介して、例えば Category Posts ウィジェットを介して表示されている場合、私はサポートの問い合わせを受け始めました。ウィジェットはカスタムクエリループ内でthe_excerpt()を使用して、設定されたカテゴリに従って投稿を引き出し、サイドバーのコンテキスト内で投稿の抜粋を表示します。

この直接的な効果として、私のプラグインのthe_excerptフィルタフックが呼ばれています。私がやりたいのは、自分のフィルタフックがサイドバーまたはウィジェットのコンテキスト内で呼び出されているかどうかを検出し、自分のプラグインのコンテンツをフィルタフックに渡された投稿コンテンツに追加するかどうかを条件付きで決定できることです。疑似コードは次のようになります。

add_filter ('the_excerpt', array ($this, 'insert_biography_box'));
function insert_biography_box ($content) {
    if (in_sidebar ()) {
        return $content;
    }

    // do code stuff to append/prepend biography content
    return $content;
}

...しかし、WordPressのコアソース、フォーラム、そしてここを検索してみると、is_sidebaris_widget(あるいは他の名前のバリエーション)に沿った関数のようには見えません。

フィルタフック関数がサイドバーのコンテキスト内で呼び出されているのか、ウィジェット内で呼び出されているのかを判断することさえ可能ですか?

EDITis_main_queryを使うという@ toschoの提案に基づいて、私はthe_contentthe_excerptのために私のフィルタフックをこのように修正しました...

add_filter ('the_excerpt', array ($this, 'insert_biography_box'));
add_filter ('the_content', array ($this, 'insert_biography_box'));

function insert_biography_box ($content) {
    error_log ('insert_biography_box: current filter=' . current_filter ());
    if (!is_main_query ()) {
        error_log ('Not main query, baling');
        return $content;
    }

    // do code stuff to append/prepend biography content
    $biography = 'some-magic-function-return-value';
    return $content . $biography;
}

これに基づいて、カテゴリ投稿ウィジェットがサイドバーのコンテキストでthe_excerpt()を呼び出しているときに、私のPHPエラーログにメッセージNot main query, balingが表示されることを期待していました。しかし私は違います。

コンテキストでは、Category Postsウィジェットはこのようにウィジェットのwidgetメソッド内で投稿を問い合わせています(明確にするために厳密に言い換えます)。

$cat_posts = new WP_Query (...);
while ($cat_posts->have_posts ()) {
    $cat_posts->the_post ();
    the_excerpt ();
}

...何かが足りないのでしょうか(おそらく)、is_main_query()を使用しているコンテキストが得られないのでしょうか?

4
Gary Gale

WordPress hacks forum の並列スレッドで、誰かがin_the_loop()を使用することを提案しましたが、the_contentまたはthe_excerpt、しかし、私がテストしてきたすべてのプラグインで常にではありません。

同様に、is_main_query()を使用してさらにテストを行いましたが、一部のプラグインでは機能しますが、すべてではありません。

しかし、is_main_query()およびin_the_loop()に対するテストの魔法の組み合わせは、トリックを行うようです。

したがって、(擬似)コードは次のようになります...

add_filter ('the_excerpt', array ($this, 'insert_biography_box'));
add_filter ('the_content', array ($this, 'insert_biography_box'));

function insert_biography_box ($content) {
    if (!in_the_loop () || !is_main_query ()) {
        return $content;
    }

    // do code stuff to append/prepend biography content
    $biography = 'some-magic-function-return-value';
    return $content . $biography;
}

..サイドバーやフッターウィジェットのコンテンツフィルターまたは抜粋フィルターを使用する多くのプラグインに対して、必要な動作を正確に提供します。

6
Gary Gale

サイドバーを要求せず、 メインクエリを要求します

if ( is_main_query() )
    return;

その理由は、抜粋やメインコンテンツを他の場所でも取得する可能性があるため、それぞれの場合に新しい条件を作成したくないということです。

2
fuxia