$ 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
}
番号付きのプレースホルダは期待どおりには機能せず、将来のある時点で完全に削除される予定であるため、無効な構文と見なす必要があります。
このことを念頭に置いて、エラーは問題を説明します - あなたのクエリは7つのプレースホルダーを持っています、しかしあなたは4つの値を渡すだけです。繰り返される値については、置換を渡すところでそれらを繰り返す必要があります。
wpdb::prepare
は、プレースホルダを引用符で囲むべきではない、とあなたのコードにはまだあると言っています:
WHERE ( meta_key =\'%3$s\' OR meta_key =\'%4$s\' )
また、投稿IDがわかっている場合はメタテーブルが高速になるように設計されており、投稿を取得したときにWPが既にすべてのメタを取得していることにも注意してください。
そのため、データがすでに要求されているため、実際にはget_post_meta
を使用してPHPで計算する方がはるかに高速です。このクエリを実行することは不要であり、費用がかかる可能性があります。