如何从侧栏小部件处理表单-使用get_field_name()处理$_POST变量

时间:2012-04-06 作者:Exit

由于Wordpress将他们的内容称为“帖子”,因此很难找到关于处理按照POST协议提交的表单的信息。我的问题很简单,对于经验丰富的Wordpress开发人员来说,答案应该很简单。

使用在类的widget方法中具有表单的Wordpress插件,我使用Wordpress get\\u field\\u name函数命名变量。我找不到相应的函数来确定要处理的$\\u POST变量。我可以勉强找到一个解决方案,但我想专门为此使用Wordpress框架。

我需要维护类变量结构,这样这个小部件的多个实例就不会有变量重叠。我可以简单地设置名称并使用args中的widget\\u id,但这似乎不是保持在框架内的正确方法。

To clarify further, the widget delivers a form for the user side, not the admin side.

示例:

class someWidget extends WP_Widget {
 public function someWidget() {
  $this->WP_Widget(\'somewidget\', __(\'Some Widget\'));
 }

 public function form($instance) {
 }

 public function update( $new_instance, $old_instance ) {
  $instance = $old_instance;
  return $instance;
 }

 public function widget($args, $instance) {
  $before_title = $before_widget = $after_widget = $after_title = \'\';
  extract($args, EXTR_IF_EXISTS);
  echo $before_widget.$before_title.$instance[\'WidgetTitle\'].$after_title;

  $somewidget_variable = $_POST[\'????\']; // < -- What function retreives the variable?
  if ($somewidget_variable) {
   // amazing stuff
  }
?>
<form method="POST">
<input id="<?php echo $this->get_field_id(\'somewidget_variable\');?>" name="<?php echo $this->get_field_name(\'somewidget_variable\');?>" type="text" value="<?php echo $somewidget_variable;?>" />
<input type="submit" />
</form>
<?php
echo $after_widget;
 }
}

2 个回复
最合适的回答,由SO网友:Exit 整理而成

好的,我已经查看了get\\u field\\u name()的函数描述,它说这个函数是专门设计用于Widget类的form方法的。我发现除了form()方法外,Wordpress代码没有任何用处。

/**
 * Constructs name attributes for use in form() fields
 *
 * This function should be used in form() methods to create name attributes for fields to be saved by update()
 *
 * @param string $field_name Field name
 * @return string Name attribute for $field_name
 */
function get_field_name($field_name) {
    return \'widget-\' . $this->id_base . \'[\' . $this->number . \'][\' . $field_name . \']\';
}
从实际代码来看,它是将小部件中的变量串联在一起,因此从技术上讲,您可以使用此函数创建字段,但它不适合框架。最好只创建自己的字段名并使用小部件ID进行序列化。

因此,解决方案如下:

class someWidget extends WP_Widget {
 public function someWidget() {
  $this->WP_Widget(\'somewidget\', __(\'Some Widget\'));
 }

 public function form($instance) {
 }

 public function update( $new_instance, $old_instance ) {
  $instance = $old_instance;
  return $instance;
 }

 public function widget($args, $instance) {
  $before_title = $before_widget = $after_widget = $after_title = \'\';
  extract($args, EXTR_IF_EXISTS);
  echo $before_widget.$before_title.$instance[\'WidgetTitle\'].$after_title;

  $somewidget_variable = $_POST[\'somewidget_\'.$this->id];
  if ($somewidget_variable) {
   // amazing stuff
  }
?>
<form method="POST">
<input id="somewidget_<?php echo $this->id;?>" name="somewidget_<?php echo $this->id;?>" type="text" value="<?php echo $somewidget_variable;?>" />
<input type="submit" />
</form>
<?php
echo $after_widget;
 }
}

SO网友:onetrickpony

WP不提供任何用于在前端创建和处理表单的助手方法。

要处理前端表单,只需检查$_POST-ed数据。我建议您在操作中执行此操作,并且仅当小部件处于活动状态时。

在构造函数中-someWidget()方法(应该重命名为__construct, 和电话parent::__construct 而不是WP_Widget), 添加:

$my_widget = $this;

// this action gets to run once only
add_action(\'init\', function() use($my_widget){

  // give up if there isn\'t an instance active of this widget
  if(!is_active_widget(false, false, $my_widget->id_base, true))
    return;

  // get widget options from all instances
  $widget_options = get_option($my_widget->option_name);

  // loop trough options of each instance
  foreach((array)$widget_options as $instance => &$options){

    // identify instance
    $id = "{$my_widget->id_base}-{$instance}";

    // this instance is not active, so skip it
    if(!is_active_widget(false, $id, $my_widget->id_base)) continue;

    // here process your form for this specific widget instance
    if(isset($_POST["some_field-{$id}"])){

      // the $options variable holds the instance options
    }

  }

  // if you need to update the options for all instances...
  update_option($my_widget->option_name, $widget_options);

});
在widget()方法中,使用$this->id 变量获取当前实例的唯一ID,您可以在表单字段名称、ID等中使用该ID。。。

结束

相关推荐

Plugins_url()错误地返回带有www子域的URL

我正在开发一个插件,为了回答这个问题,我们称之为“我的插件”。我的插件目录如下所示:my-plugin/ |- image.jpg |- script.js |- script.php |- plugin.php |- ajax.php 在脚本中。php我有一段代码指定了一些JS。在其中,我需要一个ajax的URL。php。e、 g.:<script type=\"text/javascript\"> foo = jQuer