你的问题与apply_filters
, 这是一个基本的PHP错误:
public function init (){
$filter_fields = apply_filters(\'tbg_reg_fields\', $this->fields);
}
在这里,您将在init方法作用域中创建一个名为
$filter_fields
, 那就永远不要使用它。
$this->filter_fields
和$filter_fields
都不一样。
此外,由于使用了过滤器并提前存储了完整格式的HTML,因此不可能延迟转义,从而导致安全问题。
因此,取而代之的是:
<h4>Register as a New Store Owner</h4>
<form method="post" class="tbg_reg_form" action="\' . admin_url( \'admin-ajax.php\' ) . \'">
<?php echo $form_fields; ?>
<input type="hidden" name="action" value="tbg_form_submit">
<input type="submit" value="Start Selling Now">
</form>
使用
do_action
, 像这样:
<h4>Register as a New Store Owner</h4>
<form method="post" class="tbg_reg_form" action="\' . admin_url( \'admin-ajax.php\' ) . \'">
<?php do_action( \'tbg_reg_fields\', $this->fields ); ?>
<input type="hidden" name="action" value="tbg_form_submit">
<input type="submit" value="Start Selling Now">
</form>
这样做:
您可以直接输出HTML,该操作仅在生成代码时运行,与原始操作不同,原始操作即使在页面上没有快捷码时也会运行,您可以转义输出它们的函数中的字段init
方法和filter\\u fields变量可以完全消除进一步的一般代码质量说明:
您正在使用array( $this, \'....
改用PHP 5.3+短数组语法[ $this, \'...
相反,无法加载class-registration-form.php
如果不创建该类,就不可能创建单元测试,因此没有理由将其作为一个类,整个过程可以简化为一个名为create_reg_form
, 将fields数组移动到该函数中,并调用add_shortcode
在init
钩该类不提供任何内容,它不是面向对象的,并且使代码更加复杂,而不是更少,而且您只有一个实例,因此创建对象是浪费内存admin-ajax.php
适用于非常旧的AJAX处理程序!不要滥用它作为表单处理程序!离开action
空白,然后检查$_POST
在…上init
检查您的表格是否已提交并在那里处理。不要滥用admin-ajax.php
因为它从来就不是故意的。if ( !empty( $_POST[\'action\'] ) && $_POST[\'action\'] === \'tbg_form_submit\' )
在init
行动已经足够了