Como escrever: $ wpdb-> atualização tendo WHERE NOT pair do valor na matriz

Eu preciso atualizar todas as meta-chaves na tabela pós-meta que têm um valor diferente de 0, no valor de 0.

Eu tentei isso … sem amor (embora não consiga descobrir por que …):

$status = $wpdb->query("UPDATE {$wpdb->prefix}postmeta SET meta_value=0 WHERE meta_key = _wti_like_count AND meta_value  '0'"); 

Estou no conceito, mas como dizer “! 0” NÃO 0 na lista de chaves?

 $wpdb->update('wp_postmeta', array('_wti_like_count' => '0'), array('_wti_like_count' => '0')); 

Muito obrigada!

UPDATE: Eu $wpdb->query minha $wpdb->query seguinte maneira e funciona:

 $status = $wpdb->query("UPDATE {$wpdb->prefix}postmeta SET meta_value='0' WHERE meta_key = '_wti_like_count' AND meta_value  '0'"); 

No entanto, eu ainda gostaria de saber se existe uma maneira de passar uma matriz de par de chaves para o parâmetro WHERE de $wpdb->update e solicitar um valor != .

Solutions Collecting From Web of "Como escrever: $ wpdb-> atualização tendo WHERE NOT pair do valor na matriz"

As propriedades da class $wpdb

Você pode usar todas as tabelas padrão do WordPress como esta:

  • $GLOBALS['wpdb']->postmeta

então não há necessidade de usar o prefix , etc.

meta_query

Como você pode ver na documentação do parâmetro de campo personalizado , não há nada como o operador <> (ou, em outras palavras: “não igual a”). O operador equivalente em WP deve ser != (Palavras humanas: “not is”) ou NOT LIKE .

Então, simplesmente faça algo nas seguintes linhas:

 $query = new WP_Query( array( 'meta_query' => array( array( 'key' => '_wti_like_count', 'value' => '0', 'compare' => 'NOT LIKE', # 'type' => 'numeric' ) ) ) ); 

Isso consultaria todas as suas postagens com esse meta-valor. O que me faz pensar é por que você obteve uma string como um integer . Eu não faria isso, especialmente não se eu usar um contador. Veja o que eu comentei: O type , o que lhe permitiria – mais tarde – consultas muito mais específicas.

Atualize as meta-inputs

Em seguida, passe-os e atualize os valores.

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

Não parece que é possível usar! = No lugar onde. Aqui está o código relevante do método 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}"; } 

A linha $wheres[] está dizendo. Mostra apenas = é usado. Essa matriz é usada mais tarde:

 $sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres ); 

No seu caso, a consulta poderia ter funcionado sem verificar se o valor não era 0 . O resultado teria sido o mesmo (embora mais linhas tivessem sido afetadas), mas parece que esse método está limitado apenas a = nas cláusulas WHERE.

 add_filter( 'query', 'query_report', 10000 ); function query_report($sql){ var_dump($sql); return $sql; }