我发现最好的方法是将CSSTidy合并到我的插件中。我从JetPack中获取了一个页面,该页面具有自定义CSS功能。
JetPack的CSSTidy实现作为函数filter\\u attr包含在JetPack\\u Safe\\u CSS类中。我无法完全理解为什么JetPack在解析之前会将用户输入的CSS嵌套在一个“div”元素中,但经过一些尝试和错误后,我了解到CSSTidy并不能真正解析CSS文件。我从JetPack上撕下了代码。
我下载了CSSTidy,创建了一个包含CSSTidy PHP文件的目录。然后我要求上课。csstidy公司。php,并初始化一个新的csstidy对象。将要验证的CSS嵌套在“div”元素中,通过CSSTidy对其进行解析,然后将普通CSS从CSSTidy对象中拉出。到目前为止,已经安装了数千次(尽管我永远不知道有多少用户实际使用了我插件的CSS功能)。
我可能没有注意到这是我最初的问题,但我在寻找最简单、最简单的方法,而不是最技术、最复杂或最强大的方法。我重视尽可能少地修改WordPress体验。这就是为什么我把JetPack视为最接近“源头”的东西。我认为JetPack几乎是标准的,因为它是由Automatic(WordPress本身的开发人员)开发的。我唯一的。。。后悔CSSTidy在2007年被放弃了,所以我想我需要在某个时候找到另一个解决方案。
require_once( \'csstidy/class.csstidy.php\' );
$csstidy = new csstidy();
$csstidy->set_cfg( \'remove_bslash\', FALSE );
$csstidy->set_cfg( \'compress_colors\', FALSE );
$csstidy->set_cfg( \'compress_font-weight\', FALSE );
$csstidy->set_cfg( \'discard_invalid_properties\', TRUE );
$csstidy->set_cfg( \'merge_selectors\', FALSE );
$csstidy->set_cfg( \'remove_last_;\', FALSE );
$csstidy->set_cfg( \'css_level\', \'CSS3.0\' );
$csstovalidateindiv = \'div {\' . $csstovalidate . \'}\';
$csstovalidateindiv = preg_replace( \'/\\\\\\\\([0-9a-fA-F]{4})/\', \'\\\\\\\\\\\\\\\\$1\', $csstovalidateindiv );
$csstovalidateindiv = wp_kses_split( $csstovalidateindiv, array(), array() );
$csstidy->parse( $csstovalidateindiv );
$csstovalidateindiv = $csstidy->print->plain();
$csstovalidateindiv = str_replace( array( "\\n", "\\r", "\\t" ), \'\', $csstovalidateindiv );
preg_match( "/^div\\s*{(.*)}\\s*$/", $csstovalidateindiv, $matches );
if ( !empty( $matches[1] ) ) $cssvalidated = $matches[1];
(代码或未发生)