我已经盯着这个看了几个小时,很明显我错过了什么,但我不知道会是什么。。。
我有自定义的元框,用于将下载添加到特定的帖子或页面。所有数据作为数组保存到一个自定义字段键中。对于每个“下载”,我们输入3条信息:资源名称(输入=文本)、资源链接(输入=文本)和资源类型(选择pdf、zip文件、视频等列表)。
问题是,当我保存数据时,数据会以某种方式重新排列,数据保存的顺序和保存后生成的自定义字段数组不一致。保存时,如果我查看日志,数据似乎会随机插入到该自定义字段键的数组中。
以下是保存数据的函数:http://pastebin.com/TY6LFuiL
具体的部分是这个注释下面的问题开始://如果传递的是一个数组,我们应该删除所有以前的数据
以下是输出选项的位:http://pastebin.com/EGF4dibZ - 这就是事情变得一团糟的地方,因为数据的保存顺序和自定义字段键的结果数组中数据的顺序不一致。
例如,如果我将选项另存为:
input 1(text): Resource Name 1 - wsm-content-downloads[]
input 2(text): http://link.com/1.pdf - wsm-content-downloads[]
input 3(select): PDF - wsm-content-downloads[]
阵列在保存前如下所示:
Array
(
[0] => Resource Name 1
[1] => http://link.com/1.pdf
[2] => PDF
)
然后,保存数据的函数遍历并针对该数组的每个值,将其保存为同一关键字的自定义字段数据(wsm内容下载)-保存后生成一个数组:
Array
(
[0] => http://link.com/1.pdf
[1] => Resource Name 1
[2] => PDF
)
以下是更详细的日志:
http://pastebin.com/cdDsN5Sk
(由于链接限制,必须对最后一个链接进行编码示例)
在循环中每次保存/更新后,我将自定义字段数据打印为数组。您可以看到数据的保存方式根本不一致。。。有时保存/更新的值位于生成的自定义字段数据数组的开头,有时在末尾,有时甚至推到中间。。。
我需要这个键(wsm内容下载)的自定义字段数据数组与我传递给save函数的数组完全相同,但由于某些原因,它并不是这样出现的。。。
也许最糟糕的是,这段代码在我的本地服务器上运行得很好-在我的实时服务器上,它正在这样做。。。
提前感谢。。。
干杯,布莱恩
SO网友:Bryan M
明确的解决方案:将wp的核心get\\u post\\u自定义函数视为在random 为了解决这个问题,我编写了一个函数来替换它,这增加了一些灵活性:
/*---------------------------------------------------------------
Function: Retrieve post meta field for a post based on ID
Usage: [admin/meta_box/downloads.php] = to replace core wp get_post_custom function
Params: $id = post id, $key = meta key, $order = ASC|DESC,
$return = meta_value|meta_key|post_id|meta_id, $single = true|false
@return = result will be array unless $single = true, which will return the last result only
----------------------------------------------------------------*/
function noconflict_get_post_custom($id,$key,$single=false,$column=\'meta_value\',$order=\'ASC\'){
global $wpdb;
$data = $wpdb->get_results("
SELECT * FROM $wpdb->postmeta WHERE post_id = $id
AND meta_key LIKE \'$key\'
ORDER by meta_id $order
");
if( !empty( $data ) ) {
$metadata = array();
foreach( $data as $result_object ) {
$metadata[] = $result_object->$column;
}
if ($single)
return $metadata[0];
else
return $metadata;
}
}