web-dev-qa-db-fra.com

update_post_meta n'enregistre pas quand la valeur est zéro

J'ai un problème avec la fonction update_post_meta.
J'ai une valeur soumise par l'utilisateur, que je passe via $_POST et que je sauvegarde ensuite pour poster une méta.

Tout fonctionne correctement, mais lorsque la valeur est '0', la méta de publication n'est pas mise à jour.

Mon code:

$id = absint($_POST['ex_id']);
$key = (string) $_POST['id'];
$value = (string) $_POST['value'];

echo update_post_meta($id, 'wpptabs_' . $key, $value);

Est-ce que quelqu'un a une idée de ce qui pourrait être faux?

5
HoGo

update_post_meta() appelle update_metadata qui commence par cette ligne:

if ( !$meta_type || !$meta_key )
    return false;

J'ai écrit un test simple (avec beaucoup de copier-coller) pour voir comment les valeurs de chaîne de 0 sont évaluées (au lieu de le rechercher dans le manuel PHP):

<?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 />';
}

Le résultat était:

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

Ainsi, pour ajouter une valeur de 0, vous pouvez la remplacer par la chaîne '0x0' et la convertir en entier lors de la récupération. 0x0 est binaire (je pense) pour 0.

3
Charles Clarkson

Le problème est lié à cette partie de la fonction update_metadata() dans meta.php qui appelle update_post_meta()

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

Comme la valeur de retour est 0, l'instruction if le traite correctement comme false, bien que 0 ait été enregistré dans la base de données.

Cela n'arrive que quand il met à jour. Si une nouvelle méta de publication est ajoutée avec une valeur de 0, elle renvoie l'identifiant de ligne comme prévu.

0
User13342

PHP considère 0 comme équivalent à false pour les comparaisons. Étant donné que la fonction update_post_meta recherche une valeur avant de sauvegarder, elle se ferme car 0 == false.

Vous pouvez faire quelque chose comme ça avant de sauvegarder le post meta, c’est un peu hacky mais ça marcherait:

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

Ensuite, lorsque vous récupérez vos valeurs plus tard, vous faites simplement le contraire:

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