web-dev-qa-db-ja.com

警告通知$ wpdb->渡られた引数の数が間違っている

$ wpdb-> prepare関数を使おうとすると、この通知を受け取ります。

Notice:wpdb :: prepareが と誤って呼び出されました 。クエリに渡された引数の数(4)に対して正しい数のプレースホルダ(7)が含まれていません。詳しくはWordPressでのデバッグをご覧ください。 (このメッセージはバージョン4.8.3で追加されました。)C:\ wamp\www\wpml\wp-includes\functions.phpの4139行目

私はこのトピックに関する他の記事を見ましたが、私のコードではこれらのスレッドからの同じ問題は見られません。この通知を作成するとアプリケーションが大幅に遅くなるので、解決策を見つけたいと思います。

function get_meta_range($meta_key) {
    global $wpdb;

    // $meta_key = '_price'
    $include = '7275,7266,7256,7237,7196,7192,7164';

    $min = floor( $wpdb->get_var(
        $wpdb->prepare('
            SELECT min(meta_value + 0)
            FROM %1$s
            LEFT JOIN %2$s ON %1$s.ID = %2$s.post_id
            WHERE ( meta_key =\'%3$s\' OR meta_key =\'%4$s\' )
            AND meta_value != ""
            AND (
                %1$s.ID IN (' . $include . ')
            )'
        , $wpdb->posts, $wpdb->postmeta, $meta_key, '_min_variation' . $meta_key )
    ) );

    // $min = 15
}
1
Benjamin

番号付きのプレースホルダは期待どおりには機能せず、将来のある時点で完全に削除される予定であるため、無効な構文と見なす必要があります。

このことを念頭に置いて、エラーは問題を説明します - あなたのクエリは7つのプレースホルダーを持っています、しかしあなたは4つの値を渡すだけです。繰り返される値については、置換を渡すところでそれらを繰り返す必要があります。

3
Milo

wpdb::prepareは、プレースホルダを引用符で囲むべきではない、とあなたのコードにはまだあると言っています:

WHERE ( meta_key =\'%3$s\' OR meta_key =\'%4$s\' )

また、投稿IDがわかっている場合はメタテーブルが高速になるように設計されており、投稿を取得したときにWPが既にすべてのメタを取得していることにも注意してください。

そのため、データがすでに要求されているため、実際にはget_post_metaを使用してPHPで計算する方がはるかに高速です。このクエリを実行することは不要であり、費用がかかる可能性があります。

1
Tom J Nowell