ほとんどのページがRest APIを使用してロードされるテーマを構築する方法を模索しています。私はインデックスページをロードすることができますそしてそこから現在のページでそのコンテンツを構築した後にデータを投稿するためにGETリクエストを行います。基本的に _ spa _ 、少なくともある程度は。
問題は、単一の投稿とそのスクリプト/スタイルをロードしようとしたときに発生します。例として、グーテンベルクはenqueue_block_assets
フックを使って登録されたブロックごとにスクリプトやスタイルをロードすることを許可します。
特定の投稿の登録済みのスタイルとスクリプトのURLを取得する方法を見つけようとしています。私の考えは rest route または field を登録することです。それはそれぞれのスクリプト/スタイルのURLを返します。単一のポストJSONデータがマウントされた後、私はそれからDOMに各スクリプト/スタイルを添付することができます。
global $wp_scripts;
は、登録されているスクリプトと現在のページロードでキューに登録されているスクリプトも返します。そのため、単一ページのロードフローの外部から投稿IDを指定してその情報を取得する方法を見つけることができませんでした。
特定の投稿IDについて、エンキュー/登録済みのスクリプトとスタイルのURLのリストを取得する方法を教えてください。
または
もっと良いアプローチはありますか?
私はグーテンベルクに精通していません、しかしあなたがそれを例として述べたように、私はあなたが 「唯一の」 グーテンベルクを意味しなかったと思います。
wp_enqeue_script()
またはwp_enqueue_style()
関数は投稿やページに関する引数を受け付けません。スクリプトは登録され、グローバルにレンダリングされます。スクリプトが特定の投稿にのみ出力される場合は、ネイティブのPHP条件付きである必要があります。これは簡単には判断できません。
1つのアイデアは、テーマにindex.php
ファイルのみを含め、その中にwp_head()
とwp_footer()
のみを追加することです。それから、それぞれのrestリクエストで、wp_remote_get()
を使って実際のHTMLページのコンテンツを取得し、preg_match_all()
を実行してそのページからすべてのスクリプトを抽出し、それをあなたのrestフィールドに追加します。ちょっと面倒ですが信頼できます。
パフォーマンスを向上させるために、結果を一時キャッシュまたはオブジェクトキャッシュのいずれかにキャッシュすることを忘れないでください。
これを行う方法についての基本的な例は次のとおりです。
// Let's register a new field for returning the script srcs
add_action( 'rest_api_init', 'wpse320065_register_rest_field' );
function wpse320065_register_rest_field() {
register_rest_field(
'post',
'your-field-name',
[
'get_callback' => 'wpse320065_fetch_post_cont',
'schema' => null,
]
);
}
// Callback function to actually retrieve the data
function wpse320065_fetch_post_cont( $object ) {
// Get the id of the post object array
$post_id = $object['id'];
// Let's get the content of post number 123
$response = wp_remote_get( "http://example.com/?p={$post_id}" );
if ( is_array( $response ) ) {
$content = $response['body'];
// Extract the src attributes. You can also use preg_match_all
$document = new DOMDocument();
$document->loadHTML( $content );
// An empty array to store all the 'srcs'
$scripts_array = [];
// Store every script's source inside the array
foreach( $document->getElementsByTagName('script') as $script ) {
if( $script->hasAttribute('src') ) {
$scripts_array[] = $script->getAttribute('src');
}
}
}
return $scripts_array
}