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?
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 " \$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 />';
}
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.
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.
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;
}