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

4
我是新手插件开发和WP开发,所以我需要一些帮助。
我的目标是创建插件,该插件将使用/重用媒体文件夹中的某些图像,并以我喜欢的方式在侧边栏小部件上显示它们,针对特定页面或在特定页面内使用短代码(因此应在文章/页面和侧边栏小部件上工作)。
它应该被多次使用,在许多页面上。
我决定在WP数据库中创建自己的表格,即使我已经在这篇文章中读到过,这可能是不需要的:WordPress plugin development using OOP 我遇到了几个问题。首先,我有问题找到如何创建可多次使用的小部件的合理解释。好吧,我已经通过以下方法解决了这个问题:
class FeatDispWidget extends WP_Widget {...}

例子中的方法确实有效,我可以拥有多个实例并将数据保存到wp_options中。

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

这是我的代码部分,构造函数和尝试调用数据库函数总是给我带来错误。

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个回答

12

$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子类化的小部件可以在多个侧边栏上重复使用,无需进行额外的修改。但如果你想在特定页面上使用它(例如,附加到发布内容),那么小部件确实不是正确的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接