コンテンツ内に埋め込み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
にグローバルにアクセスできないということです。何かご意見は?ありがとう。
はい、わかった。私はちょっと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を見つけてそれを返します。