I really like using the helper $wpdb class for inserts but occasionally I have a need to insert data using more than just %s, %d or %f format strings. Almost everyone will tell you to manually write your own INSERT statement and then just pass that to $wpdb->prepare() (which $wpdb->insert() does for you) but there is another way!
And it is actually documented in the code! Kind of. In wp-db on line 1307 (as of WP 3.7.1) it says:
A format is one of ‘%d’, ‘%f’, ‘%s’ (integer, float, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
The $wpdb has a member variable called $field_types which is an associative that you can use to override the formatting. To use it you cannot specify any formatting parameters when calling insert.
In my case, I had a need insert a GUID-like string into binary(16) column using the UNHEX() MySQL function.
global $wpdb;
//Set out override (anything not specified will be treated as %s)
$wpdb->field_types['transaction_id'] = "UNHEX('%s')";
//Call the normal insert
$wpdb->insert(
$wpdb->payments,
array(
'transaction_id' => $transaction_id,
'name' => $name
)
);
//Be polite, reset the array just in case future statements are run on this with the same column names
$wpdb->field_types = array();
Thank you, this is really helpful.
I wonder, have you found a way to get an inserted id back? I have a trigger creating the key and would like to return it with $wpdb->insert_id. I’d love to be able to hex that. 🙂