Intereting Posts
Как скопировать существующий (настраиваемый тематический) сайт в новый домен Как перечислить сообщение как buch категории, и все из них Шаблон одиночного сообщения в полноэкранном режиме, не наследующий разрешение роли Редактор WordPress на самообслуживаемом блоге не отображает опубликованный текст публикации Преобразование настраиваемых полей для публикации категорий WordPress не выводит класс «post» при вызове функции post_class () редактировать сообщения через интерфейс WP CRON на общедоступном хостинге, который не позволяет соединения с обратной связью? Установка WP на localhost Что лучше всего передать переменные в шаблоны тем и использовать их в разных местах, например, в виде виджетов? Показать сообщения в Google Map Поиск страницы входа из базы данных? dirname (__FILE__), возвращающий неправильный каталог внутри плагина Wrap Количество сообщений в диапазоне Выберите Все, не работающие в поисковом фильтре WordPress.

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

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

Он делает это путем подключения к 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; 

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