it-swarm.com.de

Wie kann ich oEmbed-Caches für YouTube für geladene Posts löschen?

Ich habe eine Website mit Tonnen von Posts, in denen Hunderttausende von YouTube-Videos eingebettet sind. Die meisten verwenden das Standardformat [embed] youtube_url [embed] und der tatsächliche Einbettungscode wird in den Postmetafeldern von oEmbed gespeichert.

Ich habe die Site auf HTTPS und eine neue Domain umgestellt und jetzt werden die alten Videos nur angezeigt, wenn ich den Beitrag erneut speichere. Ich möchte nicht jeden Beitrag aus offensichtlichen Gründen erneut speichern, und ich möchte nicht in die Datenbank gehen und alle oEmbed-Caches auf einmal blind löschen. Dies sind die einzigen anderen Optionen, die ich bei der Suche gefunden habe.

Was ich möchte, ist ein Filter im oEmbed-System, der die YouTube-oEmbed-Caches aktualisiert, wenn Posts tatsächlich geladen werden. Dies ist im Grunde nur eine Möglichkeit, die Caches zu deaktivieren, während die Posts geladen werden.

Im Idealfall würde es nur für YouTube-Einbettungen gelten (obwohl sie zur Wiederverwendung geöffnet sind) und es mir ermöglichen, das Datum des Posts zu überprüfen, um das erneute Abrufen der oEmbed-Ausgabe für Posts zu vermeiden, die nach dem HTTPS-Wechsel erstellt wurden.

Scheint, als ob dies etwas ist, was viele von uns aus vielen Gründen brauchen, also gibt es hoffentlich einen eleganten Weg :)

5
jerclarke

So lösen Sie eine Cache-Regeneration aus

Die Standard-Cache-Zeit beträgt 24 Stunden und wir können sie mit dem oembed_ttl-Filter anpassen.

Aber wie Sie bemerkt haben, reicht Cache abgelaufen nicht aus, um eine Cache-Regeneration auszulösen.

Der Grund ist diese Zeile in der Klasse WP_Embed:

if ( $this->usecache || $cached_recently ) {

um eine Regeneration auszulösen, müssen sowohl expired cache als auch die Eigenschaft usecache des $wp_embed-Objekts false sein.

Wenn wir einen Beitrag speichern, rufen wir außerdem wp_ajax_oembed_cache() mit Ajax auf und führen die Methode WP_Embed::cache_oembed() aus. Diese Methode setzt die Eigenschaft usecache temporär auf false.

Beispiel 1

Wir können eine Cache-Regeneration für einen abgelaufenen Cache erzwingen mit:

add_action( 'template_redirect', function()
{    
    if( is_single() )
        $GLOBALS['wp_embed']->cache_oembed( get_queried_object_id() );  
});

und wir können die Ablaufzeit weiter auf eine Stunde einstellen mit:

add_filter( 'oembed_ttl', function( $ttl )
{
    return HOUR_IN_SECONDS; // Adjust to your needs
} );

Beachten Sie, dass es aufgrund der Cache-Regeneration zu Verzögerungen beim Laden der einzelnen Posts kommen kann. Ein Ajax-Aufruf kann eine Problemumgehung sein. Bei diesem Ansatz ist der Cache nach Ablauf immer für die Neuerstellung bereit. Im nächsten Beispiel versuchen wir, dies zu beheben, indem wir es nur einmal aktualisieren.

Beispiel # 2

Hier ist ein weiterer Ansatz zum Aktualisieren des oEmbed-HTML-Codes bei einzelnen Post-Ladevorgängen, jedoch nur einmal.

Wir setzen eine feste recache Zeit (aktuell) und wenn ein einzelner Beitrag geladen wird, vergleichen wir ihn mit der Zeit, zu der das oEmbed-HTML zuletzt zwischengespeichert wurde.

Wenn die letzte Cache-Zeit vor der recache -Zeit liegt, müssen wir sie neu generieren.

add_filter( 'oembed_ttl', function( $ttl, $url, $attr, $post_ID )
{
    // Only do this on single posts
    if( is_single() )
    {
        // Oembeds cached before this time, will be recached:
        $recache_time  = '2015-09-23 23:26:00';     // <-- Set this to the current time.

        // Get the time when oEmbed HTML was last cached (based on the WP_Embed class)
        $key_suffix    = md5( $url . serialize( $attr ) );
        $cachekey_time = '_oembed_time_' . $key_suffix;
        $cache_time    = get_post_meta( $post_ID, $cachekey_time, true );

        // Get the cached HTML 
        $cachekey      = '_oembed_' . $key_suffix;
        $cache_html    = get_post_meta( $post_ID, $cachekey, true );

        // Check if we need to regenerate the oEmbed HTML:
        if(     
                $cache_time < strtotime( $recache_time )     // cache time check
             && false !== strpos( $cache_html, 'youtube' )   // contains "youtube" stuff 
             && ! do_action( 'wpse_do_cleanup' )             // let's just run this once 
             && 1 === $GLOBALS['wp_embed']->usecache
        ) {
            // What we need to skip the oembed cache part
            $GLOBALS['wp_embed']->usecache = 0; 
            $ttl = 0;               
            // House-cleanoing
            do_action( 'wpse_do_cleanup' );
        }
    }
    return $ttl;
}, 10, 4 );

und dann brauchen wir vielleicht auch diesen:

// Set the usecache attribute back to 1.
add_filter( 'embed_oembed_discover', function( $discover )
{
    if( 1 === did_action( 'wpse_do_cleanup' ) )
        $GLOBALS['wp_embed']->usecache = 1;
    return $discover;
} );

Hoffentlich können Sie dies weiter an Ihre Bedürfnisse anpassen.

6
birgire