Invalid argument supplied for foreach() in wp-capabilities.php: Case Cracked! [en]

[fr] Le problème avec wp-capabilities.php qui fait qu'on peut se retrouver "exfermé" (enfermé dehors) de son blog WordPress (typiquement en cas de changement de serveur) semble avoir sa source dans le contenu du champ wp_user_roles dans la table wp_options. En particulier, pour la version française, "Abonné" est un rôle d'utilisateur, et en cas de problèmes d'encodage MySQL, le caractère accentué sera corrompu, causant ainsi l'erreur.

Il suffit de remplacer le caractère fautif dans PhpMyAdmin, et on retrouve l'accès à son blog. Bon, reste ensuite à régler les questions d'encodage... mais c'est déjà ça!

Finally. At last. Endlich. Enfin.

Once more, while trying to transfer a WordPress installation from one server to another, I found myself facing the dreaded problem which locks me out of my WordPress install with a rather cryptic message:

Warning: Invalid argument supplied for foreach() in /home/user/wp/wp-includes/capabilities.php on line 31

(Your lineage may vary.)

What happens is that WordPress cannot read user roles, and therefore, even though your password is accepted, you get a message telling you that you’re not welcome in the wp-admin section:

Vous n’avez pas les droits suffisants pour accéder à cette page.

Or, in English:

You do not have sufficient permissions to access this page.

A quick search on the WordPress forums told me that I was not alone in my fight with wp-capabilities.php, but that many problems had not been resolved, and more importantly, that suggested solutions often did not work for everyone.

I’ve bumped into this problem a couple of times before, and I knew that it was linked to encoding problems in the database. (I’ve had my share of encoding problems: once, twice, thrice — “once” being on of the most-visited posts on this blog, by the way, proof if needed that I’m not alone with mysql encoding issues either.)

I’ll leave the detailed resolution of how to avoid/cure the MySQL problems later (adding
mysql_query("SET NAMES 'utf8'");
to wp-db.php as detailed in this thread, and as zedrdave had already previously told me to do — should have listened! — should prevent them). So anyway, adding that line to my working WordPress install showed me that the problem was not so much in the database dumping process than in the way WordPress itself interacted with the database, because the dreaded wp-capabilities.php problem suddenly appeared on the original blog.

Now, this is where I got lucky. Browsing quickly through the first dozen or so of forum threads about wp-capability.php problems, this response caught my eye. It indicated that the source of the problem was the content of the wp_user_roles field (your prefix may vary). In this case, it had been split on more than one line.

I headed for the database, looked at the field, and didn’t see anything abnormal about it at first. All on one line, no weird characters… just before giving up, I moved the horizontal scrollbar to the end of the line, and there — Eurêka! I saw it.


“Contributor”, in French, is “abonné”, with an accent. Accent which got horribly mangled by the MySQL problems which I’ll strive to resolve shorty. Mangled character which caused the foreach() loop to break in wp-capabilities.php, which caused the capabilities to not be loaded, which caused me to be locked out of my blog.

So, in summary: if you’re locked out of your blog and get a warning/error about wp-capabilities and some invalid foreach() loop thingy, head for PhpMyAdmin, and look carefully through the wp_user_roles field in the wp_options table. If it’s split over two or more lines, or contains funky characters, you have probably found the source of your problem.

Good luck!

19 thoughts on “Invalid argument supplied for foreach() in wp-capabilities.php: Case Cracked! [en]

  1. Mmmh, would say me changing the translation file to say “Abonné” instead of “Abonné” would solve the problem for future generations ?

  2. It would. eacute. What would also solve the problem would be adding that utf-8 line in wp-db.php. Will try to catch the WP people about that.

  3. Pfioulala, je pense trop vite pour mes doigts. Donc, pour la totale : +you, +can, s/de/the/ 🙂

  4. It is a good solution if you use UTF8, but not everyone is. WordPress core seems to need a more comprehensive solution.

  5. Salut Steph’
    j’ai eu également une l’erreur suivante en upgradant à la version WP 2.1

    Fatal error: Call to undefined function: wp_get_current_user() in /home/cybexpor/public_html/wp-includes/capabilities.php

    Ca ressemble un peu à ton erreur. Ce qui m’a sauvé fut simplement de reuploader sur le serveur le répertoire wp-includes…

    A jeudi!

  6. As a total n00b to WP and PHP I cannot tell what in my table might be causing this problem. I’ve managed to dig this up from PHPMyAdmin; I think it is the correct field:


    Does anyone know if I am looking at the right thing, and if so, what might the actual problem be? I don’t see any mangled characters.

    Thanks to anyone who can help.


  7. ah I see my row is not wrapping – sorry. I don’t see anything that looks wrong in it but will keep at it. If I find anything will post here and on the WP forums.

  8. Thank you, thank you, thank you! The User roles area was where I was having troubles.

    Cheerful Trails,


  9. You are a life saver, thank you! I looked for hours and even my hosting company was not able to help… now it’s fixed!

  10. you guys are much too good for me.

    “So, in summary: if you’re locked out of your blog and get a warning/error about wp-capabilities and some invalid foreach() loop thingy, head for PhpMyAdmin, and look carefully through the wp_user_roles field in the wp_options table. If it’s split over two or more lines, or contains funky characters, you have probably found the source of your problem.”

    so it is scrambled (abonné). what should I do?

  11. Bon, j’avoue, j’ai paniqué. Donc je ne suis plus exfermée sur mon blog. Y a-t-il une manière simple de modifier tous les caractères “scramblés” sur mon blog?
    D’autant que j’en ai d’autres à upgrader , et autrement plus verbeux.
    Merci de m’avoir fourni la solution, quand même…

  12. I’m having a heck of a time trying to move servers.. it’s not letting me post now as an admin, and the user roles have changed in WP 3.0.1 Soo…. I found your post, but I don’t think it’s all I need. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *