web-dev-qa-db-fra.com

Comment écrire: $ wpdb-> update ayant la paire O PAS dans le tableau

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 !=.

1
GrimPanda

Les propriétés de la classe $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.

Mettre à jour les méta-entrées

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 );
    }
}
0
kaiser

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.

0
Charles Clarkson