web-dev-qa-db-fra.com

Comment déterminer si un filtre est appelé dans un contexte de barre latérale/widget?

J'ai donc un plugin qui ajoute ou ajoute une biographie améliorée de l'auteur au contenu d'une page/d'un message/d'un type de message personnalisé.

Pour ce faire, il se connecte à the_content ou the_excerpt et ajoute/ajoute du contenu en fonction de la configuration du plugin.

J'ai commencé à recevoir des requêtes d'assistance où la biographie de l'auteur apparaît dans la barre latérale d'un site via un widget, par exemple via le widget Catégorie Posts . Le widget utilise the_excerpt() dans une boucle de requête personnalisée pour extraire les publications selon une catégorie configurée et afficher l'extrait de publication dans le contexte de la barre latérale.

En conséquence directe, le hook de filtre the_excerpt de mon plugin est appelé. Ce que j'aimerais faire, c'est pouvoir détecter si mon hook de filtre est appelé dans le contexte de la barre latérale ou d'un widget et décider conditionnellement d'ajouter ou non le contenu de mon plugin au contenu de publication transmis au hook de filtre. Le pseudo-code ressemblerait à quelque chose comme ça ...

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

... mais après beaucoup de recherches dans les sources principales de WordPress, les forums et ici, cela ne ressemble pas à une fonction du type is_sidebar ou is_widget (ou une autre variante du nom).

Est-il même possible de déterminer si une fonction de filtre de filtrage est appelée dans le contexte de la barre latérale ou dans un widget?

EDIT: Suivant la suggestion de @ toscho d'utiliser is_main_query, j'ai modifié mon hook de filtre pour the_content et the_excerpt afin qu'il ressemble à ceci ...

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

Par conséquent, je m'attendais à voir le message Not main query, baling dans mon journal des erreurs PHP lorsque le widget Messages de catégorie appelle the_excerpt() dans le contexte de la barre latérale. Mais je ne.

Pour le contexte, le widget Catégorie de messages recherche les publications dans la méthode widget du widget comme ceci (sévèrement paraphrasé pour plus de clarté) ...

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

... est-ce que je manque quelque chose (très probablement) ou est-ce que je ne comprends pas le contexte dans lequel j'utilise is_main_query() (tout aussi probable) ...?

4
Gary Gale

Sur un fil parallèle sur le forum WordPress , quelqu'un a suggéré d'utiliser in_the_loop() et cela fonctionne de temps en temps, avec certains plugins qui utilisent soit the_content et/ou the_excerpt, mais pas toujours avec tous les plugins que j'ai testé contre.

De même, j'ai maintenant effectué d'autres tests en utilisant is_main_query() et cela fonctionne parfois, avec certains plugins, mais pas avec tous.

Mais la combinaison magique de tests contre is_main_query() et in_the_loop() semble faire l'affaire.

Donc le (pseudo) code ressemble maintenant à quelque chose comme ça ...

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

..qui me donne maintenant exactement le comportement que je voulais, contre autant de plugins qui utilisent les filtres de contenu ou d’extraits dans les widgets de la barre latérale et/ou du pied de page.

6
Gary Gale

Ne demandez pas de barres latérales, demandez la requête principale :

if ( is_main_query() )
    return;

La raison: l’extrait ou le contenu principal peuvent également être récupérés ailleurs, et vous ne voulez vraiment pas créer de nouvelle condition pour chaque cas.

2
fuxia