web-dev-qa-db-fra.com

Détection des URL intégrées dans post_content

J'ai besoin de changer la façon dont WP génère le code HTML quand une URL incorporée est fournie dans le contenu. Exemple de contenu dans l'éditeur WP:

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.

Le but est que le client entre quelque chose de simple comme celui-ci et modifie la façon dont wordpress le affiche sur la page. J'utilise le filtre oembed_dataparse à bon escient jusqu'à présent, mais j'aimerais prendre l'URL de la vidéo et la transmettre à une autre fonction en dehors du filtre . Comment puis je faire ça?

Mon approche initiale consistait à utiliser une variable globale. Voici mon code de filtre abrégé:

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

Le code que je crée en tant que $custom_output fonctionne très bien et est affiché sur la page. Le problème est que je n'ai pas accès à $video_url globalement comme prévu. Des pensées? Merci.

3
ian

OK, j'ai compris. Je viens de fouiller un peu dans wp core et de trouver la fonction qu’ils utilisent pour saisir les autodetcts. WP utilise la fonction php preg_replace_callback dans la fonction WP autoembed. Voici le code, comme on le voit dans 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 );
    }

Etant donné que je prévois que le client saisisse une vidéo par publication, j'utilise la fonction preg_match avec ce même modèle RegEx pour obtenir ce que je veux:

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

Ceci trouvera la première URL autoembed et la retournera.

4
ian