Новый WP_Customize API – как он работает под капотом?

Я заметил, что если вы вносите изменения через новую функцию «настроить», когда вы перемещаетесь на другой странице в документе предварительного просмотра iframe, ваши изменения все равно применяются, даже если они несохранены.

Похоже, что WP где-то хранит временные изменения, и он применяет их на сайте, если сайт просматривается в режиме «настроить».

Но как сайт знает, что он находится в режиме настройки? Потому что я не вижу никаких аргументов запроса к ссылкам или что-то в этом роде.

Здесь есть несколько бит, но, к customize-preview.js этот код находится в 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, есть два. Страница, на которую вы нажали, фактически загружена внутри другого iframe с настройками добавленного к нему настраивателя (через POST действительно), затем эффект затухания используется для постепенного исчезновения старого и постепенного исчезновения в новом. Это предотвращает появление белого и уродливого экрана, когда он переключается на новую страницу.

Также устраняет необходимость делать фильтрацию и т. Д. В коде темы и потенциально изменять внешний вид страницы. Тема, таким образом, отображается как есть, без существенных изменений в ее содержании.

Подобный код существует там, чтобы предотвратить подачу представления формы (он просто ничего не делает) и т. Д.

Фильтр для перехвата и обработки значений настраиваемых параметров находится в class-wp-customize-setting.php . Функция preview() добавляет фильтры, необходимые для обработки входящих значений, _preview_filter() – это фильтр. Он просто принимает get_option() или get_theme_mod() , get_theme_mod() , когда они должны быть изменены, и вместо этого возвращает измененные значения.

Вы заметите, что когда вы нажимаете ссылку в окне предварительного просмотра настраиваемого, запрос, который сгенерирован, является POST запросом вместо обычного GET . Настраиваемый интерфейс, по-видимому, перекрывает любые клики по ссылкам и делает POST вместо следующих данных формы:

 wp_customize: on theme: themename customized: {json-encoded-options-here} customize_messenger_channel: preview-1 

В настраиваемом поле содержатся параметры, которые вы изменили, так что данные передаются в вашу тему. Затем код настраивателя перехватывает (через фильтр, я не уверен, какой именно) параметры вашей темы, когда они запрашиваются, и заменяет их значениями в настраиваемом параметре.