函数comment_form() 的不可自定义部分应该(理想情况下)仅限于对安全性和 WordPress 核心正确处理表单至关重要的代码。然而,事实并非如此。为了探索这个问题,我使用过滤器(可以使用参数)来完全删除所有可定制的代码。我将所有可用的变量都设置为空字符串——也就是说,comment_form() 的 codex 页面上提到的所有内容。
这是来自comment_form() 的剩余不可自定义代码:
<div id="respond" class="comment-respond">
<h3 id="reply-title" class="comment-reply-title"> <small><a rel="nofollow" id="cancel-comment-reply-link" href="/1#respond" style="display:none;">Click here to cancel reply.</a></small></h3>
<form action="http://www.[yourdomain].com/wp-comments-post.php" method="post" id="" class="comment-form">
<p class="form-submit">
<input name="submit" type="submit" id="" value="" />
<input type='hidden' name='comment_post_ID' value='1' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p>
</form>
</div><!-- #respond -->
这一切从何而来?在comment_form() 的法典页面底部写着……
源代码
comment_form() 位于 wp-includes/comment-template.php。
comment-template.php 已链接,您可以在浏览器中查看完整代码。 comment_form() 从第 1960 行开始。事实上,它是该文件中的最后一个函数。没有参数或过滤器可让您修改上面的残留代码。这些代码行几乎都是“硬编码”的。
文本单击此处取消回复。 是唯一在我的过滤器种族灭绝中幸存下来的文本。奇怪的是,comment_form() 将cancel_reply_link 的备份文本硬编码到函数中,以防它作为空字符串传递给函数。其他可过滤项目都没有硬编码备份。
很容易看出哪些代码是必要的,哪些代码对于 HTML 表单是非必要的。更难判断的是哪些位对于 WordPress 表单是必不可少的。上面的一些位是动态输出的(注意这是开发博客上的第一条评论,没有其他回复,没有父/子 cmets)。
从comment-template.php 中的comment_form() 函数,您可以提取生成WordPress 表单的动态部分所需的代码。然后,使用从 comment_form() 的 codex 页面获取的默认参数,您可以拼凑出一个准系统表单,硬编码所需的字段、标签和包装 HTML。我现在正在这样做,并将我的自定义表单函数放在我的主题的 comments.php 模板文件中,我只在 single.php 中使用 comments_template() 调用它(对于这个特定的主题)。
结果将是一个完整、适当、精简和平均的 WordPress 评论表单。但是......这将是一个无法再使用comment_form() 参数或相关过滤器自定义的表单,除非您继续并将过滤器代码包含在您自己的评论表单函数中。由于您已经在自定义它,这可能不是问题。同样,您或任何其他插件也将无法使用所有 WordPress 操作,除非您还在自己的评论表单功能中触发了这些操作功能。同样,此时可能对您来说不是问题。
但最重要的是,如果未来的 WordPress 更新改变了核心处理表单的方式,生成的表单可能会破坏您的主题。
如果您意识到这些风险,您可以通过复制codex page for comment_form() 和wp-includes/comment-template.php 上的代码来重新构建一个手工编码的评论表单。我没有完成的代码,否则我会发布它。但我会在/如果我成功时发布。
好的,这就是我现在的全部内容。请记住(所有读者),尽管外表,我是一名业余 WordPress 主题开发人员,我对 PHP 和 WordPress 的熟练程度非常初级。刚写完这篇文章,我学到了很多。
我还担心某个地方已经有一个完整且适当的解决方案,但我在搜索中没有找到它。