当字段为数组时编辑用户元

时间:2012-08-31 作者:dnagirl

我正在使用s2member 我在注册表中添加了一个新的注册字段。s2member将所有自定义注册字段存储在元密钥下的数组中wp_s2member_custom_fields. 示例数组(私有数据为x’d out)如下所示:

a:15:{s:14:"street_address";s:19:"xx xxxxxxxx xxxxxxx";s:4:"city";s:15:"xxxxxxxxxxx xxxx";s:12:"can_province";s:2:"NS";s:7:"country";s:2:"CA";s:10:"postalcode";s:7:"xxx xxx";s:5:"phone";s:12:"xxx-xxx-xxxx";s:17:"weaving_interests";a:10:{i:0;s:6:"iw_gen";i:1;s:6:"iw_bas";i:2;s:6:"iw_bla";i:3;s:7:"iw_fash";i:4;s:5:"iw_FA";i:5;s:7:"iw_felt";i:6;s:6:"iw_lin";i:7;s:9:"iw_design";i:8;s:6:"iw_rug";i:9;s:6:"iw_sao";}s:14:"spin_interests";a:2:{i:0;s:7:"is_wool";i:1;s:7:"is_misc";}s:12:"is_misc_desc";s:110:"alpaca, bamboo, seacell...  pretty much any fibre - primarily animals based - as long as it\'s soft and pretty!";s:13:"dye_interests";a:2:{i:0;s:7:"id_chem";i:1;s:6:"id_nat";}s:8:"ew_count";s:1:"6";s:8:"ew_about";s:202:"36" eight shaft jack loom
45" four shaft jack loom
25" 16 shaft table loom
15" four shaft table loom
tapestry loom
1 1/2 inkle looms (the second one is under construction)
20ish" rigid heddle loom";s:7:"ec_spin";s:1:"3";s:8:"es_about";s:392:"- Ashford traveller which I love - it\'s my primary wheel
- a homemade wheel which is a little heavy and a tiny bit clunky, but spins nice yarn - it\'s at my cottage
- a small antique wheel that I use mostly for display and have never used (I haven\'t gotten around to putting a drive band on it yet)
- I also have a few drop spindles, including one I made this summer from a rock and a stick";s:8:"eo_about";s:80:"I love my drum carder for blending colours and making very cool rovings to spin!";}
我试图添加新字段loomsong_del 到该阵列。

a:16:{ ....;s:12:"loomsong_del";s:5:"email";} //desired result
a:2:{i:0;a:15:{ ....}s:12:"loomsong_del";s:5:"email";} //actual result
为了纠正这种情况,我尝试了以下方法:

    $s2_custom=get_user_meta($u->ID, \'wp_s2member_custom_fields\');
    $real = $s2_custom[0];
    $real[\'loomsong_del\']=\'email\';
    update_user_meta($u->ID,  \'wp_s2member_custom_fields\',$real);
这导致了:

a:2:{i:0; a:16:{ ....;s:12:"loomsong_del";s:5:"email";} s:12:"loomsong_del";s:5:"email";} 
//should be a:16:{ ....;s:12:"loomsong_del";s:5:"email";} only
我怎样才能修复它?

1 个回复
最合适的回答,由SO网友:Otto 整理而成

此代码是您的问题:

$s2_custom=get_user_meta($u->ID, \'wp_s2member_custom_fields\');
$real = $s2_custom[0];
$real[\'loomsong_del\']=\'email\';
update_user_meta($u->ID,  \'wp_s2member_custom_fields\',$real);
get\\u user\\u meta返回一个元值数组。因为在这种情况下,数组只有一个值,所以需要将单个参数传递给它。

尝试以下操作:

$s2_custom=get_user_meta($u->ID, \'wp_s2member_custom_fields\', true);
$s2_custom[\'loomsong_del\']=\'email\';
update_user_meta($u->ID,  \'wp_s2member_custom_fields\',$s2_custom);
顺便说一句,这不会修复数据库中已经损坏的数据。您需要手动或通过代码来修复,以读取损坏的数组并重建正确的数组。

编辑:为了澄清我在说什么。。。

元数据可以作为单独的行存储在数据库中,所有的元函数都假设您正在这样做,即使您没有这样做。

所以如果我打电话add_user_meta(1, \'foo\', \'value1\');add_user_meta(1, \'foo\', \'value2\');, 实际上,我在那里的数据库中有两行。

如果我那时打电话get_user_meta(1, \'foo\'); 然后,代码实际返回一个包含value1和value2的数组。对我来说,它将这些单独的行组成一个数组。

现在,如果我实际上只有1个条目,那么我不一定需要将其包装在数组中。那样的话我可以打电话get_user_meta(1, \'foo\', true); 要仅返回第一个结果,一行本身不包含数组换行。这种隐藏的数组包装是您第一次使用的,因为它在一个您意想不到的数组中发回了一个数组。

解决问题基本上意味着遍历并读取元数据,在数组中找到所需的实际数据,然后正确修改它并将其更新回数据库。

结束

相关推荐