新しい「カスタマイズ」機能を使用して変更を加えた場合、iframeプレビュードキュメント内の別のページに移動したときに、変更が保存されていなくても変更は適用されます。
WPは一時的な変更をどこかに保存しているように見え、サイトが「カスタマイズ」モードで表示されている場合はサイトに適用されます。
しかし、サイトはそれがカスタマイズモードであることをどのようにして知るのでしょうか。リンクにクエリ引数が追加されている、またはそのようなものがないためです。
ここには適用できるいくつかのビットがありますが、それの短い部分はcustomize-preview.js
内のこのコードです。
this.body.on( 'click.preview', 'a', function( event ) {
event.preventDefault();
self.send( 'scroll', 0 );
self.send( 'url', $(this).prop('href') );
});
Event.preventDefaultは、リンクが実際に機能しないようにします。次のコードは、メッセージを上向きに送り返して、a)ページの一番上にスクロールバックし、b)URLを変更します。
ここでメッセージを送る理由は、iframeが1つだけではなく、2つあるためです。クリックしたページは、実際にはカスタマイザの設定が追加された別のiframe内にロードされ(実際にはPOST
を介して)、古いものをフェードアウトし、新しいものをシームレスにフェードインするために使用されます。これにより、新しいページに切り替わったときに画面が白くなり、見にくくなって点滅するのを防ぎます。
また、テーマコードに対してフィルタリングなどを実行したり、ページの外観を変更したりする必要がなくなります。そのため、テーマの内容に大きな変更はなく、テーマはそのまま表示されます。
フォームの送信がまったく機能しないようにするために、同様のコードが存在します(それは何もしません)など。
カスタマイザ値を傍受および処理するためのフィルタはclass-wp-customize-setting.php
にあります。 preview()
関数は入力値を処理するのに必要なフィルタを追加します、_preview_filter()
関数はそのフィルタです。それは単にget_option()
またはget_theme_mod()
の呼び出しを受け取り、それらが変更されたオプションであると思われるときに通知し、代わりに変更された値を返します。
カスタマイザプレビューウィンドウでリンクをクリックすると、生成されるリクエストは通常のPOST
ではなくGET
リクエストであることがわかります。カスタマイザは、次のフォームデータを使用して、リンククリックをオーバーライドし、代わりにPOST
を実行しているようです。
wp_customize: on
theme: themename
customized: {json-encoded-options-here}
customize_messenger_channel: preview-1
customize フィールドには、変更したオプションが含まれているので、データがテーマに渡されます。カスタマイザコードは、要求されたときにテーマのオプションを(フィルタを通して、私はどれを正確に知りません)傍受し、 customize パラメータの値で置き換えます。