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


お勧め

status_header(2018年5月27日 更新)

void status_header( int $code [ , string $description = '' ] )
header関数を呼び出し、HTTPステータスをセットする。

wp_localize_script(2018年5月27日 更新)

bool wp_localize_script( string $handle, string $object_name, array $l10n )
スクリプト向けの変数を追加する。

wp_debug_backtrace_summary(2012年6月15日 更新)

mixed wp_debug_backtrace_summary( [ string $ignore_class = null [ , int $skip_frames = 0 [ , bool $pretty = true ] ] ] )
デバッグ用の呼び出し情報を取得する。

wp_strip_all_tags(2018年5月27日 更新)

string wp_strip_all_tags( string $string [ , bool $remove_breaks = false ] )
文字列からHTMLタグを取り除く。

get_tags(2018年5月27日 更新)

array get_tags( [ mixed $args = '' ] )
条件を指定してタグ情報を検索し、マッチしたすべてのタグ情報を取得する。