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

16

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

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

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

Alex
источник

Ответы:

9

Здесь есть несколько битов, которые применимы, но суть в следующем 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 предотвращает фактическую работу ссылок. Следующий код затем отправляет сообщение обратно вверх, сообщая ему: а) прокрутить назад до верхней части страницы и б) изменить URL.

Причина сообщения здесь в том, что существует не один iframe, а два. Страница, по которой вы щелкнули, на самом деле загружается внутри другого iframe с добавленными в него настройками из настройщика (с помощью POSTдействительно), затем используется эффект постепенного исчезновения, чтобы плавно исчезнуть старый и новый. Это предотвращает появление белого, уродливого и мигающего экрана при переключении на новую страницу.

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

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

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

эфирное масло
источник
1

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

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

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

Энди Адамс
источник
2
Взгляните сюда: /wp-includes/class-wp-customize-manager.php...
brasofilo