この記事は最後に更新してから1年以上経過しています。

oEmbedについて考えてみた

説明

本サイト向けにテーマをリニューアルしようと思い一から作っている最中、ふと生成されているHTMLの中にあるoEmbedの記述が目についた。「この記述いつからだっけ」くらいに思いながらリンク先を開き、ちょっとモヤモヤしてしまった。

author_nameとauthor_url

出力されたhtmlのhead要素に記載されているoEmbedの指定は、JSONとXMLの2つが指定されている。どちらもデータとしての内容は同じなので、ここでは見やすいXMLの抜粋を掲載する。

<oembed>
<version>1.0</version>
<provider_name>local4</provider_name>
<provider_url>http://local4</provider_url>
<author_name>local4man</author_name>
<author_url>http://local4/author/local4man/</author_url>
<title>Hello world!</title>
<type>rich</type>
<width>600</width>
<height>338</height>
<html>
…省略…
</html>
</oembed>

このように、サイト名、サイトURL、著者名、著者ページのURLなどが記載されており、著者名は「ユーザー名(user_login)」と同じでした。ここで注目したのが、author_nameとauthor_url。ちょっと焦ってこの内容を出力しているところをトレースしていくと、 get_oembed_response_data関数に行きついた。この関数内では、投稿者情報が見つかった場合、「ブログ上の表示名(display_name)」を設定するようになっており、この部分は問題がないように思える。

次にこのユーザー情報をデータベースで確認。

+----+------------+---------------+--------------+
| ID | user_login | user_nicename | display_name |
+----+------------+---------------+--------------+
|  1 | local4man  | local4man     | local4man    |
+----+------------+---------------+--------------+

結果はご覧の通りで、最初に登録した管理者情報は「ブログ上の表示名」が「ユーザー名」と同一であり、これが出力されたことがわかる。

WordPressではユーザーの登録・更新を行う wp_insert_user関数を使用する。この関数を見てみると、「著者ページのスラッグ(user_nicename)」「ブログ上の表示名」とも、それらが指定されていればその内容が保存されるようになっているが、WordPressのインストール段階ではそれらの項目を入力することができず、「投著者ページのスラッグ」は「ユーザー名」からアクセント文字を取り除き後で長さを調整したものになり、「ブログ上の表示名」は「ユーザー名」がサニタイズされたものが適用される。「ユーザー名」が英小文字と数字の組み合わせで構成されている場合は、「著者ページのスラッグ」と「ブログ上の表示名」が共通になってしまう可能性が高い。

とりあえずの対策としては、「ブログ上の表示名」については、管理者ページのプロフィールにて適宜なものに変更すること。「著者ページのスラッグ」についてはプラグインの活用やデータベースを直接更新するのが妥当だろう。

oEmbedのレスポンス

「著者ページのスラッグ」と「ブログ上の表示名」を変更することで、リスクはいくらか軽減できた気がする。追加対策として、コーポレートサイトのような著者ページを用意していないサイトならget_oembed_response_data関数のoembed_response_dataフィルターを使ってoEmbedのレスポンス内容を変更することも検討しておきたい。このフィルターの使用例は次の通り。

add_filter( 'oembed_response_data', 'mytheme_oembed_response_data', 10, 4 );
function mytheme_oembed_response_data( $data, $post, $width, $height ) {
	if ( isset( $data['author_name'] ) ) {
		$data['author_name'] = get_bloginfo( 'name' );
		$data['author_url']  = get_home_url();
	}
	return $data;
}

またoEmbedのリンクが不要なサイトなら、テーマ内のfunctions.php(after_setup_themeアクション内など)に次の内容を記述することで、リンクそのものを出力しないようにできる。

remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );

対策はこんなもんかなと思ったわけだが、そもそも昨今のサイトはX-Frame-Options設定によってiframeを抑制していることがあり、そういったサイトではoEmbedのリクエストは意図した結果にならない。今度はoEmbedの利用状況が気になってモヤモヤしてきた。


最終更新 : 2018年05月27日 10:42


お勧め

add_shortcode(2018年5月27日 更新)

void add_shortcode( string $tag, mixed $func )
ショートコード(独自タグ)を追加する。ショートコードは、投稿記事内でテキスト内容がない[tag]や、テキストを内包する[tag]テキスト[/tag]の書式で使用できる独自タグのこと。標準の状態では、 the_content関数によって表示する直前のフィルター処理内でパラメータ$funcで指定した関数・メソッドが実行される。

get_user_setting(2022年1月31日 更新)

mixed get_user_setting( string $name [ , string $default = false ] )
ユーザーインターフェイス設定を取得する。

have_posts(2018年5月27日 更新)

bool have_posts( )
次の投稿データが存在するかを調べる。

in_category(2018年5月27日 更新)

bool in_category( mixed $category [ , mixed $post = null ] )
投稿情報が指定したカテゴリーに属しているか調べる。

add_feed(2024年6月24日 更新)

string add_feed( string $feedname, callable $callback )
フィードを追加する。