【WordPres】投稿埋め込み(embed)のURLを変更する方法
更新日:2024/02/27
WordPressの埋め込み投稿機能は、二つのURLを外部に公開しています。
一つはtype="application/json+oembed"属性を持つlinkタグのhref属性です。
もう一つは、iframeタグのsrc属性です。
これらのURLは、通常は変更する必要がありませ。
しかし、まれに変更しなければいけない状況に直面することがあります。
そこで、今回は二つのURLを変更する方法をお伝えします。
application/json+oembedのリンク先を変更する
type属性が"application/json+oembed"と"text/xml+oembed"のlinkタグのhref属性を変更します。
初期状態は、次のようになっています。
<link rel="alternate" type="application/json+oembed" href="https://ドメイン名/wp-json/oembed/1.0/embed?url=http%3A%2F%2Fドメイン名%2Fxxx" />
<link rel="alternate" type="text/xml+oembed" href="https://ドメイン名/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fドメイン名%2Fxxx%2F&format=xml" />
href属性が https://ドメイン名/wp-json/oembed/1.0/embed?url=ページURL となっていますね。
これを、https://ドメイン名/oembed.json?url=ページURL に変えてみます。
そこで .jsonを付加しています。
リンクタグの変更
href属性の変更はoembed_endpoint_urlフィルターを使用して、linkタグ全体を生成して返します。
add_filter('oembed_endpoint_url',function($url, $permalink, $format ){
return add_query_arg(
array(
'url' => urlencode( $permalink ),
'format' => ( 'json' !== $format ) ? $format : false,
),
home_url() . '/embed.json'
);
},10,3);
add_query_arg()は、クエリパラメータ―をURLに付加する関数です。
これを適用すると、次のようなタグに置き換わります。
<link rel="alternate" type="application/json+oembed" href="http://ドメイン名/embed.json?url=http%3A%2F%2Fドメイン名%2Fxxx" />
<link rel="alternate" type="text/xml+oembed" href="http://ドメイン/embed.json?url=http%3A%2F%2Fドメイン%2Fxxx&format=xml" />
変更後のURLを受け付け可能にする
変更後のURLを有効にするには、リライトルールに今回追加したURLを追加する必要があります。
リライトルールは、ブラウザで入力されたURLをWordPressが認識できるパラメータに変換するため連想配列です。
例えば、著作者ページのリライトルールは次のようになっています。
'author/([^/]+)/?$'=>'index.php?author_name=$matches[1]'
入力されたURLが連想配列キーで表された正規表現にマッチしたら、キーの値で置き換えられます。
変換後:index.php?author_name=abcde
同じように、今回設定したURLをリライトルールに追加してみます。
追加はrewrite_rules_arrayフィルターでおこないます。
add_filter('rewrite_rules_array',function($rewrite){
$add_rule = array(
'^embed\.json$' => 'index.php?rest_route=/oembed/1.0/embed'
);
return array_merge($add_rule, $rewrite);
},999);
置き換え先のrest_routeパラメータは、Rest Api のエンドポイントです。
Rest Apiでembedを取得するときは、エンドポイントに/oembed/1.0/embedを指定します。
リライトルールは様々なパターンのURLを仕分けているので、既存パターンが今回のURLにマッチする可能性があります。
そのため、追加するルールを連想配列の先頭に挿入しています。
このフィルターは、パーマリンク設定の「変更を保存」ボタンを押したときに呼び出され、ルールがデータベースに登録されます。
そのため、パーマリンク設定の「変更を保存」を必ず押してください。
これで、linkタグのリンク先にアクセスすると、jsonまたはxmlデータを取得できます。
iframeのリンク先を変更する
WordPressの投稿埋め込み機能は、Webページに次のようなタグを挿入します。
<blockquote class="wp-embedded-content" data-secret="mDqHCpSWur">
<p><a href="ページURL">ページタイトル</a></p>
</blockquote>
<p>
<iframe class="wp-embedded-content"
sandbox="allow-scripts"
security="restricted"
style="position: absolute; clip: rect(1px, 1px, 1px, 1px);"
title="ページタイトル"
src="https://ドメイン名/xxxx/embed/#?secret=322B3C8v5f#?secret=mDqHCpSWur"
data-secret="mDFHCBSWur" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</p>
埋め込まれたブログカードはiframe内に表示されます。
今回は、このiframeのsrc属性を変更します。
src属性の変更
post_embed_urlフィルターを使用すると、iframeタグのsrc属性を変更できます。
add_filter('post_embed_url',function($embed_url, $post ){
return get_permalink($post).'/iframe/embed';
},10,2);
これで、src属性が次のようになります。
src="https://ドメイン名/xxxx/iframe/embed/#?secret=322B3C8v5f#?secret=mDqHCpSWur"
前項で紹介したoembed_endpoint_urlフィルターはURLのパラメーターを設定できました。
しかし、今回のpost_embed_urlフィルターは設定しない方がよさそうです。
このフィルターで返した値は、後で #?secret= が追加されます。
そのため post_embed_urlフィルターでパラメーターを追加すると、最初のパラメータは ? で以降は & で連結するという決まりに違反してしまうからです。
ただ例で挙げた上記のURLを見ると、#?secret=が二つあります。
この時点でおかしいので、気にする必要はないのかもしれません。
変更後のURLを受け付け可能にする
linkタグの変更と同じように、リライトルールを変更します。
前回と同様にrewrite_rules_arrayフィルターで設定します。
add_filter('rewrite_rules_array',function($rewrite){
$add_rule = array(
'^([^/]+)/iframe/embed$' => 'index.php?name=$matches[1]&embed=true'
);
return array_merge($add_rule, $rewrite);
},999);
nameパラメーターは投稿ページの名前です。
これだけだとページが表示されます。
embed=trueを付加すると、embed用のページデータが送信されます。
更新日:2024/02/27
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。