4

我是 wordpress 小部件开发的新手,并在旅途中从tutsplus 视频中学习。我正在尝试为我的网站创建一个简单的小部件。到目前为止,我正在关注视频中的每一个步骤,但仍然出现以下错误,并且表单没有保存值。

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 函数。基本上我的目的是在表单上的信息呈现的小部件上显示一个按钮。当有人单击该按钮时,它应该显示带有消息的叠加层。

4

4 回答 4

2

在下面的代码中

add_action('widgets_init','appRegisterWidget');
function appRegisterWidget()
{
    register_widget('appSidebarWidget'); <--
}

将其更改为

register_widget('SidebarWidget');

text box在小部件设置表单中添加了一个 url,它正在工作,(下面给出了完整的修改代码)

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');
}

下面给出的工作示例的屏幕截图

在此处输入图像描述

于 2013-07-18T17:37:43.180 回答
0

WP_Widgets 对象正在调用 form() 函数。

于 2014-07-09T06:46:45.590 回答
0

代码崩溃,因为变量$instance不是数组。该extract()函数必须接收一个数组才能完成它的工作。这很清楚,也很简单。

$instance问题是除非您提供调用该form()函数的代码,否则没有人可以帮助您解释为什么为 null。可能有一百万个为什么$instance不是数组的原因。

于 2013-07-17T21:01:55.813 回答
0

$instance如果您有一个空的更新函数,那么在表单方法中也可以始终为空。这可能与此问题无关,但如果您遇到类似问题,请检查这是否是问题。

于 2016-07-24T17:37:28.427 回答