钩住WordPress主题定制器保存操作

钩住WordPress主题定制器保存操作,wordpress,themes,Wordpress,Themes,我面临以下问题: 我曾经在一个主题选项页面中保留所有样式。当用户单击save按钮时,我有一个后端脚本,该脚本生成了一个带有更改的css文件,这样它们就不会在每个页面中内联输出。这有很多好处,其中包括缓存 我已经切换到主题定制器,一切都很好,除了我找不到一个方法挂到“保存”按钮。我想触发一个函数,在后端单击该按钮时更新css文件的内容 这可能吗 谢谢 未测试,但中有动作挂钩自定义保存 它位于save()函数中: /** * Switch the theme and trigger the sav

我面临以下问题:

我曾经在一个主题选项页面中保留所有样式。当用户单击save按钮时,我有一个后端脚本,该脚本生成了一个带有更改的css文件,这样它们就不会在每个页面中内联输出。这有很多好处,其中包括缓存

我已经切换到主题定制器,一切都很好,除了我找不到一个方法挂到“保存”按钮。我想触发一个函数,在后端单击该按钮时更新css文件的内容

这可能吗


谢谢

未测试,但中有动作挂钩
自定义保存

它位于
save()
函数中:

/**
 * Switch the theme and trigger the save action of each setting.
 *
 * @since 3.4.0
 */

此文件中还有一些其他有趣的操作挂钩(
dou action
),可能值得检查。

我也面临同样的情况。在保存选项之前,customize_save会起作用,所以这就结束了。我已经发电子邮件给奥托(ottodestruct.com)询问此事

我现在的解决办法如下:

add_action('customize_save', 'regenCSS', 100);
function regenCSS( $wp_customize ) {
    checkCSSRegen(); // Checks if I need to regen and does so
    set_theme_mod('regen-css', time()+3); // Waits 3 seconds until everything is saved
}
function checkCSSRegen() {
    if (get_theme_mod('regen-css') != "" && get_theme_mod('regen-css') < time()) {
        makecss();
        remove_theme_mod('regen-css');
    }
}
add_action('customize_save','regenCSS',100);
函数(wp\u自定义){
checkCSSRegen();//检查是否需要重新生成并执行此操作
set_theme_mod('regen-css',time()+3);//等待3秒,直到所有内容都被保存
}
函数checkCSSRegen(){
if(get_theme_mod('regen-css')!=“”&get_theme_mod('regen-css')
我还添加了一个额外的checkCSSRegen();自定义_控件_初始化函数

同样,这是一个有点黑客。不幸的是,这是我当时能找到的最好的办法

另一种选择是使用ajax响应,只ping一个php文件。这感觉比这更像是一种黑客行为

另一个快速攻击是执行javascript操作,当单击save按钮时,它会设置一个计时器来延迟对运行编译的PHP文件的调用。这对我来说很难理解

上述方法的唯一缺点是,除非重新加载自定义程序或保存其他值,否则可能无法获得所需的所有值

还有谁有更好的主意吗

**更新** 刚刚向Wordpress团队添加了以下请求。希望我们能把它挤进去

*更新2*
看起来它将在3.6版本中作为“自定义”保存。猜一猜,即使在Wordpress团队中,一些推文和示例代码也能让事情发生

正如@Dovy所描述的,您现在可以钩住
自定义\u保存\u

do_action('customize_save_after', 'savesettings', 99);
savesettings
将设置保存到文件时,使用本机php文件函数(如
file\u put\u contents()
)执行此操作将是不好的做法,如下所述:@otto

文件保存的解决方案是使用wp_文件系统。要使用wp_文件系统,您需要用户的文件凭据(ftp)

AJAX请求中将调用
customize\u save\u after
,结果将不可见。AJAX句柄的原因您不能要求用户提供需要表单提交的文件凭据


可以通过将文件凭据保存到wp-config.php并将它们(临时)添加到数据库中来找到解决方案。执行此操作
savesettings
可以从数据库中读取凭据,并使用凭据保存文件。(此解决方案在此处有更详细的描述:)

自WordPress 3.6.0以来,您现在可以在
之后调用
自定义保存

<?php
function emailAdmin(){
    mail('your@email', 'Woza!', 'You won\'t believe this but someone has updated the theme customizations!!');
}
add_action( 'customize_save_after', 'emailAdmin' );
?>


更多信息:

因此,在主题定制器中,您可以执行以下操作:do_action('generate_css','customize_save_after',99);--这看起来准确吗?注意:如果您有一个专用的mySQL服务器,这将无法直接工作,因为DB服务器尚未处理这些请求。我在check方法中使用了sleep(1)作为第一个函数,因此您可以确定,在DB继续他的其他请求之后,这将起作用。只有当您有一个完全专用的DB服务器,并且这些方法似乎不起作用时,才需要此工作区。使用此挂钩时,页面不会保存数据。我看到load admin-ajax.php出现错误。这是什么问题?我使用这个钩子来
获取控件的值,但它不返回任何值。怎么了?我试着用这个钩子来获取设置控件的值,以减少对CSS的编译。我使用GetTheme mod来获取它,但编译时它总是返回值0。怎么了?使用此挂钩时,页面不保存数据。我看到load admin-ajax.php出现错误。那是什么问题?