update_post_meta
関数に問題があります。
ユーザーが送信した値を持っています。これを$_POST
経由で渡してから投稿メタに保存します。
すべてうまく機能していますが、値が'0'
の場合、投稿メタは更新されません。
私のコード:
$id = absint($_POST['ex_id']);
$key = (string) $_POST['id'];
$value = (string) $_POST['value'];
echo update_post_meta($id, 'wpptabs_' . $key, $value);
誰が何が間違っているかもしれないという考えを持っていますか?
update_post_meta()
は、この行で始まるupdate_metadata
を呼び出します。
if ( !$meta_type || !$meta_key )
return false;
私は(PHPマニュアルで調べるのではなく)0の文字列値がどのように評価されるかを見るために(たくさんのカットアンドペーストで)簡単なテストを書きました:
<?php
$meta_key = (string) 0;
if ( ! $meta_key )
echo "0 exits function<br />";
else {
echo "0 remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = (string) 0;
if ( ! $meta_key )
echo "(string) 0 exits function<br />";
else {
echo "(string) 0 remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = (string) '0';
if ( ! $meta_key )
echo "(string) '0' exits function<br />";
else {
echo "(string) '0' remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = 0x0;
if ( ! $meta_key )
echo "0x0 exits function<br />";
else {
echo "0x0 remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = (string) 0x0;
if ( ! $meta_key )
echo "(string) 0x0 exits function<br />";
else {
echo "(string) 0x0 remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = '0x0';
if ( ! $meta_key )
echo "'0x0' exits function<br />";
else {
echo "'0x0' remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
echo '<br />';
$meta_key = (string) '0x0';
if ( ! $meta_key )
echo "(string) '0x0' exits function<br />";
else {
echo "(string) '0x0' remains in function<br />";
echo " \$meta_key = $meta_key<br />";
echo " (integer) \$meta_key = " . (integer) $meta_key . '<br />';
}
その結果、
0 exits function
(string) 0 exits function
(string) '0' exits function
0x0 exits function
(string) 0x0 exits function
'0x0' remains in function
$meta_key = 0x0
(integer) $meta_key = 0
(string) '0x0' remains in function
$meta_key = 0x0
(integer) $meta_key = 0
したがって、値0を追加するには、値を文字列 '0x0'に変更して、取得時に整数にキャストします。 0x0は2進数(私は思う)です。
問題は、update_metadata()
が呼び出すmeta.php
内のupdate_post_meta()
関数のこの部分を処理することです。
$result = $wpdb->update( $table, $data, $where );
if ( ! $result )
return false;
戻り値は0
なので、0
はデータベースに保存されていますが、ifステートメントはそれを正しくfalseとして扱います。
これは更新時にのみ発生します。新しい投稿メタが0
の値で追加された場合、期待通りに行IDを返します。
比較のため、PHPは0
をfalse
と同等のものとして扱います。 update_post_meta
関数は保存する前に値をチェックするので、0 == false
なので終了します。
あなたは投稿メタを保存する前にこのようなことをすることができます、それは少しハックですがそれはうまくいくでしょう:
if ( 0 === $value ) {
$value = 'zero';
}
その後、後で値を取得するときには、反対のことを行います。
$value = get_post_meta( $post_id, 'meta-key', true );
if ( 'zero' == $value ) {
$value = 0;
}