7

我面临以下问题:

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

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

这甚至可能吗?

谢谢 !

4

4 回答 4

12

从 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/

于 2014-07-21T14:22:11.307 回答
5

我面临同样的情况。custom_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 函数。

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

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

另一个快速的技巧是执行一个 javascript 操作,当单击保存按钮时,它会设置一个计时器来延迟对运行编译的 PHP 文件的调用。这对我来说非常 hacky。

上述唯一的后备方案是,除非重新加载定制器或保存其他值,否则您可能无法获得所需的所有值。

还有人有更好的主意吗?

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

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

* 更新 2 * 看起来它将在 3.6 版本中作为 customize_save_after。猜猜几条推文和示例代码甚至可以在 Wordpress 团队中实现。;)

于 2013-05-21T21:32:41.043 回答
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/ by @otto。

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

customize_save_after将在 AJAX 请求中调用,结果将不可见。AJAX 句柄的原因,您不能向用户询问需要提交表单的文件凭据。

可以通过将文件凭据保存到 wp-config.php 并将它们(临时)添加到数据库来找到解决方案。这样做savesettings可以从数据库中读取凭据,并使用它们通过凭据来保存文件。(这里更详细地描述了这个解决方案:https ://wordpress.stackexchange.com/a/126631/31759 )

于 2013-12-27T14:42:30.990 回答
0

customize_save未测试,但/wp-includes/class-wp-customize-manager.php.

它在save()函数内部:

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

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

于 2013-02-11T03:15:22.023 回答