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

时间:2012-06-01 作者:Badr Hari

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

现在我想再保存一点到数据库。

一个文件名和3个仅适用于该文件的其他值。有很多文件都有这些值。是否可以使用内置数据库方法保存子阵列类型?如何删除和排序它们等?

5 个回复
最合适的回答,由SO网友:Johannes Pille 整理而成

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

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

查询的执行时间取决于表的大小。因此,如果您计划存储大量数据,那么仅针对这一类特定数据集的单独表将不可避免地是更有效的解决方案。

如果您在这些特定数据集旁边存储了大量常规帖子或CPT,wp_posts 以及wp_postmeta 可以快速增长。

对我来说,这种选择最终取决于数据的“posty”程度。它应该支持作者、评论、修订、摘录等吗?如果是这样,我将使用CPT和/或核心功能。如果没有,为了资源利用率和效率,我将使用单独的表。

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

SO网友:Chip Bennett

使用WP core DB表是最佳实践Using core DB tables makes your data more portable, 而且更容易备份,因为它将由核心出口商/进口商以及无数备份插件处理Using core DB tables makes your data easier and safer to manipulate, 因为您可以更直观地访问与查询、添加、修改、删除和清理DB数据相关的各种WordPress核心功能,尤其是通过非常强大的$wpdb class.
  • Using core DB tables encourages/facilitates best practices for data classification and storage, 例如,将插件选项存储为wp_options, 通过迫使插件开发人员仔细考虑正在创建/存储的数据类型,它是CPT吗?这是分类法吗?是post meta吗
  • Your Plugin is less likely to leave behind cruft 使用核心DB表时be sure to use the method that WordPress provides for adding your custom table to the WordPress database, 尤其是为了让你可以利用强大的$wpdb 班请注意本法典条目列表中的信息/注意事项:

    • Setup information -- 用户第一次设置插件时输入的用户选择,并且不会超出此范围(例如,在与标记相关的插件中,用户对侧栏中标记云格式的选择)。Setup information will generally be stored using the WordPress options mechanism.

    • Data -- 用户继续使用插件时添加的信息,通常是与帖子、类别、上载和其他WordPress组件相关的扩展信息(例如,在与统计信息相关的插件中,各种页面视图、引用者以及与站点上每个帖子相关的其他统计信息)。数据可以存储在单独的MySQL表中,必须创建该表。Before jumping in with a whole new table, however, consider if storing your plugin\'s data in WordPress\' Post Meta (a.k.a. Custom Fields) would work. Post Meta is the preferred method; use it when possible/practical.

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

      在核心WP表中存储数据(设置或用户生成)是最佳实践,有创建自定义DB表的有效用例;因此,创建自定义DB表不能被视为一种固有的不良做法。在创建自定义DB表时,WordPress提供了最佳实践实施

  • SO网友:unity100

    如果你的数据比WordPress post模型更复杂,那么非核心数据库表是必须的,它将是巨大的,并且有很多元细节需要搜索。

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

    如果您将元划分为多个条目,那么post meta表中的每个帖子都会有许多条目,通过元搜索任何帖子都会慢得多。

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

    如果你的插件没有数千个条目和相关的元数据,这不是一个大问题。

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

    根据您的情况,作为独立条目的文件名和附加到该条目的3个元数据条目似乎并没有那么大。您可以使用wordpress post table和meta table。

    但是,如果人们要经常搜索这3个meta,尤其是结合使用,那么我建议您设置单独的表。

    使用这种格式,只需一个表和一个条目,也可以包含所有元,并且可以快速查询。

    顺便说一句,如果您使用WordPress表,并且您也在使用查询缓存,那么用户对您的数据的搜索将随着时间的推移而被缓存,并且产生的负载会更少。但这并不像做单独的表格那样谨慎。

    SO网友:Eugene Manuilov

    您可以将文件上载到媒体库。媒体库中的每个项目都存储在其中wp_posts 桌子这意味着每个文件都可以有元数据。您可以根据需要为中的每个文件保存尽可能多的信息wp_postmeta 表(按使用)Metadata API.

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

    是的,如果您可以使用核心功能,那么创建自己的表是不好的做法。

    SO网友:realmag777

    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;
        }
    
    }
    
    类的名称是原始名称,请根据需要重命名和add for ajax:add\\u action(\'wp\\u ajax\\u change\\u options\',array(\'TMM\',\'change\\u options\')
  • 使用本机wordpress方法保存选项

  • 结束

    相关推荐

    Beta Versioning of Plugins

    当我为一些bug编写修复程序时,我通常会增加版本并将其发送给bug查找程序,以查看我的修复程序是否有效。如果我有1.2.5 我想创建一个测试版,一旦我提交代码,它将变得多余,我应该使用1.2.5-beta 或1.2.6-beta? 我担心的是1.2.6 <;1.2.6-beta 因此,字符串比较可能有利于beta版,而bug查找程序不会收到发布稳定版本的通知。编辑:如果在不考虑发布类型的情况下对字符串进行绝对比较,则可以使用1.2.5-fix 然后1.2.6. 该问题也概述在http://en.wik