使用和WP_widget扩展将$wpdb与OOP插件/小部件放在哪里


Where to put $wpdb with OOP plugin / widget using and WP_widget extension

我是插件和WP开发的新手,所以我需要一些帮助。

我想做的是一个插件,它可以使用/重用媒体文件夹中的某些图像,并以我喜欢的方式在某个页面的侧边小部件中显示它们,或者在某个网页中使用短代码。(因此应该同时适用于posts''pages和侧边栏小部件)。

它应该在许多页面上多次使用。

我决定在WP数据库中创建自己的表,尽管我在帖子中读到这可能不需要:使用OOP 开发WordPress插件

我在好几块地上挣扎。首先,我很难找到合适的解释来创建可以多次使用的小部件。好的,我已经用解决了这个问题

class FeatDispWidget extends WP_Widget {...}

例如,它确实有效,我可以有多个实例,数据保存在wp_options中。

现在,我正在尝试使用$wpdb。从我看到的所有可能的例子中,我必须使用全局$wpdb或包含一些php文件,或者用我自己的DB类扩展wpdb,但OOP方法中最好/正确的方法是什么?

这是我的代码、构造函数和尝试调用db函数的一部分,它总是给我错误。

class FeatDispWidget extends WP_Widget {
     private $featdisplayer_table;
     $featdisplayer_table = $wpdb->prefix . 'featdisplayer';

/**
 * Widget setup.
 */
function FeatDispWidget() {
    /* Widget settings. */
    $widget_ops = array( 'classname' => 'featdisp', 'description' => __('Sexy Feature Displayer.', 'featdisp') );
    /* Widget control settings. */
    $control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'featdisp-widget' );
    /* Create the widget. */
    $this->WP_Widget( 'featdisp-widget', __('Feature Displayer Widget', 'featdisp'), $widget_ops, $control_ops );
}


    function featDispDBsetup (){
        global $wpdb;
        global $featdisplayer_table;

        if ( $wpdb->get_var( "show tables like '$featdisplayer_table'" ) != $featdisplayer_table ) {
    $sql = "CREATE TABLE $featdisplayer_table (".
        "sandf_id INT NOT NULL AUTO_INCREMENT, ".
        "type VARCHAR( 30 ) NOT NULL, ".
        "attachid INT NOT NULL, ".
        "setid INT NOT NULL, ".
        "imgpath LONGTEXT NOT NULL, ".
                    "title LONGTEXT NOT NULL, ".
        "desc LONGTEXT, ".
                    "linkto LONGTEXT, ".
                    "altertext LONGTEXT, ".
                    "txtnxttoimg LONGTEXT, ".
                    "sortorder INT, ".
        ")";
            require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
        }
    }

所以我的问题是:

1) 我可以像我一样扩展WP_widget,并在页面和侧边栏上显示它吗?2) 我是否需要扩展WP_widget以使小部件实例化多次(每页一次)3) 如果我扩展了WP_widget,为了在WP数据库中创建表,我应该把$wpdb放在哪里

所以,现在就这样了,我想我的第一个小部件需要一些复杂的东西,但我不会放弃!:)

$wpdb只是Wordpress数据库包装器的全局实例的名称。最好的办法可能是在构造函数中设置表名,并将对全局数据库对象的引用作为类参数,例如:

class FeatDispWidget extends WP_Widget {
  private 
    $featdisplayer_table,
    $wpdb;
  public function __construct() {
    global $wpdb;
    $this->wpdb = &$wpdb;
    $this->featdisplayer_table = $this->wpdb->prefix . 'featdisplayer';
  }
  // .. the rest of your widget goes here
}

然后,您可以继续在其他类方法中引用$this->wpdb

至于您的其他问题,您可以使用register_sidebardynamic_sidebar功能将其他"小部件就绪"区域添加到网站的主题中。从WP_Widget细分的小部件可以在多个边条上重复使用,而无需额外修改。然而,如果你想在特定的页面上使用它(即,附加到帖子内容),小部件确实不是正确的解决方案。