如何删除Contact Form 7中的包装器?

13 浏览
0 Comments

如何删除Contact Form 7中的包装器?

我在我的WordPress主题中使用Contact Form 7

目前它返回的是标签:

但是我只需要标签:

如何去掉标签的包装?

0
0 Comments

问题原因:在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标签的使用方式,可以保留插件的所有功能同时消除最烦人的硬编码之一。

0
0 Comments

问题原因:使用正则表达式(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()]" );

0
0 Comments

问题原因:在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使用了这个被移除的标签作为目标容器来添加错误消息的标签。由于标签不存在,所以不知道在哪里添加错误消息的标签。

所以,是否有已知的解决方案,可以使用这个正则表达式正确地添加错误消息的标签呢?

大家有人找到解决错误标签也被移除的问题的方法吗?

0