8

Does WordPress provide a way of rolling back when using, for example, update_post_meta or wp_insert_post?

E.g. I'm inserting a new post and giving it some post meta inside one function:

some_wp_transaction_init_function();

try{
    $post_id = wp_insert_post($args, true);
    update_post_meta($post_id, 'meta_key', 'meta_value');   
}catch(Exception $e){
    some_wp_rollback_function();
}

some_wp_commit_function();

Or do I have to use vanilla SQL, or the $wpdb object?

Thanks

1
  • There's no built-in function - you'll have to use $wpdb->query( "START TRANSACTION" ) etc. Nov 23, 2016 at 11:30

1 Answer 1

16

There is no functions in wordpress to handle transactions but you can easily use the $wpdb object to make a simple query to achieve this. The following function will start a transaction and then insert a new user into the database and finally rollback the current transaction. In order to make the transaction permanent you would instead use $wpdb->query('COMMIT');

function test_transaction() {
  global $wpdb;

  // begin transaction
  $wpdb->query('START TRANSACTION');

  $user = array(
    'user_pass' =>  'sample_password',
    'user_login' => 'sample_login',
    'user_email' => 'sample@example.com',
    'first_name' => 'sample_firstname',
    'last_name' => 'sample_lastname',
  );
  $user_id = wp_insert_user($user);

  // roll back everything - e.g remove the new user record from the database
  $wpdb->query('ROLLBACK');
};
6
  • Do you need a COMMIT or is that assumed if no ROLLBACK is encountered?
    – HPWD
    Apr 6, 2020 at 0:16
  • 1
    You must use COMMIT: "if no ROLLBACK is encountered" is the halting problem. Note that in order to use transactions you have to disable 'autocommit' (active by default for mysql) otherwise every command is committed so the transaction has no reason to be started. In this case there will be an auto rollback of the last query in case of errors (e.g. integrity/uniqueness constraints violation, sql syntax errors...).
    – Fil
    Jul 2, 2020 at 14:14
  • does it need semicolon in the end?
    – T.Todua
    Jun 14, 2021 at 13:34
  • Nope, I don't think so. You need a semicolon or whatever you use as a separator to end a statement, but since there is only one, there should be no need to a trailing semicolon in this case. Jun 14, 2021 at 18:58
  • 4
    Actually @Fil, I don't think you have to explicitly disable autocommit. The MySQL doc at dev.mysql.com/doc/refman/8.0/en/commit.html says " To disable autocommit mode implicitly for a single series of statements, use the START TRANSACTION statement: <snip> With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state."
    – scott8035
    May 5, 2022 at 20:46

Your Answer

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

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