我是新手wordpress小部件开发和学习tutsplus videos。我正在尝试为我的网站创建一个简单的小部件。到目前为止,我正在关注视频中的每个步骤,但我仍然遇到以下错误,表单没有保存值。
Warning: extract() expects parameter 1 to be array, null given in C:\Program Files\Ampps\www\test\wp-content\plugins\first\index.php on line 50
这是from方法
public function form($instance){
extract($instance);
?>
<p>
<lable for="<?php echo $this->get_field_id('ap_title_text');?>">Title Text: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_title_text');?>" name="<?php echo $this->get_field_name('ap_title_text');?>" value="<?php if(isset($ap_title_text)) echo esc_attr($ap_title_text);?>" />
</p>
<?php
到目前为止,我刚刚创建了构造函数并注册了小部件。直到视频中的此步骤才显示错误。我搜索这个问题的每个网站都显示了类似的步骤。我不明白为什么它在我的系统上出现错误。
我正在使用昨天下载的wordpress 3.5.2并使用php5.3。
编辑:: 这是代码。
class SidebarWidget extends WP_Widget{
function __construct()
{
$options = array(
'description' => 'Simplest way to start working from any page',
'name' => 'Sidebar Widget'
);
parent::__construct('appSidebarWidget', '', $options);
}
public function form($instance)
{
extract($instance);
?>
<p>
<label for="<?php echo $this->get_field_id('ap_title_text'); ?>" >Title Text: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_title_text');?>" name="<?php echo $this->get_field_name('ap_title_text');?>" value="<?php if(isset($ap_title_text)) echo esc_attr($ap_title_text);?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('ap_app_name'); ?>" >app Name: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_app_name');?>" name="<?php echo $this->get_field_name('ap_app_name');?>" value="<?php if(isset($ap_app_name)) echo esc_attr($ap_app_name);?>" />
</p>
<?php
}
public function widget($args, $instance)
{
extract($args);
extract($instance);
$display_gadget = "<iframe src='http://$appURL' width='150px' height='200px' scrolling='auto' frameborder='0' allowtransparency='true'></iframe>";
if(empty($ap_title_text)){$ap_title_text = "Schedule Now";}
echo $before_widget;
echo $before_title.$ap_title_text.$after_title;
echo $display_gadget;
echo $after_widget;
}
}
add_action('widgets_init','appRegisterWidget');
function appRegisterWidget()
{
register_widget('appSidebarWidget');
}
我仍然无法让它发挥作用。然而,我正在学习的实际项目,按预期工作。我仍然想知道这个有什么问题。因此,我几乎失去了工作。
此外,任何人都可以指导我从显示的小部件上的按钮调用自定义javascript函数。基本上我的目的是在窗体上显示由窗体上的信息呈现的按钮。当有人点击按钮时,它应显示带消息的叠加层。
答案 0 :(得分:2)
在以下代码中
add_action('widgets_init','appRegisterWidget');
function appRegisterWidget()
{
register_widget('appSidebarWidget'); <--
}
将其更改为
register_widget('SidebarWidget');
我在小部件设置表单中添加了一个网址text box
并且它正常工作,(下面给出完整修改后的代码)
class SidebarWidget extends WP_Widget{
function __construct()
{
$options = array(
'description' => 'Simplest way to start working from any page',
'name' => 'Sidebar Widget'
);
parent::__construct('appSidebarWidget', '', $options);
}
public function form($instance)
{
extract($instance);
?>
<p>
<label for="<?php echo $this->get_field_id('ap_title_text'); ?>" >Title Text: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_title_text');?>" name="<?php echo $this->get_field_name('ap_title_text');?>" value="<?php if(isset($ap_title_text)) echo esc_attr($ap_title_text);?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('ap_app_name'); ?>" >App Name: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_app_name');?>" name="<?php echo $this->get_field_name('ap_app_name');?>" value="<?php if(isset($ap_app_name)) echo esc_attr($ap_app_name);?>" />
</p>
<!-- New text box added -->
<p>
<label for="<?php echo $this->get_field_id('ap_app_url'); ?>" >App Url: </lable>
<input type="text" class="widefat" id="<?php echo $this->get_field_id('ap_app_url');?>" name="<?php echo $this->get_field_name('ap_app_url');?>" value="<?php if(isset($ap_app_url)) echo esc_attr($ap_app_url);?>" />
</p>
<?php
}
public function widget($args, $instance)
{
extract($args);
extract($instance);
$display_gadget = "<iframe src='http://" . $ap_app_url . "' width='150px' height='200px' scrolling='auto' frameborder='0' allowtransparency='true'></iframe>";
if(empty($ap_title_text)){$ap_title_text = "Schedule Now";}
echo $before_widget;
echo $before_title.$ap_title_text.$after_title;
echo $display_gadget;
echo $after_widget;
}
}
add_action('widgets_init','appRegisterWidget');
function appRegisterWidget()
{
register_widget('SidebarWidget');
}
答案 1 :(得分:0)
代码崩溃,因为变量$instance
不是数组。 extract()
函数必须接收一个数组才能完成它的工作。这很清楚也很简单。
问题是除非您提供调用$instance
函数的代码,否则没有人可以帮助您解释为什么form()
为null。 $instance
不是数组可能有一百万个原因。
答案 2 :(得分:0)
WP_Widgets对象正在调用form()函数。
答案 3 :(得分:0)
$instance
在表单方法中也可能始终为null。这可能与此问题无关,但如果您遇到类似问题,请检查是否存在问题。