web-dev-qa-db-ja.com

値がゼロの場合、update_post_metaは保存されません

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);

誰が何が間違っているかもしれないという考えを持っていますか?

5
HoGo

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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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 "&nbsp;&nbsp;\$meta_key = $meta_key<br />";
    echo "&nbsp;&nbsp;(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進数(私は思う)です。

3

問題は、update_metadata()が呼び出すmeta.php内のupdate_post_meta()関数のこの部分を処理することです。

$result = $wpdb->update( $table, $data, $where );
if ( ! $result )
    return false;

戻り値は0なので、0はデータベースに保存されていますが、ifステートメントはそれを正しくfalseとして扱います。

これは更新時にのみ発生します。新しい投稿メタが0の値で追加された場合、期待通りに行IDを返します。

0
User13342

比較のため、PHPは0falseと同等のものとして扱います。 update_post_meta関数は保存する前に値をチェックするので、0 == falseなので終了します。

あなたは投稿メタを保存する前にこのようなことをすることができます、それは少しハックですがそれはうまくいくでしょう:

if ( 0 === $value ) {
    $value = 'zero';
}

その後、後で値を取得するときには、反対のことを行います。

$value = get_post_meta( $post_id, 'meta-key', true );
if ( 'zero' == $value ) {
    $value = 0;
}
0