首先,我可以说为什么你的代码不起作用。
自定义css是在widget
WordPress在小部件显示时调用的函数。
我想,您在文档上已经准备好发送一个ajax请求advanced_widget_pack_css()
作用但每个ajax请求都是一个全新的http请求,唯一的作用域是运行一个函数,当然不是嵌入小部件。
因此,通过ajax的新请求从不调用widget()
方法,因此当然不会添加css。
说了这些,想一分钟你在做什么。
假设您的工作流可以工作,如果用户没有启用js,它就会失败。即使启用了js,页面也会加载自定义css,这些css应该根据ajax请求加载(而WordPress中的ajax速度不是很快……)因此:
如果没有js也没有css,那么即使js页面加载时没有css,那么您也有一个或多个未设计的小部件,浏览器不允许缓存css,因此您的代码无法工作(我解释了yopu的原因),但即使您找到了使其工作的方法,也不是一个很好的解决方案。
什么是解决方案?
首先,在小部件中隔离生成自定义css的函数。
之后,您应该调用widget()
方法,但在update
方法这样,每次小部件更新时都会生成css,and you can save the newly generated css to store it in a css file.
作为一种好的做法,最好将此文件保存在uploads文件夹中,因为您可以确定该文件夹可以从WP写入。
伪代码:
class Advanced_Widget_Pack_Widget_Archives extends WP_Widget {
function generate_css( $instance ) {
// some code here to generate css from instance arguments...
return $sc_css;
}
function update( $new_instance, $old_instance ) {
// some code here to update the widget instance...
$css = $this->generate_css( $new_instance );
$upload_dir = wp_upload_dir();
$path = $upload_dir[\'basedir\'] . \'/myplugin/myplugin-customwidget.css\';
if ( ! file_exists($upload_dir[\'basedir\'] . \'/myplugin\') )
mkdir($upload_dir[\'basedir\'] . \'/myplugin\');
file_put_contents($path, $css);
}
}
之后,您可以使用WordPress标准方式将刚刚创建的文件排队。。。
此方法的替代方法是在widget()
方法(正如您已经做的那样),并在标记中作为内联样式输出。