挂钩进入WordPress主题定制器保存操作

时间:2013-02-10 20:26:32

标签: wordpress themes

我面临以下问题:

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

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

这甚至可能吗?

谢谢!

4 个答案:

答案 0 :(得分:7)

自WordPress 3.6.0起,您现在可以调用customize_save_after

<?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' );
?>

更多信息:http://developer.wordpress.org/reference/hooks/customize_save_after/

答案 1 :(得分:5)

我面临同样的情况。 customize_save在保存选项之前工作,所以这样就完成了。我已经通过电子邮件向Otto(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');
    }
}

我还添加了一个额外的checkCSSRegen();到我的customize_controls_init函数。

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

另一个选择是使用ajax响应只是ping一个php文件。这感觉更糟糕了。

另一个快速的黑客行为是做一个javascript动作,当点击保存按钮时,它会设置一个计时器来延迟调用运行编译的PHP文件。这对我来说非常黑客。

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

其他人有更好的主意吗?

**更新** 刚刚将以下请求添加到Wordpress团队。希望我们能把它挤进那里。

http://wordpress.org/ideas/topic/do-customize_save-action-hook-after-the-settings-are-saved?replies=3#post-24853

*更新2 * 看起来它将作为customize_save_after出现在3.6版本中。猜猜一些推文和示例代码即使使用Wordpress团队也能让事情发生。 ;)

答案 2 :(得分:4)

正如@Dovy已经描述的那样,您现在可以挂钩customize_save_after来执行此操作:

do_action('customize_save_after', 'savesettings', 99);

savesettings将设置保存到文件时,使用本机php文件函数(如file_put_contents())执行此操作将是不好的做法,如下所述:http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ @otto。

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

将在AJAX请求中调用

customize_save_after,结果将不可见。 AJAX句柄的原因是你不能要求用户提供需要表单提交的文件凭证。

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

答案 3 :(得分:0)

未经过测试,但/wp-includes/class-wp-customize-manager.php中有动作挂钩 customize_save

它位于save()函数内:

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

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