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

Posted

技术标签:

【中文标题】使用 OOP 插件/小部件和 WP_widget 扩展将 $wpdb 放在哪里【英文标题】:Where to put $wpdb with OOP plugin / widget using and WP_widget extension 【发布时间】:2012-03-04 21:44:06 【问题描述】:

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

我正在尝试做的是插件,它将使用/重用媒体文件夹中的某些图像并将它们显示在侧面小部件中,每个页面,以我喜欢的方式,或在某些页面中使用短代码。 (因此应该适用于帖子\页面和侧边栏小部件)。

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

我决定做的是在 WP 数据库中创建我自己的表,尽管我已经在帖子中读到它可能不需要它:WordPress plugin development using OOP

我在几个领域都在挣扎。首先,我很难找到体面的解释如何创建可以多次使用的小部件。好的,我已经解决了这个问题:

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,我应该把 $wpdb 放在哪里以便在 wp 数据库中创建表

所以,这就是现在,我想我为我的第一个小部件做了一些复杂的事情,但我不会放弃! :)

【问题讨论】:

【参考方案1】:

$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 函数向您网站的主题添加额外的“widget-ready”区域。从WP_Widget 子类化的小部件可以在多个侧边栏上重复使用,无需额外修改。但是,如果您想在特定页面上使用它(即附加到帖子内容),那么小部件确实不是正确的解决方案。

【讨论】:

以上是关于使用 OOP 插件/小部件和 WP_widget 扩展将 $wpdb 放在哪里的主要内容,如果未能解决你的问题,请参考以下文章

带类的Wordpress文本小部件

我在Twitter API上做错了什么?

如何为 WordPress 插件/小部件开发设置 Netbeans 项目

Kendo 小部件和引导输入组插件

使用 Button 小部件在 Tkinter 中正确使用继承

无法在 Qt 设计器(macos)中显示自定义 PyQt5 小部件插件