我偶然发现了一个问题,即选项字段中存储的数据结构太复杂(至少在我看来)。
现在我有一个集合数组,每个集合中都有另一个子集合(如下所示)。在我看来,这看起来太复杂了,尤其是当一个人想在里面储存一些价值的时候。或多或少,它看起来像:
$collection = get_option(\'collection_setting\');
$collection[1][elements][0][name] = "ChangedExample";
当我们想在集合中引入另一个数组时,情况可能会变得更糟。此外,我认为如果每个数组使用100个条目,那么它可能会变得非常草率。
我的问题是如何改进这一点?将其存储到两个不同的选项字段中—一个用于集合,另一个用于子集合,然后以某种方式尝试在代码中连接它?或者这完全可以?
当然,我假设在DB中创建另一个表不是最优雅的方式。
Array
(
[0] => Array
(
[name] => collection_name
[speed] => 200
[id] => collection_name_1
[max_elements_per_page] => 13
[elements] => Array
(
[0] => Array
(
[id] => 1
[url] => http://www.example1.org
[name] => Example1
)
[1] => Array
(
[id] => 2
[url] => http://www.example2.org
[name] => Example2
)
[2] => Array
(
[id] => 3
[url] => http://www.example3.org
[name] => Example4
)
)
)
[1] => Array
(
[name] => collection_name_2
[speed] => 200
[id] => collection_name_2
[max_elements_per_page] => 13
[elements] => Array
(
[0] => Array
(
[id] => 1
[url] => http://www.example1.org
[name] => Example1
)
[1] => Array
(
[id] => 2
[url] => http://www.example2.org
[name] => Example2
)
[2] => Array
(
[id] => 3
[url] => http://www.example3.org
[name] => Example4
)
)
)
)
例如,当我在设置页面上只想编辑集合的第一个元素,然后在保存时,Wordpress会用表单中提交的值覆盖整个选项,从集合中删除第二个元素(此处删除$collection[1])。
出路是什么?我正在考虑使用validate\\u options函数(从设置页面接收数据)。我可以检索collection\\u设置,相应地修改它并返回修改后的collection\\u设置。
register_setting(\'collection-settings-group\', \'collection_setting\', \'validate_options\');
但我认为这是太多的工作,我相信有更好的解决办法。
最合适的回答,由SO网友:Ralf912 整理而成
这是使用类管理数据结构的典型情况。您有一个复杂的数据结构,需要一些函数来检索和修改数据结构。这是一个简单的类。
该类从数据库中获取数据结构,并有一些方法来获取部分数据结构或对其进行修改。
我写了一个sample class, 您可以使用自己的方法对其进行扩展或修改。使用该类非常简单:
<?php
// creating an instance of the class and retrieve the data from db
$collections = new CollectionsManager();
// get a collection by it\'s id
$sample_collection = $collection->get_collection_by_id( \'sample_collection\' );
// get the elements of the sample collection
$sample_elements = $collection->get_elements_by_id( \'sample_collection\' );
// insert an alement
$new_element = array( \'id\' => 5, \'name\' => \'new_element\', \'url\' => \'http://wordpress.stackexchange.com\' );
$new_element_id = $collection->insert_element_by_id( \'sample_collection\', $new_element );
I wrote this class from scratch and it is not been tested yet. Maybe it\'s buggy in some parts. I give no warranty for bugless functionality!