J'ai besoin de mettre à jour toutes les clés méta de la table postmeta qui ont une valeur autre que 0, à la valeur 0.
J'ai essayé ceci .. pas d'amour (bien que je ne puisse pas comprendre pourquoi ....):
$status = $wpdb->query("UPDATE {$wpdb->prefix}postmeta SET meta_value=0 WHERE meta_key = _wti_like_count AND meta_value <> '0'");
Je suis sur ce concept, mais comment dire "! 0" PAS 0 dans la liste des clés?
$wpdb->update('wp_postmeta', array('_wti_like_count' => '0'), array('_wti_like_count' => '0'));
Merci beaucoup!
UPDATE: J'ai corrigé mon $wpdb->query
comme suit et cela fonctionne:
$status = $wpdb->query("UPDATE {$wpdb->prefix}postmeta SET meta_value='0' WHERE meta_key = '_wti_like_count' AND meta_value <> '0'");
Cependant, j'aimerais toujours savoir s'il existe un moyen de passer un tableau de paires de clés au paramètre WHERE
de $wpdb->update
et de demander une valeur !=
.
$wpdb
Vous pouvez utiliserallles tables WordPress par défaut comme ceci:
$GLOBALS['wpdb']->postmeta
donc pas besoin d'utiliser prefix
, etc.
meta_query
Comme vous pouvez le constater dans la documentation paramètre de champ personnalisé , rien ne ressemble à l'opérateur <>
(ou, en d'autres termes: "différent de"). L'opérateur équivalent dans WPdoit être!=
(mots humains: "not is") ou NOT LIKE
.
Alors, faites simplement quelque chose dans le sens suivant:
$query = new WP_Query( array(
'meta_query' => array(
array(
'key' => '_wti_like_count',
'value' => '0',
'compare' => 'NOT LIKE',
# 'type' => 'numeric'
)
)
) );
Cela interrogerait tous vos messages avec cette méta valeur. Ce qui me fait me demander, c'est pourquoi vous avez une string
en tant que integer
. Je ne ferais pas cela, surtout pas si j'utilise un compteur. Voyez ce que j'ai commenté: La type
, ce qui vous permettrait, plus tard, des requêtes beaucoup plus spécifiques.
Il suffit ensuite de les parcourir et de mettre à jour les valeurs.
if ( $query->have_posts() )
{
while ( $query->have_posts() )
{
$query->the_post();
# Do debugging, logging or sleep() here to avoid timeouts
update_post_meta( '_wti_like_count', '0', true );
# I still believe it should be an INTeger
update_post_meta( '_wti_like_count', 0, true );
}
}
Il ne semble pas qu'il soit possible d'utiliser! = Dans le où. Voici le code pertinent de la méthode update()
:
$where_formats = $where_format = (array) $where_format;
foreach ( (array) array_keys( $where ) as $field ) {
if ( !empty( $where_format ) )
$form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0];
elseif ( isset( $this->field_types[$field] ) )
$form = $this->field_types[$field];
else
$form = '%s';
$wheres[] = "`$field` = {$form}";
}
La ligne $wheres[]
est révélatrice. Cela montre que seul =
est utilisé. Ce tableau est utilisé plus tard:
$sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres );
Dans votre cas, la requête aurait pu fonctionner sans vérifier si la valeur n'était pas 0
. Le résultat aurait été identique (bien que davantage de lignes aient été affectées), mais il semble que cette méthode soit limitée à =
dans les clauses WHERE.