我正在开发一个有很多主题mod、部分和面板的主题。我的问题是,定制程序一次加载所有这些内容,可能需要一段时间才能加载。此外,我真的很想只加载设置,我目前编辑的页面所需的部分。
我一直在寻找一些过滤器WP_Customize_Manager
但我找不到任何可以修改sections
, panels
, settings
, controls
礼节或使用方法。
此时,我通过将页面id添加到定制器url来获取页面id,类似于wp-admin/customize.php?url=pageurl&apageid=700
基于该页面id,我想注册所需的部分和设置,并删除其余部分。
仅举一个例子,对面板、控件和部分也进行了此操作:
function test_reg( $wp_customize ) {
$currentID = isset( $_GET[\'apageid\'] ) ? absint( $_GET[\'apageid\'] ) : \'\';
// tmpl_ids() returns an ids array of all the pages that use a certain page template
if( in_array( $currentID, tmpl_ids() ) {
$custom_settings = array(
\'custom_setting_\' . $currentID,
);
foreach( $custom_settings as $val ) {
... register the setting here.
}
foreach( $wp_customize->settings() as $setting ) {
if( ! in_array( $setting->id, $custom_settings ) ) {
$wp_customize->remove_setting( $setting->id );
}
}
}
}
add_action( \'customize_register\', \'test_reg\', 999 );
这将删除设置,但对预览器不起作用
customize_preview_settings
, 这将输出所有这些。
不管怎样,你知道怎么做吗?非常感谢。
最合适的回答,由SO网友:Weston Ruter 整理而成
最可靠的方法是根据预览的URL动态地对节、控件和设置进行基于JavaScript的实例化。由于您可以在预览中浏览网站,因此这将确保在浏览网站时根据需要创建特定于帖子/页面的节和控件。这取决于与控件窗格父窗口进行通信的预览,其中包含正在预览的URL(以及查询的帖子ID)。这两个都是在Customize Posts 功能插件,有关预览传递的消息的更多详细信息,请参见#36582.
尽管如此,由于您可能正在寻找一个更静态的PHP解决方案,确保控件窗口和预览窗口都能够看到相同的帖子ID的最简单方法是不要使用自定义查询变量,如apageid
而是使用实际url
参数,用于告知自定义程序要加载到预览中的URL。例如,当您在页面或单篇文章的前端单击“自定义”时url
参数将是永久链接。有了它,您就可以阅读url
参数并将其传递给url_to_postid()
获取帖子ID。
这里还需要另外一件事,那就是实现动态设置。由于设置是基于您是否在给定页面上而在PHP中动态创建的,因此一旦尝试更新或发布变更集,您将看到一条关于无法识别该设置的错误消息。通过实现动态设置,您可以告诉PHP如何根据ID中的模式识别设置并及时注册。
下面是一个完整的工作示例插件,它为最初加载的帖子添加了一个部分,并添加了一个复选框控件,用于指示帖子内容是否应全部大写:https://gist.github.com/westonruter/9e9510c7f57dfbd37eb8c0162b971aa2
你也可以考虑退房Resetting the Customizer to a Blank Slate.