この記事は最後に更新してから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


お勧め

the_search_query(2018年5月27日 更新)

void the_search_query( )
検索フォームで入力された検索キーフレーズを表示する。

wp_parse_slug_list(2019年2月23日 更新)

array wp_parse_slug_list( mixed $list )
スラッグのリストをパースする。

get_current_user_id(2013年9月18日 更新)

int get_current_user_id()
現在のログイン済みユーザーのIDを取得抽出する。

wp_cache_set(2023年8月9日 更新)

bool wp_cache_set( mixed $id, mixed $data [, string $flag = '' [, int $expire = 0 ] ] )
任意のデータをキャッシュに保存する。

translate_user_role(2019年5月13日 更新)

string translate_user_role( string $name [ , string $domain = 'default' ] )
ロール(権限グループ)名の翻訳テキストを取得する。