This works:

$values = array();

foreach (  $_POST as $key => $value ) {
    $values[] = $wpdb->prepare( "(%d,%s,%s)", $post_id, $key, $value );

$query = "INSERT INTO {$table} (post_id, meta_key, meta_value) VALUES ";
$query .= implode( ",\n", $values );
$wpdb->query( $wpdb->prepare( "$query", $values ) );

But it throws this notice:

PHP Notice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (0) for the number of arguments passed (3).

How can I avoid the Notice?

1 Answer 1


Well, you don't need the second $wpdb->prepare() and just do $wpdb->query( $query );. The reason is because the $query does not contain any placeholders just as stated in the notice; only the items in $values contain the placeholders, but you already prepared them in the foreach. Additionally, be sure to run the query() only if the array $values is not empty.

  • 1
    As always, thank you.
    – shanebp
    May 10, 2021 at 23:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.