it-swarm.com.de

Ermitteln von eingebetteten URLs in post_content

Ich muss die Art und Weise ändern, in der WP HTML ausgibt, wenn eine eingebettete URL im Inhalt angegeben wird. Beispielinhalt im WP Editor:

This is standard content and will be wrapped in a 'p' tag. But check out this cool vid:

http://www.youtube.com/watch?v=3JJv4TvURj4

This will be output as another 'p' tag. The above URL will be turned into an iFrame.

Das Ziel ist, dass der Kunde so etwas Einfaches eingibt und die Art und Weise ändert, wie WordPress es auf der Seite ausgibt. Ich habe den oembed_dataparse-Filter bisher erfolgreich verwendet, aber ich möchte die Video-URL nehmen und an eine andere Funktion außerhalb des Filters übergeben . Wie kann ich das machen?

Mein ursprünglicher Ansatz war es, eine globale Variable zu verwenden. Hier ist mein gekürzter Filtercode:

add_filter('oembed_dataparse', 'modal_embed', 10, 3);
function modal_embed($html, $data, $url) {
    // This is supposed to store the URL globally so I can access it 
    // outside this filter.
    global $video_url;
    $video_url = $url;

    $custom_output = "<div class='video'>$html</div>"; // Just an example. 
    return $custom_output;
}

Der Code, den ich als $custom_output erstelle, funktioniert einwandfrei und wird auf der Seite angezeigt. Das Problem ist, dass ich nicht wie erwartet global auf $video_url zugreifen kann. Irgendwelche Gedanken? Vielen Dank.

3
ian

OK habe es. Ich habe mich nur ein bisschen im wp-Kern umgegraben und die Funktion gefunden, mit der sie Autodetekte erfassen. WP verwendet die Funktion php preg_replace_callback innerhalb der Funktion WP autoembed. Hier ist der Code aus wp-includes/class-wp-embed.php:

/**
     * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding.
     *
     * @uses WP_Embed::autoembed_callback()
     *
     * @param string $content The content to be searched.
     * @return string Potentially modified $content.
     */
    function autoembed( $content ) {
        return preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', array( $this, 'autoembed_callback' ), $content );
    }

Da ich nur vorhabe, dass der Client ein Video pro Post eingibt, verwende ich die Funktion preg_match zusammen mit demselben RegEx-Muster, um das zu erreichen, was ich möchte:

function embed_url_lookup() {
    if (!have_posts()) return false;

    the_post(); // necessary to use get_the_content()

    $reg = preg_match('|^\s*(https?://[^\s"]+)\s*$|im', get_the_content(), $matches);

    if (!$reg) return false;

    return trim($matches[0]);

} // end embed_url_looku

Dadurch wird die erste automatisch gespeicherte URL gefunden und zurückgegeben.

4
ian