我有一个客户,他希望能够使用存储在CSV文件中的信息上传帖子。我已经把这部分做好了。
就在最近,我将CSV文件上传器从纯PHP改为AJAX上传器,以消除服务器超时,并提供一个很好的界面来跟踪每个新帖子的进度。
问题是:
每个自定义帖子总共包含大约130个自定义字段。我的每一个CSV上传测试都包含大约20篇新帖子。即使启用了async,处理每个新帖子仍然需要一点时间。
所有自定义字段都分为5个单独的元框。最初,我将其设置为将每个元框存储为JSON编码的字符串,并将其保存为帖子元数据的一部分。这使自定义字段的总数从130个增加到了5个,并且写入时间大大增加。
然而,这样做的缺点是,Wordpress的标准不再能够搜索每个单独的自定义字段。
建议的解决方案:
我可以做以下几件事之一:
我可以保持原样,在保留可搜索和可查询元数据的同时缩短写入时间,但可能会遇到包含数百篇或数千篇帖子的CSV文件的问题我可以将每个元框存储为单个自定义字段,并修改Wordpress的搜索功能,通过自定义SQL查找元数据,但无法通过Meta\\u查询检索帖子我可以彻底修改现有结构,并将所有自定义PostMetadata写入一个单独的表。这意味着失去内置的搜索功能,以及使用meta\\u查询的能力问题是:处理这个问题的最佳方法是什么?从理论上讲,将会有数十万个这样的自定义帖子。需要让用户能够根据标题、分类法和元数据搜索这些帖子。
就我个人而言,我尽量避免不惜一切代价向Wordpress安装中写入任何新表。但这会被视为一种需要这样做的情况吗?或者,如果我使用自己不太复杂的查询来修复一个甚至不一定是问题的问题,我会失去太多功能吗?
最重要的是,有没有其他我可能遗漏的方法可以解决这个问题?
UPDATE:
为了在不违反我的保密协议的情况下澄清数据的含义,每个自定义帖子都是一把吉他。
每个元框表示吉他的一个部分(颈部、主体等),每个自定义字段是属于该特定部分(木材、制造商等)的固定信息。
class Guitar
{
public $ID;
public $Year;
public $Make;
public $Model;
public $Section1;
public $Section2;
public $Section3;
public $Section4;
public $Section5;
public $Section6;
public $Section7;
public $General;
private $_data;
private static $_dataFlags = array(\'Section1\', \'Section2\', \'Section3\', \'Section4\', \'Section5\', \'Section6\', \'Section7\', \'General\');
public function __construct($args)
{
$this->ID = $this->_query_existing();
foreach(self::$_dataFlags as $sec)
$this->$sec = new $sec($args[$sec]);
}
}
abstract class Guitar_Section
{
public function __construct($arr=array())
{
if(!empty($arr))
$this->_set_props($arr); //Set Properties
}
public function update_meta($id, $useprops=false)
{
foreach(get_object_vars($this) as $k=>$v)
{
$this->$k = !$useprops ? $_POST[\'guitar_\'.$this->_get_section_name().\'_\'.$k] : $v;
update_post_meta($id, \'_guitar_\'.$this->_get_section_name().\'_\'.$k, $this->$k);
}
}
}
class Section1 extends Guitar_Section
{
public $Wood;
public $Attachment;
public $etc;
protected function _get_section_name()
{
return \'Section1\';
}
}
这将显示每个类如何协同工作。我有它,所以每个吉他部分都由吉他类封装,每个部分都扩展了抽象类。每个属性都是一个自定义字段,并使用抽象类中的方法进行设置,而Guitar类基本上查询Wordpress并设置任何可用的ID、年份、品牌和型号。
由于CSV文件用于设置类及其属性,因此大多数操作都需要大量的字符串操作。