embed

PHP

【WordPress】ヘッダー(headタグ)の”application/json+oembed”タグを削除する

更新日:2023/03/08

WordPressはWebページのheadタグに、type属性が"application/json+oembed""text/xml+oembed"のlinkタグが記述されています。

また、scriptタグでwp-embed.min.jsというスクリプトを読み込んでいます。

これらはWordPressの投稿埋め込み機能(embed)で使用するタグです。

今回はこれらのタグをページから除去する方法をお伝えします。

 

embedに関するlinkタグの削除

embedに関するlinkタグは、ページのhtml内に次のように記述されています。

<link rel="alternate" type="application/json+oembed" href="https://ドメイン名/index.php?rest_route=%2Foembed%2F1.0%2Fembed&#038;url=https%3A%2F%2Fドメイン名%2F%3Fp%3D1" />
<link rel="alternate" type="text/xml+oembed" href="https://ドメイン名/index.php?rest_route=%2Foembed%2F1.0%2Fembed&#038;url=https%3A%2F%2Fドメイン名%2F%3Fp%3D1&#038;format=xml" />

二つのタグを削除するときは、次のコードを記述します。

remove_action('wp_head','wp_oembed_add_discovery_links');

このコードは、linkタグを生成する処理そのものを削除しています。

一方だけ削除したいときは、次のコードです。

add_filter( 'oembed_discovery_links' , function($output){
          // 一つ目のlinkタグを残すときは末尾を[0]
          // 二つ目を残すときは[1] に変更
	return explode("\n",$output)[0];
});

このコードのoembed_discovery_linksフィルターは、linkタグを生成するwp_oembed_add_discovery_links()関数でlinkタグを生成したあと、最後に呼び出されます。

呼び出された関数で受け取った二つのlinkタグは、改行で連結されています。
そこで改行で分割して配列に格納して、必要なlinkタグを返しています。

順番は毎回同じなので、上記のlinkタグの例を見て必要な方を判断してください。

上記のコードは、二つ目のlinkタグが削除されます。
一つ目を削除するときは、コード内の [0][1] に変更してください。

 

embedに関するscriptタグの削除

embedに関するscriptタグは、ページのhtmlの最後の方(</body>付近)に次のように記述されています。

<script type='text/javascript' src='http://ドメイン名/wp-includes/js/wp-embed.min.js?ver=10.10.10' id='wp-embed-js'></script>

このタグを削除するときは、次のコードを記述します。

add_action( 'wp_footer' , function(){
	wp_dequeue_script('wp-embed');
},0);
以前は次のコードで無効化できましたが、仕様が変わったため使用できなくなりました。

remove_action('wp_head', 'wp_oembed_add_host_js');

 

embedタグの役割

削除する前に、この二つのタグの役割を確認してみましょう

なお、ここに書いてあるのは投稿埋め込みをする側とされる側が共にWordPressサイトのときに成立します。
詳しくは次のページで解説しているので、読んでみてください。

linkタグ

embedに関するlinkタグは、他サイトが自分のページに埋め込むために使用します。

そのため、既にリンクを貼ってくれているWebサイトがある場合、そのリンクが無効になってしまう可能性があります。
タグを削除するかどうかについては、慎重に判断しましょう。

内容を見てみます。
linkタグのhref属性に記述されているURLに、ブラウザでアクセスすると次のように表示されます。

{
  "version":"1.0",
  "provider_name":"My Blog",
  "provider_url":"https:\/\/ドメイン名",
  "author_name":"test",
  "author_url":"https:\/\/ドメイン名\/?author=1",
  "title":"Hello world!",
  "type":"rich",
  "width":600,
  "height":338,
  "html":"<blockquote class=\"wp-embedded-content\" data-secret=\"dqoxvSCSXu\"><a href=\"https:\/\/ドメイン名\/?p=1\">Hello world!<\/a><\/blockquote><iframe sandbox=\"allow-scripts\" security=\"restricted\" src=\"https:\/\/ドメイン名\/?p=1&#038;embed=true#?secret=dqoxvSCSXu\" width=\"600\" height=\"338\" title=\"&#8220;Hello world!&#8221; &#8212; My Blog\" data-secret=\"dqoxvSCSXu\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" class=\"wp-embedded-content\"><\/iframe><script>\n\/*! This file is auto-generated *\/\n!function(c,l){\"use strict\";var e=!1,o=!1;if(l.querySelector)if(c.addEventListener)e=!0;if(c.wp=c.wp||{},c.wp.receiveEmbedMessage);else if(c.wp.receiveEmbedMessage=function(e){var t=e.data;if(!t);else if(!(t.secret||t.message||t.value));else if(\/[^a-zA-Z0-9]\/.test(t.secret));else{for(var r,s,a,i=l.querySelectorAll('iframe[data-secret=\"'+t.secret+'\"]'),n=l.querySelectorAll('blockquote[data-secret=\"'+t.secret+'\"]'),o=0;o<n.length;o++)n[o].style.display=\"none\";for(o=0;o<i.length;o++)if(r=i[o],e.source!==r.contentWindow);else{if(r.removeAttribute(\"style\"),\"height\"===t.message){if(1e3<(s=parseInt(t.value,10)))s=1e3;else if(~~s<200)s=200;r.height=s}if(\"link\"===t.message)if(s=l.createElement(\"a\"),a=l.createElement(\"a\"),s.href=r.getAttribute(\"src\"),a.href=t.value,a.host===s.host)if(l.activeElement===r)c.top.location.href=t.value}}},e)c.addEventListener(\"message\",c.wp.receiveEmbedMessage,!1),l.addEventListener(\"DOMContentLoaded\",t,!1),c.addEventListener(\"load\",t,!1);function t(){if(o);else{o=!0;for(var e,t,r,s=-1!==navigator.appVersion.indexOf(\"MSIE 10\"),a=!!navigator.userAgent.match(\/Trident.*rv:11\\.\/),i=l.querySelectorAll(\"iframe.wp-embedded-content\"),n=0;n<i.length;n++){if(!(r=(t=i[n]).getAttribute(\"data-secret\")))r=Math.random().toString(36).substr(2,10),t.src+=\"#?secret=\"+r,t.setAttribute(\"data-secret\",r);if(s||a)(e=t.cloneNode(!0)).removeAttribute(\"security\"),t.parentNode.replaceChild(e,t);t.contentWindow.postMessage({message:\"ready\",secret:r},\"*\")}}}}(window,document);\n<\/script>\n"
}

この中の "html" の値が、投稿内の対象URLと置き換わります。

Webページにlinkタグがないと置き換えることができないので、URLがそのまま残ることになります。

なお"html" の値は次のようになっていますが、<script>タグは削除されます。

<blockquote><a>タイトル</a></blockquote>
<iframe></iframe>
<script>スクリプト</script>←削除される
表示された情報内の"author_name"は、初期状態ではログイン名です。
linkタグを削除しない判断をしたとしても、これは変更した方がいいかもしれません。
【WordPress】application/json+oembedに含まれる著作者情報を削除する。

scriptタグ

embedに関するscriptタグは、自分のサイトに埋め込んだタグを処理するスクリプトです。

ページの読み込み直後は、aタグでのリンクのみが表示されています。
スクリプトはiframeがブログカードを表示するのを監視して、表示が完了したらaタグを非表示しています。

つまりスクリプトが削除されていると、iframeが表示されずにaタグでのリンクだけが残ります。

自サイトにURL貼り付けで投稿埋め込みをしているときは、スクリプトを削除しないようにしましょう。

WordPressはHTMやCSSの知識も必要。総合的な知識を身につけよう。

更新日:2023/03/08

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。