wake-up-neo.net

Hook, der zu the_content hinzugefügt wurde, wird anscheinend mehrmals aufgerufen

Ich habe den folgenden Code in einem Plugin ausgeführt:

 add_filter('the_content','thousand_pay');

//Callback function
function thousand_pay($content)
{
    echo $content;

    if( !in_category( 'Stories') )

    {
        return;
    }
    ?>
<hr></hr>
[Some HTML]
<?php

    return
}

Aus irgendeinem Grund wird der HTML-Code auf einzelnen Postseiten mehrmals gedruckt:

 Bug where HTML is printed multiple times 

Kann sich jemand vorstellen, warum das so ist? Ich habe hier gelesen, dass ich möglicherweise zu den Bedingungen hinzufügen muss, um is_singular () und is_main_query () zu überprüfen, damit es wie if(!in_category('Stories') || !is_singular() || !is_main_query() aussieht, aber das scheint nur zu verhindern, dass der HTML-Code überhaupt auf einer Postseite gedruckt wird. Irgendwelche Ideen?

2
Ed King

Es ist normal, dass auf Inhalte mehrmals zugegriffen wird. Beispielsweise müssen SEO-Plugins dies tun, um darauf zuzugreifen und Metadaten von zu generieren.

Es ist auch ein Filter Haken. Filter sollten niemals irgendetwas auf der Seite ausgeben. Sie sollen den übergebenen Wert ändern und ihn zurückgeben.

Wenn Sie an diesem Punkt etwas tun möchten, aber nur innerhalb der Schleife, dann ist in_the_loop() die Bedingung, die Sie benötigen.

4
Rarst

Ich hatte das gleiche Problem. Mein the_content-Filter wurde mehrmals aufgerufen und dies verlangsamte das Laden der Seite, da mein the_content-Filter eine externe API aufrief. In meinem Fall wurde die API also mehrmals nach denselben Daten abgefragt.

Ich habe versucht, in_the_loop(), is_singular() und is_main_query() zu verwenden, aber manchmal konnten diese, je nach Thema, die Aufrufe meines Filters nicht auf einmal beschränken.

Also habe ich meinem Filter eine Konstante hinzugefügt und das scheint das Problem behoben zu haben.

Hier ist ein Beispiel, wie Sie Ihre Anrufe auf den the_content-Filter auf einmal beschränken können:

add_filter( 'the_content', 'se225721_the_content' );

function se225721_the_content( $content ) {

    if ( ! in_the_loop() ) {
        return $content;
    }

    if ( ! is_singular() ) {
        return $content;
    }

    if ( ! is_main_query() ) {
        return $content;
    }

    $content = ucwords( $content );

    remove_filter( 'the_content', 'se225721_the_content' );

    return $content;
}

Hoffentlich hilft das!

Eric

6
Eric