新的WP_Customize API-它是如何在后台运行的?


16

我注意到,如果您通过新的“自定义”功能进行更改,则在iframe预览文档中的其他页面上导航时,即使更改尚未保存,更改仍然适用。

看起来WP将临时更改存储在某个位置,并且如果以“自定义”模式查看网站,它将临时更改应用于网站。

但是网站如何知道它处于自定义模式?因为我看不到任何附加在链接上的查询参数或类似内容。

Answers:


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阻止链接实际运行。然后,以下代码向上发送一条消息,告诉它:a)滚动回到页面顶部,然后b)更改URL。

在此处进行消息传递的原因是,不仅有一个iframe,还有两个。您单击到的页面实际上已加载到另一个iframe中,并添加了自定义程序中的设置(POST确实通过),然后使用淡入淡出效果淡出旧页面并无缝淡入新页面。这样可以防止屏幕切换到新页面时变白,变丑和闪烁。

还消除了对主题代码进行过滤等操作的需要,并可能修改页面的外观。因此,该主题按原样显示,而其内容没有重大变化。

那里存在类似的代码,以防止表单提交完全起作用(它什么也不做)等等。

用于拦截和处理定制器值的过滤器在中class-wp-customize-setting.php。该preview()函数添加了处理传入值所需的过滤器,该_preview_filter()函数就是该过滤器。它只接受get_option()or get_theme_mod()调用,在应将其修改为选项时通知,然后返回修改后的值。


1

您会注意到,在定制器预览窗口中单击链接时,生成的POST请求是一个请求,而不是normal 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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.