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


お勧め

wp_save_post_revision(2024年1月10日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

get_the_author_posts_link(2019年8月21日 更新)

string get_the_author_posts_link( )
投稿者アーカイブページのリンクを取得する。

get_year_link(2012年2月2日 更新)

string get_year_link( mixed $year )
年アーカイブのURLを取得する。

register_taxonomy(2022年6月1日 更新)

WP_Taxonomy | WP_Error register_taxonomy( string $taxonomy, array | string $object_type, array | string $args = array() )
タクソノミーを登録する。

wp_add_object_terms(2013年8月6日 更新)

mixed wp_add_object_terms( int $object_id, mixed $terms, mixed $taxonomy )
投稿情報などにタクソノミーを追加する。