web-dev-qa-db-ja.com

Post_content内の埋め込みURLの検出

コンテンツ内に埋め込みURLを指定した場合のWPのHTML出力方法を変更する必要があります。 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.

目標は、クライアントがそのような単純なものを入力し、wordpressがそれをページに出力する方法を変更することです。これまでoembed_dataparseフィルタを効果的に使用してきましたが、 動画のURLを取得してフィルタの外側の別の関数に渡したいと思います 。どうやってやるの?

私の最初のアプローチはグローバル変数を使うことでした。これが私の要約したフィルタコードです。

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

$custom_outputとして作成したコードは問題なく機能し、ページに表示されます。問題は、思ったとおりに$video_urlにグローバルにアクセスできないということです。何かご意見は?ありがとう。

3
ian

はい、わかった。私はちょっとwp coreで少し掘り下げて、そして彼らが自動検出をつかむのに使う関数を見つけました。 WPは、WP autoembed関数内でphp preg_replace_callback関数を使用します。 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 );
    }

私はクライアントが投稿ごとに1つのビデオを入力することだけを計画しているので、私は欲しいものを達成するためにこの同じRegExパターンと共にpreg_match関数を使います:

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

これは最初のautoembed URLを見つけてそれを返します。

4
ian