为插件创建自己的表是不好的做法吗?


11

如果我想为我的插件保存设置,那将非常简单直接。

现在,我想将更多内容保存到数据库。

文件名,以及仅适用于该文件的其他3个值。并且有许多具有这些值的文件。是否可以使用内置的数据库方法保存某种子数组?如何删除它们并对其进行排序?

Answers:


13

我很少不同意其他知识渊博的用户,但是在这种情况下我无能为力。我认为,调用非核心数据库表本身就是不好的做法,这完全是错误的。

选择使用核心表还是添加自己的表取决于几个因素。

查询的执行时间取决于表的大小。因此,如果您打算存储大量数据,那么仅适合这种类型的特定数据集的单独表将不可避免地成为更有效的解决方案。

如果您将大量常规帖子或CPT与这些特定数据集一起存储,wp_posts并且wp_postmeta可以快速增长。

对我来说,这种选择最终取决于数据的“发布”程度。它应该支持作者,评论,修订,摘录或类似内容吗?如果是这样,我将介绍CPT和/或核心功能。如果没有,我将使用单独的表以节省资源并提高效率。

如果Eugene的想法是正确的,那么现有的编写良好的插件都不会添加自己的表,幸运的是事实并非如此。


我不能对此表示赞同。“ 您最喜欢的东西 ”绝对不是一个有效的考虑因素。有使用单独表的有效用例,但对于绝大多数插件,最佳实践要求使用核心WP DB表。
Chip Bennett 2012年

2
颇有说服力@ChipBennett-这不应该是推理的一部分,或者首先不是“推理”的。已编辑并删除(仍然不期望有否决权-rep并不是唯一的动机)。
约翰内斯·皮勒

1
+1。我认为这是一个合理且经过深思熟虑的答案。:)
筹码贝内特2012年

5

最佳实践是使用WP核心数据库表

  1. 使用核心数据库表使您的数据更具可移植性,并且更易于备份,因为它将由核心导出器/导入器以及无数备份插件处理。
  2. 使用核心数据库表使您的数据更容易,更安全地操作,因为您将可以更直观地访问与查询,添加,修改,删除和清理数据库数据有关的各种WordPress核心功能,尤其是通过功能非常强大的$wpdb
  3. 使用核心数据库表可鼓励/促进数据分类和存储的最佳做法,例如将插件选项存储为数组中的单个行中的数组wp_options,并通过迫使插件开发人员仔细考虑正在创建/存储的数据类型-是否是CPT?这是分类法吗?是发布元吗?
  4. 使用核心数据库表时,您的插件不太可能遗留问题

WordPress为插件提供了一种向其数据库添加表的方法

但是,对于那些需要单独的数据库表的用例,请确保使用WordPress提供的用于将自定义表添加到WordPress数据库的方法,尤其是这样,您就可以利用功能强大的$wpdb类。请注意该食典条目列出的信息/说明:

  • 设置信息 -用户首次设置您的插件时输入的用户选择,并且不会超出此范围(例如,在与标签相关的插件中,用户关于标签云格式的选择)侧边栏)。设置信息通常将使用WordPress选项机制存储。

  • 数据 -用户继续使用您的插件时添加的信息,通常是与帖子,类别,上载和其他WordPress组件相关的扩展信息(例如,在与统计相关的插件中,各种页面视图,引荐来源网址以及与您网站上每个帖子相关的其他统计信息)。数据可以存储在一个单独的MySQL表中,该表必须创建。但是,在使用全新表之前,请考虑将插件的数据存储在WordPress的Post Meta(也称为“自定义字段”)中是否可行。Post Meta是首选方法;尽可能/实际使用它。

因此,我们可以得出以下结论:

  1. 最佳做法是在核心WP表中存储数据(设置或用户生成)
  2. 存在用于创建自定义数据库表的有效用例。因此,不能将创建自定义数据库表视为固有的坏习惯
  3. 创建自定义数据库表时,WordPress提供了最佳实践的实现

我可以对此表示赞同。;-) +1明确提及$wpdb(我的回答中暗含了使用非核心表的意思,不想错过那个班级)
Johannes Pille 2012年

2
我最初以为“自己的数据库表”隐含了WP数据库之外的表。一旦我克服了错误假设的僵局,问题(和答案/评论)就会变得更加清晰。:)
筹码贝内特2012年

1

如果您的数据比WordPress帖子模型更复杂,则非核心数据库表是必须的,它将变得非常庞大,并且其中包含大量要搜索的元详细信息。

WordPress用于其后meta的EAV格式不适用于多标准搜索。

如果将元数据划分为多个条目,则帖子元表中每个帖子将有许多条目,并且通过元搜索任何帖子将更加慢。

如果将所有序列化的元数据存储在数组中,并且仅作为后元数据中的一个条目,则这一次您将被迫仅在该元数据内进行文本搜索,并且您将无法直接在sql查询中使用比较运算符。

如果您的插件没有成千上万的条目和相关的元数据,那么这不是什么大问题。

但是,如果您的插件要做任何大事,这是一个主要问题。


您的情况,作为独立条目的文件名以及附加到该条目的3个元数据条目似乎并不大。您可以使用wordpress发布表和meta表。

但是,如果人们要大量搜索这3个meta,尤其是一起搜索,那么我建议您设置单独的表。

使用这种格式,只有一个表只有一个表,其中还包含所有元数据,这样就可以了,并且可以快速查询闪电。

顺便说一句,如果您使用WordPress表并且还使用查询缓存,则用户搜索您的数据将随着时间的流逝而缓存,并且产生较少的负载。但这不会像单独创建表那样谨慎。


0

您可以将文件上传到媒体库。媒体库中的每个项目都存储在它的wp_posts表中。这意味着每个文件都可以具有元数据。wp_postmeta通过使用Metadata API,您可以根据需要为表中的每个文件保存尽可能多的信息。

为插件创建自己的表是不好的做法吗?

是的,如果可以改为使用核心功能,则创建自己的表是一种不好的做法。


3
不,这不是一个坏习惯。除非您考虑使用较慢的查询和紧密耦合的代码,否则这是一个好习惯。
onetrickpony 2012年

0
class TMM {

    public static $options;

    public static function register() {
        self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
    }

    public static function get_option($option) {
        return @self::$options[$option];
    }

    public static function update_option($option, $data) {
        self::$options[$option] = $data;
        update_option($prefix . 'theme_options', self::$options);
    }

    //ajax
    public static function change_options() {

        $action_type = $_REQUEST['type'];
        $data = array();
        parse_str($_REQUEST['values'], $data);
        $data = self::db_quotes_shield($data);

        if (!empty($data)) {
            foreach ($data as $option => $newvalue) {
                if (is_array($newvalue)) {
                    self::update_option($option, $newvalue);
                } else {
                    $newvalue = stripcslashes($newvalue);
                    $newvalue = str_replace('\"', '"', $newvalue);
                    $newvalue = str_replace("\'", "'", $newvalue);
                    self::update_option($option, $newvalue);
                }
            }
        }
        _e('Options have been updated.', TMM_THEME_FOLDER_NAME);
        exit;
    }

    public static function db_quotes_shield($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $data[$key] = self::db_quotes_shield($value);
                } else {
                    $value = stripslashes($value);
                    $value = str_replace('\"', '"', $value);
                    $value = str_replace("\'", "'", $value);
                    $data[$key] = $value;
                }
            }
        }

        return $data;
    }

}

  • 班级名称为原始名称,可根据需要将其重命名。
  • 在函数php中添加:add_action('init',array('TMM','register'),1);
  • 并为ajax添加:add_action('wp_ajax_change_options',array('TMM','change_options'));;
  • 要在需要的地方使用选项(例如):$ logo_img = TMM :: get_option('logo_img');
  • 使用它通过本机wordpress方法保存您的选项
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.