web-dev-qa-db-ja.com

書き方:配列の中にWHERE NOTの値の組を持つ$ wpdb-> update

Postmetaテーブル内の0以外の値を持つすべてのメタキーを0の値に更新する必要があります。

私はこれを試してみました..愛はありません(私は理由を理解することはできませんが....):

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

私はこのコンセプトにいますが、キーリストで "!0"は0ではないと言いますか?

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

どうもありがとうございます。

アップデート:私は$wpdb->queryを以下のように修正しました。

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

しかし、私はまだ$wpdb->updateWHEREパラメータにキーペア配列を渡して!=値を要求する方法があるかどうか知りたいです。

1
GrimPanda

$wpdbクラスのプロパティ

次のようにallデフォルトのWordPressテーブルを使うことができます。

  • $GLOBALS['wpdb']->postmeta

そのためprefixなどを使う必要はありません。

meta_query

カスタムフィールドパラメータ のドキュメントからわかるように、<>(つまり「等しくない」)演算子のようなものはありません。 WPの同等の演算子は、!=(人間の言葉: "not is")またはNOT LIKEである必要があります。

だから、単に次の行に沿って何かをする:

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

これは、このメタ値を使ってすべての投稿をクエリします。私が疑問に思うのは、なぜあなたがstringintegerとして手に入れたのかということです。私はそれをしないでしょう、特に私がカウンターを使うならばそうしないでください。私がコメントにしたものを見てください:type、これは後であなたにもっともっと具体的な質問を許すでしょう。

メタエントリを更新する

それからそれらを単純にループして値を更新します。

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

どこで!=を使用することは可能であるように見えません。これが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}";
}

$wheres[]行が言っています。これは=のみが使用されていることを示しています。その配列は後で使用されます。

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

あなたの場合、クエリは0ではない値をチェックせずに動作したかもしれません。結果は同じですが(より多くの行が影響を受けますが)、このメソッドはWHERE句の=のみに制限されているように見えます。

0