2013-10-01 42 views
4

我使用WordPress update_post_meta保存像布爾和整型是系列化

$obj = array(
    'array' => array(1, 'zwei', !!3), 
    'string' => 'abc', 
    'bool' => true, 
    'bool2' => false, 
    'integer' => 1, 
    'integer2' => 17 
); 

update_post_meta($post_ID, 'my-key', $obj); 
然而

一個數組,如果我檢查了原料場後弦,我得到

a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;s:1:"1";}s:6:"string";s:3:"abc";s:4:"bool";s:1:"1";s:5:"bool2";s:1:"0";s:7:"integer";i:1;s:8:"integer2";i:17;} 

,而應該是

a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;b:1;}s:6:"string";s:3:"abc";s:4:"bool";b:1;s:5:"bool2";b:0;s:7:"integer";i:1;s:8:"integer2";i:17;} 

您可能會注意到所有的布爾值都被存儲爲字符串(b:1 = s:1:"1"

問題是,僅在特定的WordPress安裝,而不是每一個人。我也查了serialize功能這是工作的正確(返回b:1

而且使用get_post_meta

get_post_meta($post_ID, 'my-key', true); 

,並簽有is_bool返回false(顯然)

編輯值:剛也注意整數得到保存爲字符串

+0

是否有任何'sanitize_meta'過濾器,可能來自某些插件,正在應用於發生這種情況的安裝?在代碼庫中搜索'add_filter('sanitize_' – Tom

+0

你使用的是什麼版本的wordpress?你可以更新wp,然後再次檢查嗎?我已經安裝了一個wp 3.5.2,問題出現在我更新到3.6之後.1問題已修復 –

+1

WordPress> = 3.6使用[wp_unslash](http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/meta.php#L119),而3.5.2仍然使用[stripslashes_deep](http://core.trac.wordpress.org/browser/tags/3.5.2/wp-includes/meta.php#L119) – Xaver

回答

6

update_post_meta使用update_metadata,你可以找到它的代碼here在功能,如果你看看at line 119你會看到其返回值是一個字符串

作爲一種變通方法,你可以前serialize值(更改數據類型爲stripslashes_deep的功能)的meta_value傳遞給wp_unslash它傳遞給update_post_meta()

編輯:
發現問題:3.6.0 update_metadata之前線117有這樣的代碼:

$meta_key = stripslashes($meta_key) 

stripslashes是一個返回字符串的php函數。
爲3.6.0該行看起來像:

$meta_key = wp_unslash($meta_key); 

其中僅的stripslashes字符串類型meta_keys。

對wordpress 3.6.0或更高版本的更新將解決該問題。

+0

迄今爲止最好的答案!但wp_unslash使用[stripslashes_deep](http ://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/formatting.php#L1429)它只能轉換字符串 – Xaver

+0

好吧,如果這是你得到賞金的答案:)請讓我檢查... – Xaver

+0

好吧,我已經檢查了來源,似乎這是問題!你節省了我頭痛! – Xaver