it-swarm.com.de

Wie ermittle ich, ob ein Filter in einer Seitenleiste oder in einem Widget-Kontext aufgerufen wird?

Ich habe also ein Plugin, das eine erweiterte Autorenbiografie an den Inhalt eines Seiten-/Post-/benutzerdefinierten Post-Typs anfügt oder ihm voranstellt.

Dies geschieht durch Verknüpfen mit the_content oder the_excerpt und Anhängen/Voranstellen von Inhalten entsprechend der Konfiguration des Plugins.

Ich habe angefangen, Supportanfragen zu erhalten, bei denen die Autorenbiografie in der Seitenleiste einer Website über ein Widget angezeigt wird, z. B. über das Widget Kategorie-Posts . Das Widget verwendet the_excerpt() in einer benutzerdefinierten Abfrageschleife, um Beiträge gemäß einer konfigurierten Kategorie abzurufen und den Beitragsauszug im Kontext der Seitenleiste anzuzeigen.

Als direkte Auswirkung wird der the_excerpt-Filter-Hook meines Plugins aufgerufen. Was ich tun möchte, ist zu erkennen, ob mein Filter-Hook im Kontext der Seitenleiste oder eines Widgets aufgerufen wird, und zu entscheiden, ob der Inhalt meines Plugins an den an den Filter-Hook übergebenen Beitragsinhalt angehängt wird. Der Pseudocode würde ungefähr so ​​aussehen ...

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;
}

... aber nach langem Durchsuchen der WordPress-Kernquelle, der Foren und hier sieht es nicht so aus, als ob eine Funktion im Sinne von is_sidebar oder is_widget (oder einer anderen Variation des Namens) existiert.

Ist es überhaupt möglich festzustellen, ob eine Filter-Hook-Funktion im Kontext der Seitenleiste oder in einem Widget aufgerufen wird?

EDIT: Aufgrund des Vorschlags von @ toscho, is_main_query zu verwenden, habe ich meinen Filter-Hook für the_content und the_excerpt so geändert ...

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;
}

Aufgrund dessen hatte ich erwartet, dass die Meldung Not main query, baling in meinem PHP Fehlerprotokoll angezeigt wird, wenn das Widget "Kategoriebeiträge" the_excerpt() im Kontext der Seitenleiste aufruft. Ich aber nicht.

Für den Kontext fragt das Widget "Kategorie-Beiträge" nach Beiträgen innerhalb der widget-Methode des Widgets ab (aus Gründen der Übersichtlichkeit strikt umschrieben) ...

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

... fehlt mir etwas (sehr wahrscheinlich) oder bekomme ich nur nicht den Kontext, in dem ich is_main_query() verwende (genauso wahrscheinlich) ...?

4
Gary Gale

In einem parallelen Thread im WordPress-Hacks-Forum schlug jemand vor, in_the_loop() zu verwenden, und das funktioniert manchmal mit einigen Plugins, die entweder the_content und/oder the_excerpt verwenden, aber nicht immer mit allen Plugins I habe getestet gegen.

Ebenso habe ich jetzt weitere Tests mit is_main_query() durchgeführt und das funktioniert manchmal mit einigen Plugins, aber nicht mit allen.

Aber die magische Kombination von Tests gegen is_main_query() und in_the_loop() scheint den Trick zu tun.

Also sieht der (Pseudo-) Code jetzt ungefähr so ​​aus ...

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;
}

.. was mir jetzt genau das Verhalten gibt, das ich wollte, gegen so viele Plugins, die die Inhalts- oder Auszugsfilter in der Seitenleiste und/oder den Fußzeilen-Widgets verwenden.

6
Gary Gale

Fragen Sie nicht nach Seitenleisten, sondern nach der Hauptabfrage :

if ( is_main_query() )
    return;

Der Grund: Der Auszug oder der Hauptinhalt kann auch an anderen Stellen abgerufen werden, und Sie möchten wirklich nicht für jeden Fall eine neue Bedingung erstellen.

2
fuxia