Как определить, вызван ли фильтр в контексте боковой панели / виджета?

Поэтому у меня есть плагин, который добавляет или добавляет расширенную биографию автора к контенту типа страницы / сообщения / пользовательского сообщения.

Он делает это путем подключения к the_content или the_excerpt и добавлению / добавлению в соответствии с конфигурацией плагина.

Я начал получать запросы поддержки, где биография автора появляется на боковой панели сайта через виджет, например, через виджет категории Сообщений . Виджет использует the_excerpt() в пользовательском запросе Loop, чтобы вытащить сообщения в соответствии с настроенной категорией и отобразить выдержку post в контексте боковой панели.

Как прямой эффект от этого, the_excerpt мой 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_sidebar или is_widget (или некоторые другие варианты имени).

Можно ли даже определить, вызывается ли функция крючка фильтра в контексте боковой панели или внутри виджета?

EDIT : на основе предложения @ toscho использовать is_main_query , я изменил свой фильтр-крючок для the_content и the_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; } 

Основываясь на этом, я ожидал увидеть сообщение « Not main query, baling в который был the_excerpt() в моем журнале ошибок PHP, когда виджет категории «Сообщений» вызывает the_excerpt() в контексте боковой панели. Но я этого не делаю.

Для контекста виджет категории Сообщений запрашивает сообщения в виде виджета widget как это (строго перефразируемый для ясности) …

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

Я потерял что-то (очень вероятно), или я просто не получаю контекст, в котором я использую is_main_query() (как бы очень вероятно) …?

Solutions Collecting From Web of "Как определить, вызван ли фильтр в контексте боковой панели / виджета?"

В параллельном потоке на форуме для взлома WordPress кто-то предложил использовать 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; } 

.. который теперь дает мне именно то, что я хотел, против такого количества плагинов, которые используют фильтры содержимого или выдержки в виджетах боковой панели и / или нижнего колонтитула.

Не запрашивайте боковые панели, задайте основной запрос :

 if ( is_main_query() ) return; 

Причина: выдержка или основной контент могут быть извлечены и в других местах, и вы действительно не хотите создавать новое условие для каждого случая.