如何删除Contact Form 7中的包装器?
问题原因:在Contact Form 7插件的版本4.9中,表单提交的代码是非常硬编码的,不允许用户自由地控制HTML结构。因此,如果想要完全自由地控制HTML结构,需要修改插件中的代码,这样会导致在插件更新时被覆盖。
解决方法:可以使用以下方法来移除Contact Form 7中的span包装器。
首先,在CMS的编辑器中,将输入字段和其他要分组的元素进行包装,例如:
{field codes, etc, here}
请注意,需要使用"class="wpcf7-form-control-wrap""和与字段名称匹配的class。
接下来,在functions.php
文件中使用以下正则表达式代码。可能需要根据实际需求进行调整。
add_filter('wpcf7_form_elements', function($content) { preg_match_all('/<(span).*?class="\s*(?:.*\s)?wpcf7-form-control-wrap(?:\s[^"]+)?\s*"[^>]*>(.*?)<\/\1>/i', $content,$matches); foreach($matches[2] as $match): $content = str_replace(trim($match),trim(preg_replace('/<(span).*?class="\s*(?:.*\s)?wpcf7-form-control-wrap(?:\s[^"]+)?\s*"[^>]*>(.*?)<\/\1>/i', '\2', $match)),$content); endforeach; return $content; });
这将删除输入字段周围的span标签,同时保留您新的span标签。实际效果是将span标签从仅包围输入字段移动到您希望包装的任何元素周围。
以上就是解决方法。通过这种方法,您可以保留插件的所有功能,同时消除插件中最烦人的硬编码之一。
如果想要完全自由地控制HTML结构,还可以选择以下两种方法,但这些方法会涉及到重复插件已经为您完成的工作:
1. 修改rest-api.php文件中大约在第295行附近的代码,将"into"的值更改为不那么具体的值。然而,这不是一个推荐的方法,因为在插件更新时会被覆盖。
foreach ( (array) $result['invalid_fields'] as $name => $field ) { $invalid_fields[] = array( 'into' => 'span.wpcf7-form-control-wrap.' . sanitize_html_class( $name ), 'message' => $field['reason'], 'idref' => $field['idref'], ); }
2. 使用wpcf7:invalid事件,并在结果上运行自己的验证代码。然而,这将重复插件已经为您完成的大部分工作。
通过保留带有"wpcf7-form-control-wrap"类的span标签的使用方式,可以保留插件的所有功能同时消除最烦人的硬编码之一。
问题原因:使用正则表达式(Regex)修改HTML/remove标签等不是正确的方法。
解决方法:使用DOMDocument类来解析HTML并移除span标签。
具体代码如下:
add_filter('wpcf7_form_elements', function( $content ) { $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $xpath = new DomXPath($dom); $spans = $xpath->query("//span[contains(, 'wpcf7-form-control-wrap')]" ); foreach ( $spans as $span ) : $children = $span->firstChild; $span->parentNode->replaceChild( $children, $span ); endforeach; return $dom->saveHTML(); });
补充说明:如果想要继续支持Honeypot for Contact Form 7,需要修改第7行代码如下:
$spans = $xpath->query( "//span[contains(, 'wpcf7-form-control-wrap') and not()]" );
问题原因:在Contact Form 7中,使用了标签来包装表单元素,但是有些用户希望移除这个标签。
解决方法:通过使用wpcf7_form_elements过滤器和正则表达式来移除标签。可以将以下代码复制粘贴到functions.php文件中,并确保PHP版本大于5.3。
add_filter('wpcf7_form_elements', function($content) { $content = preg_replace('/<(span).*?class="\s*(?:.*\s)?wpcf7-form-control-wrap(?:\s[^"]+)?\s*"[^>]*>(.*?)<\/\1>/i', '\2', $content); return $content; });
但是这种方法会导致错误消息也被移除,原因是在WPCF7中的JS使用了这个被移除的标签作为目标容器来添加错误消息的标签。由于标签不存在,所以不知道在哪里添加错误消息的标签。
所以,是否有已知的解决方案,可以使用这个正则表达式正确地添加错误消息的标签呢?
大家有人找到解决错误标签也被移除的问题的方法吗?