Tartine du jour entre fatigue, judo, ménage et planning [en]

Aujourd’hui le moral bat un peu de l’aile. Parce qu’encore une fois je me retrouve HS, à plat, raide, et avec le petit mal de tête en prime, alors que ce qui a mené à cet état représente pour moi assez peu d’activité. Encore une fois, j’ai surestimé ce que je pouvais faire. Et ça me déprime de voir “combien peu” je peux me permettre de faire, juste là.

Je cogite beaucoup à comment gérer ça. Oui, oui, il faut réduire les attentes et ambitions. Croyez-moi, j’y travaille. J’essaie de lire tranquillement alors que l’armée de paparazzis tambourine à la porte, menaçant de la défoncer, qu’il y a des fuites d’eau au plafond et que des bombes tombent sur les immeubles d’à côté. Pas littéralement, vous m’aurez comprise. Les paparazzis, ce sont mes envies, mes obligations, mes responsabilités, mes projets, mes “ah oui je pourrais faire xyz”.

Concrètement, que faire? Quelques réflexions en vrac. On verra où ça me mène. Merci à toi, cher lecteur, chère lectrice, de faire ce bout de chemin avec moi.

Les “choses à faire”, elles sont à différents niveaux. Il y a les obligations plus ou moins obligatoires, les envies plus ou moins utiles, les choses qui nous font du bien et nous satisfont, les choses qui font plaisir, les choses qui font qu’on se sent moins coupable. Les choses qui nous coûtent et les choses qui nous ressourcent. Les choses qu’on doit et les choses qu’on veut, avec une frontière pas toujours très nette entre les deux.

Tâches au fil des jours et des semaines

Tout à l’heure, avant d’aller chercher mon ordi pour commencer à écrire ici, j’ai pris mon cahier et tenté de faire l’inventaire de mes tâches quotidiennes et hebdomadaires “obligatoires”. Pour l’exercice, on va éviter de débattre sur la signification de ce mot.

Chaque jour par exemple, il y a des choses comme:

  • préparer les repas
  • faire la vaisselle
  • donner les médics au(x) chat(s), prendre les miens
  • nettoyer la litière
  • arroser les plantes du balcon
  • relever le courrier
  • faire du petit rangement courant, au fur et à mesure
  • théoriquement, faire des exercices pour la physio (j’arrive quasi jamais)

Et puis à un rythme plus hebdomadaire (pour certaines tâches deux fois par semaine, d’autres toutes les deux semaines ou plus, ça varie):

  • faire les courses
  • faire la lessive
  • changer le capteur d’Oscar et son patch
  • divers rendez-vous médicaux et paramédicaux, véto y compris (à la louche, j’en ai minimum 5 de fixe, donc généralement 6, et parfois jusqu’à 8)
  • arroser les plantes d’intérieur
  • changer les draps
  • vider les poubelles diverses et variées
  • superviser le robot pendant qu’il fait le ménage
  • tenter d’aller au judo et (j’espère toujours) au chant

Et là, il n’y a vraiment que les choses de base. Ecrire, voir du monde et rester en contact avec mon cercle social (conséquent), rempoter les plantes, tenter d’améliorer l’entente entre les deux chats pour pouvoir descendre Oscar plus souvent, m’occuper de DF, boutiquer avec ChatGPT et autres LLM, gérer mon admin perso (citoyen et digital), rendre quelques menus services à mes proches… Sans compter que les choses comme la vaisselle, les paiements et le petit rangement, les habits propres sortant de la lessive, si on n’a pas pu faire à mesure, ça s’accumule.

On est d’accord que ce n’est pas un problème nouveau chez moi, la gestion du quotidien et des affaires domestiques. Mais depuis mon diagnostic et mon traitement, c’était quand même assez sous contrôle. Alors que je travaillais! Et là, avec traitement, j’ai l’impression d’être de retour à la case départ. Pas toujours bien sûr, et au moins je comprends ce qu’il se passe et je me blâme moins, mais c’est vraiment frustrant de voir combien “juste vivre” me prend à peu près toute mon énergie.

Jeudi

J’ai fait quoi, là, pour me retrouver HS? J’ai tenté d’y aller mollo cette semaine. Et j’ai mieux réussi que celle d’avant. J’avais des journées “vides” dans le calendrier – mais que je me suis bien entendu pressée de remplir malgré ma ferme intention de les maintenir en mode “repos”. Jeudi par exemple, journée “repos” après ma séance d’entrainement cognitif de la veille (je confirme, l’entrainement cognitif ça me met HS pour 24-48h). J’ai écrit un article, reçu une livraison de puzzles qui m’a lancée dans une analyse des différentes versions des puzzles Heye des oeuvres de Rosina Wachtmeister, réfléchi à un escalier plus adapté pour qu’Oscar puisse monter et descendre du canapé du balcon en sécurité, après l’avoir vu “ripper” à la descente sur les marches de l’escalier zooplus en place, nettoyé une plante envahie de bestioles que j’avais mise en quarantaine la veille dans la baignoire (les deux autres attendent toujours), dépendu la lessive, fait un saut chez le véto pour chercher du matériel pour perf sous-cutanée pour Oscar, importé les photos de mes dernières sorties dans Lightroom, appelé une copine (long téléphone), reçu la visite (courte) d’une autre, supervisé Oscar et Juju ensemble à l’eclau durant un petit moment. J’avais prévu de faire des courses à la Migros, et j’ai sagement renoncé.

Vendredi

Ça vous fatigue? Moi aussi. Et honnêtement, c’était une journée plutôt light. La preuve, le lendemain je me suis réveillée sans mal de tête. Le lendemain, donc, vendredi, avant-hier, j’ai pris le train pour aller à Berne et manger avec une collègue – rendez-vous prévu de longue date et que j’ai choisi de maintenir, avec raison, c’était vraiment très chouette. Avant de partir j’ai changé le capteur d’Oscar et eu la présence d’esprit de faire ma vaisselle du matin. Dans le train à l’aller, j’ai fait un premier jet d’un document que je dois pondre. A mon retour, j’ai réussi à bouquiner dans le train – j’avais un léger mal de tête arrivé en fin de repas de midi, comme quoi déjà 1h et quelque de discussion intense et sympathique ça fait déjà surchauffer mes neurones.

De retour à la maison j’ai réussi à me poser. J’ai mis le ventilateur sur le balcon, bouquiné un peu, et fait une sieste. Puis j’ai réalisé que j’avais de quoi “bricoler” un meilleur escalier pour Oscar à la cave, et je suis descendue chercher le matériel pour l’installer. J’ai mangé un truc en vitesse, et je suis partie à mon stage de judo, malgré la fatigue. Parce que ça faisait plusieurs semaines que je me réjouissais d’aller à ce stage. Pas pour pratiquer, mais pour assister mon prof et enseigner un peu, ce que j’aime bien faire. Et du coup je me sens un peu utile, aussi. Je suis rentrée du stage bien fatiguée. J’ai aussi vu combien c’est limitant de ne pas pouvoir démontrer beaucoup de ce qu’on explique – que ce soit à cause de mon épaule ou ma tête (pas de chocs!) J’ai quand même montré un peu, ce qui me semblait faisable, et évidemment, il y a 2-3 trucs que je n’aurais pas dû faire. Je suis rentrée, j’ai mangé, je me suis couchée trop tard parce que je suis restée coincée sur facebook (récurrent ces temps, oui oui “je sais” qu’il faut pas, merci de l’info). J’ai quand même eu un nombre d’heures de sommeil correctes.

Samedi

Réveil hier avec un petit mal de tête. Surprise? non. Embêtée? oui. Parce que je sais ce que ça veut dire et je veux pas. Allez, matinée tranquille. Installé une caméra de surveillance sur le balcon pour voir si Oscar gère bien son nouvel escalier. Trainouillé en ligne et avec les chats. Midi. Ouille! Le stage commence à 14h, et il faut vraiment que je fasse des courses. Je file à la Migros. Je fais les grosses courses, j’en ai pour une heure, je rentre avec un sacré mal de caillou (pour moi, hein, mes maux de tête sont pas “horribles” sur une échelle absolue). Je sais que je ne devrais pas aller au stage, c’est pas raisonnable, mais j’ai envie. Et hier je me suis proposée pour gérer la caisse et les inscriptions, donc je me sens responsable. Pas le temps de ranger les courses, je mets en catastrophe ce qui doit aller au frigo au frigo, je bricole une salade de pâtes que j’avale vite fait, je saute sur mon vélo et je vais au dojo.

Je suis contente d’être au stage, je travaille avec deux jeunes motivés et adorables (j’espère qu’ils ne liront jamais ça parce qu’ils vont sûrement trouver extrêmement “cringe”). J’ai quand même prévu un filet de sécurité: je me suis dit (et j’ai prévenu) que suivant l’état je partirai à la pause. Ça ne pose aucun souci, hein, sauf à moi. J’ai toujours mal à la tête, donc à la pause je prends mon medikinet et un ibuprofen (on sait jamais). Je devrais peut-être rentrer, mais je veux rester pour continuer le travail commencé avec “mes” deux jeunes. Eh oui, voyez, je me sens de nouveau “responsable“. Alors que, c’est juste moi, hein. Je précise. Personne ne me fait ça que moi-même. Pas le temps de vraiment décider, une discussion sympa plus tard autour d’un thé froid, le cours reprend et moi je reprends ma place sur les tapis. Contente d’être là! Mais c’est pas raisonnable. Il me faudra une bonne quinzaine minutes de tergiversations internes, le constat que ni medikinet ni ibuprofen ne font quoi que ce soit à mon mal de tête, quelques brefs échanges avec une copine pour lui confier la caisse si je ne viens pas demain et les jeunes pour la suite du cours, et quelques larmes difficilement retenues pour me décider à faire ce que je sais très bien que j’aurais déjà dû faire: rentrer.

Qu’est-ce que ça me coûte, ce genre de chose.

Je pleure un coup en me changeant, je rentre, j’essaie très fort de voir ça comme une victoire (car je sais que c’en est une) et non un échec (c’est ainsi que je le ressens au fond de moi). Je me pose sur le balcon, je reste tranquille, je me félicite d’avoir levé le pied. Je passe du temps à gratouiller Juju, je traine sur le balcon avec Oscar et en profite pour lui faire sa perf, je me mets en mode “off”. Je suis trop raide pour faire la vaisselle, trop raide pour ranger les courses. Je me dis que je vais tester une recette de blancs de poulet farcis que m’a donnée une copine, pour le souper. Mais en fait non, je suis trop raide, et la cuisine est en chaos. Allez, repas facile. Le soir, pour la première fois depuis plusieurs jours, j’arrive à me mettre au lit et à lâcher mon tél assez tôt pour pouvoir lire plus que deux paragraphes avant de m’effondrer.

Dimanche

Ce matin, je me réveille à nouveau avec mal à la tête. J’ai “bien” dormi. Je vais y aller mollo. Objectif: la vaisselle et les courses à ranger, parce que là ça commence vraiment à me tomber sur le moral. Mais je suis HS, déjà. Je descends, je fais un peu de puzzle. Je suis lancée, et je sens que même ça, ça me demande un petit effort. Un puzzle, normalement, c’est le truc qui me repose le cerveau. Ça se fait tout seul. Là, je sens que c’est moins fluide. Je ne me force pas, hein. Mais je sens ce signal de fatigue. Donc la vaisselle attendra. Les courses aussi. Et vers 13h, quand je lâche le puzzle et que je remonte pour me faire à manger, je réalise que les poitrines de poulet farcies attendront aussi.

Il est 15h30, et je ne suis pas au stage de judo, alors qu’aujourd’hui c’est le sol, ma discipline favorite. Et j’ai un mal fou à ne pas ressentir ça comme un échec.

Comment faire mieux?

Leçons de vie de judoka

Le judo, ça fait 30 ans que j’en fais. Et indépendamment des techniques, de la condition physique, et de ce qui va avec, le judo a ancré en moi une certaine vision du monde, une certaine attitude face au monde. Par exemple:

  • essayer quelque chose, observer le résultat, essayer de nouveau, observer le résultat, ajuster notre quelque chose et ressayer, observer le résultat…
  • tomber huit fois, se relever neuf fois
  • quand on croit qu’on peut plus, on peut encore.

Tiens, c’est marrant, j’avais fait un exercice un peu similaire sur les leçons du judo pour la vie il y a 10 ans.

Le premier point, j’en ai pris conscience récemment, c’est une vision profondément interactionnelle des rapports entre les gens. Au cours de ma formation en systémique, je me suis souvent demandée pourquoi cette façon de voir les choses m’est si naturelle alors que pour beaucoup de gens, elle ne va pas de soi. Que ce soit clair, ce n’est pas la seule raison (je pourrais faire un article à ce sujet, tiens), mais le fait de pratiquer depuis aussi longtemps une discipline où on ressent directement dans son corps que action => réaction, ça fait quelque chose.

Le deuxième, c’est la ténacité. On essaie encore. Une défaite ou un échec, ce n’est jamais final. On se relève et on repart au combat. Une chute, ce n’est pas la fin du monde.

Le troisième, il rejoint un peu le deuxième, mais pas que. Il nous dit que nos limites ne sont pas ce qu’on croit. Quand on est immobilisé au milieu d’un combat, en compétition, et qu’on n’a plus de jus, qu’on n’en peut plus, qu’on est cuit, qu’on commence à accepter que c’est fini, qu’on a perdu… on découvre parfois qu’on peut encore. Je me souviens très bien de ce moment. J’ai entendu mon prof, qui me coachait du bord du tapis, me dire “allez sors! ne perds pas maintenant!” – je n’y croyais pas, j’ai donné tout ce que j’avais et même ce que je ne savais pas que j’avais, et je suis sortie de l’immobilisation où l’autre me tenait. Ça ne vous surprendra pas, je pense, d’entendre que c’est une de mes forces en combat, de dépasser mes limites.

Mais ça, ça va un moment.

Ça va quand on est jeune. Ça va quand on est en forme. Ça va quand il s’agit d’effort physique et de force, de résistance et d’endurance. Ça va quand c’est ponctuel.

Avec les décennies, j’ai dû apprendre à les écouter, mes limites, plutôt que les dépasser. Pour éviter de me blesser. Le corps, c’est facile. J’ai appris aussi que ce n’est pas parce que je peux porter de lourdes charges que c’est une bonne idée de le faire. Après, j’ai mal au dos. Ce n’est pas parce que je peux chuter des dizaines de fois que c’est une bonne idée de le faire.

Cette leçon inverse est beaucoup plus difficile pour moi à intégrer pour ce qui est de l’effort cognitif ou de la fatigue mentale. Pas de surprise, hein.

Donc, comment faire mieux?

Je sais, ça devient long. Merci si vous êtes encore là à lire. Moi, en tous cas, je suis encore là à écrire. Et je me demande comment faire mieux avec mes journées, mes tâches et mon énergie. Et même si en ce moment j’ai un coup de mou, je vais me relever, et essayer encore une fois de passer cette satanée technique qui me résiste. Sans me blesser.

Je pense qu’il y a deux clés:

  1. la priorisation
  2. la flexibilité

Le premier point a toujours été une grande difficulté pour moi (merci TDAH). Quant au deuxième, je crois que j’ai récemment fait de gros progrès: je me dis “tout est annulable, si je ne suis pas en état”. Je préviens les gens avec qui je conviens de projets et de rendez-vous. Une copine m’a donné un bon truc pour les “tâches à faire”: ne pas juste prévoir une plage, mais prévoir une fenêtre de temps (entre mardi et jeudi par exemple) avec une plage plan A, une plage plan B, plan C. L’idée étant que cela ôte la pression de “faire quand même” si je n’ai pas l’énergie quand arrive la plage choisie, vu qu’il y a un plan B et un plan C derrière pour me rattraper.

Pour les priorités, je vois les choses comme ça, actuellement. La base, c’est la gestion de mon ménage, de ma santé, de mon administratif. L’administratif, c’est pour ne pas avoir de problèmes de sous (ou pire). La santé, c’est pour se remettre sur pied et ne pas tomber malade (sans blague). Et le ménage, c’est parce que l’état de mon environnement a un très gros impact sur mon moral. Surtout dans cette période où par la force des choses je passe beaucoup de temps à la maison, m’installer jour après jour sur un balcon en désordre, ça finit par me miner.

Santé

La santé, ce sont surtout des rendez-vous. Ils sont là. Je pense que je ne les répartis pas bien sur la semaine, parce que je me retrouve avec des jours à 4 rendez-vous, et ça c’est trop. Mais ça, c’est aussi parce que je ne veux pas “bloquer” toutes mes journées avec des rendez-vous. J’espère encore pouvoir me dire “oh, je vais faire une randonnée”, ou bien sortir le bateau, ou bien pourquoi pas, avoir une journée toute libre pour trier des affaires. Donc, la répartition optimale des rendez-vous médicaux (rappel: 5 récurrents, souvent 6 ou 7) c’est encore à travailler. Et peut-être, parmi ces rendez-vous, il y a des choses à reprioriser. Je vais y réfléchir…

La santé, c’est aussi “bien dormir, bien manger, bien s’entrainer”, comme disait mon prof de judo. Dormir, ça va, une fois que je suis dans mon lit avec mon bouquin. Le problème c’est d’y arriver. Premièrement dans le lit, deuxièmement avec le bouquin. Là, clairement, il y a une marge d’amélioration. J’ai besoin de trouver une stratégie qui fonctionne pour moi par rapport à ça. Réflexion en cours. Manger, ça va, même s’il y a des jours un peu bof, globalement je mange équilibré (et je mange tout court, ça c’est sûr, je ne suis pas du genre à être capable de sauter un repas, j’ai trop la dalle). S’entraîner, faire de l’exercice physique, donc, c’est moins simple, parce que mon épaule est encore convalescente, mon cerveau doit éviter les chocs, et ma fatigabilité est grande. Donc, me pointer au cours de judo pour bouger un peu, comme je l’ai fait ces derniers temps, c’est bien. La physio, c’est bien. Me déplacer à vélo, même si c’est un peu court, c’est bien aussi. Ce qui manque là-dedans c’est peut-être sortir marcher – sauf si ça se confirme que l’impact répété de la marche ne fait pas de bien à ma tête. Malheureusement je n’aime pas nager (au-delà de barboter) et je n’ai plus de vélo d’appartement (c’est quand même vachement bien pour transpirer sans impact). Roller peut-être?

Admin

Ah, l’administratif. Il y a des choses que je fais à mesure: payer les factures quand elles arrivent (merci l’app Postfinance et les QR-codes), et souvent, envoyer les demandes de remboursement (frais médicaux des chats, par exemple). Mais pas toujours et pas tout. Et il y a de l’admin “non trivial”, qui traine et s’accumule, auquel on repense toujours au mauvais moment et avec une culpabilité croissante. Moi en tous cas. En 2019, quand je récupérais de mon burnout, j’avais fait quelque chose qui marchait assez bien: j’avais prévu une plage hebdomadaire pour ça. Si je reprendre cette idée aujourd’hui, ce n’est pas juste une plage que je devrais prévoir, mais aussi la plage plan B ou plan C. Peut-être que plan B suffit, parce qu’au train où ça va, si je saute une semaine d’admin de temps en temps ce sera pas pire que maintenant. Donc voilà l’idée: deux plages de deux heures dans la semaine pour faire mon admin. Et si je le fais lors de la première, la deuxième se libère. Reste à voir quand, et si j’arrive à mettre une plage stable avec la valse des rendez-vous.

Ménage

Nous y sommes. Dans ma vie idéale, mon ménage est fait à mesure et mon appart est sous contrôle. Je ne me suis jamais mise une pression de dingue pour ça, parce que vraiment, les tâches ménagères c’est pas ce que je préfère. Mais le résultat c’est que je vis souvent dans un appart qui me “stresse” car partout autour de moi il y a les rappels visibles des choses à faire. Les plantes à rempoter, le rideau de balcon à trouver, le coin vide-sacs à ranger, etc.

Quand on fait ce qu’on peut faire à mesure, tout va mieux. La vaisselle, la lessive… un brin de ménage. Ça fonctionnait plutôt bien avant mon accident. J’avais même radicalement changé ma façon de voir le ménage et réussi à lancer une grande opération “rangements de fond, réaménagement et déco“. Mais maintenant c’est le débandade. Je pense que je sais pourquoi: je n’ai plus la structure que donnent les horaires de travail à la vie, tout flotte un peu, et en plus, je fonctionne globalement moins bien et suis plus fatiguée. Il est certainement temps, pour ce type de chose en tous cas, de reprendre la pratique de planifier le déroulement de mes journées. Ça ne veut pas dire les remplir, car on peut planifier du vide ou du libre. Mais je pense qu’en l’état, les choses comme la vaisselle et le ménage, c’est peut-être pas inutile que je me rappelle que ce n’est pas trivial pour moi, et que ça prend du temps, et de l’énergie. Et peut-être que je peux faire ça en appliquant aussi la méthode “plan A, plan B”. Je prévois 15 minutes après le repas pour faire la vaisselle. Et je prévois aussi 15 minutes avant le repas d’après pour si je ne l’ai pas faite. Ou alors, une plage large d’une heure de rattrapage vaisselle tous les deux jours? Idem avec la lessive. Je sais quand est mon jour de lessive, mais je retombe dans ma pratique ancienne d’improviser cette tâche (cette collection de tâches, en fait, depuis mettre en route la première machine jusqu’à ranger les habits dans l’armoire le lendemain). Et le ménage proprement dit, idem. Quand je travaillais, j’avais des samedis bloqués pour ça.

Le thème qui semble se dégager de tout ça, à ce stade, c’est structure.

Et le reste, alors?

Le reste, ça vient après. Ecrire, trier les cartons, voir les copines, rempoter les plantes, optimiser ma maison connectée, jouer avec ChatGPT pour classer mes clips vidéos des aventures de Juju à l’eclau, sortir faire du bateau… tout ça vient après la base, et en fonction de l’énergie qui me restera. Qui ne sera pas assez d’énergie, je le sais déjà. Et peut-être que parmi le reste, il faudra prioriser. Combien de rencontres avec interaction sociale intense est-ce que je m’autorise dans la semaine? Est-ce que je range ou bien j’écris? Je sors faire du bateau ou bien je trie mes habits? J’amène la voiture au garage pour changer les pneus ou bien je vais chez IKEA? Tout ceci en tenant compte de la nécessité des plages de repos et de la flexibilité “plage plan A, plage plan B, plan C”.

Franchement la perspective de tout ça me tord le bide. Mais j’ai bien compris: plus je fais d’excès maintenant (les “excès” qui me laissent à plat et avec mal au crâne), plus cette période où je suis limitée va se prolonger. Et je sais déjà qu’une fois dans la semaine, j’ai une séance d’entrainement cognitif qui me pousse à mes limites (c’est voulu).

Bon honnêtement, je ne sais pas si qui que ce soit va lire ça en entier (ni même si moi je me lirais), mais réfléchir à haute voix par écrit m’a beaucoup aidée, encore une fois.

Je vais manger un snack et sortir mon calendrier pour voir ce que j’arrive à commencer à mettre en place de tout ça!

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.

Abonné

“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!

Batch Categories 0.9 [en]

Batch Categories for WordPress has been fixed and enhanced. If you have major category jobs to do, it can probably help you. Feedback and testers welcome.

[fr] Batch Categories pour WordPress a été corrigé et fonctionne à  présent. Le compagnon idéal si vous desirez changer les catégories de nombreux billets en même temps.

Batch Categories 0.9 is out! It’s the ideal companion for large-scale post-import messy category work. List all posts belonging to a category or matching a keyword, and edit their categories, easily visible at a glace with a collection of sexy drop-down lists. What’s new since the the first draft?

  • It now works, and does not “eat” categories without a warning. (Pretty nice of it, huh?)
  • It tells you what it did — which categories it added to which posts, and which ones it removed.
  • Add a whole bunch of posts to a category with one click.
  • Remove a whole bunch of posts from a category with one click.
  • Ensures that all the categories for a post are always listed, whatever the setting for the limit number of drop-down lists.
  • This is what it can look like.

You can still access it as a plugin or edit the Edit navigation menu, as described in my post introducing Batch Categories. If you’re in a hurry, just drop the PHP file into your wp-admin directory and send your browser straight on it.

Next steps?

  • Gather feedback from courageous testers (please don’t blame me if you haven’t backed up your post2cat table and things go wrong) for chasing the last bugs, improving interface and functionality.
  • Redo the code which generates the drop-down lists to take advantage of the category cache, and avoid flooding the database with useless queries.
  • Allow more subtle selection of posts: combinations of categories (AND/OR/NOT), categories without their subcategories…
  • Anything else you would want…?

Update 24.07.04: BB made me notice that “All” and “None” didn’t make much sense in the drop-down which allows one to select the categories to display. Replaced them in v. 0.91 by “Any category”.

Life and Trials of a Multilingual Weblog [en]

Here is an explanation of how I set up WordPress to manage my bilingual weblog. I give all the code I used to do it, and announce some of the things I’d like to implement. A “Multilingual blogging” TopicExchange channel is now open.

[fr] J'explique ici quelles sont les modifications que j'ai faites à WordPress pour gérer le bilinguisme de mon weblog -- code php et css à l'appui. Je mentionne également quelques innovations que j'ai en tête pour rendre ce weblog plus sympathique à mes lecteurs monolingues (ce résumé en est une!) Un canal pour le weblogging multilingue a été ouvert sur TopicExchange, et vous y trouverez peut-être d'autres écrits sur le même sujet. Utilisez-le (en envoyant un trackback) si vous écrivez des billets sur le multinguisme dans les weblogs!

My weblog is bilingual, and has been since November 2000. Already then, I knew that I wouldn’t be capable of producing a site which duplicates every entry in two languages.

I think this would defeat the whole idea of weblogging: lowering the “publication barrier”. I feel like writing something, I quickly type it out, press “Publish”, and there we are. Imposing upon myself to translate everything just pushes it back up again. I have seen people try this, but I have never seen somebody keep it up for anything nearing four years (this weblog is turning four on July 13).

This weblog is therefore happily bilingual, as I am — sometimes in English, sometimes in French. This post is about how I have adapted the blogging tools I use to my bilingualism, and more importantly, how I can accommodate my monolingual readers so that they also feel comfortable here.

First thing to note: although weblogging tools are now ready to be used by people speaking a variety of languages (thanks to a process named “localization”), they remain monolingual. Language is determined at weblog-level.

With Movable Type, I used categories to emulate post-level language awareness. This wasn’t satisfying at all: I ended up with to monstrous categories, Français and English, which didn’t help keep rebuild times down.

With WordPress, the solution is far more satisfying: I store the language information as Post Meta, or “custom field”. No more category exploitation for something they shouldn’t be used for.

Before I really got started doing the exciting stuff, I made a quick change to the WordPress admin interface. If I was going to be adding a “language” custom field to each and every post of mine, I didn’t want to be doing it with the (imho) rather clumsy “Custom Fields” form.

In edit.php, just after the categorydiv fieldset, I inserted the following:

<fieldset id="languagediv">
      <legend>< ?php _e('Language') ?></legend>
	  <div><input type="text" name="language" size="7"
                     tabindex="2" value="en" id="language" /></div>
</fieldset>

(You’ll probably have to move around your tabindex values so that the tabbing order makes sense to you.)

I also tweaked the wp-admin.css file a bit to keep it looking reasonably pretty, adding the rule below:

#languagediv {
	height: 3.5em;
	width: 5em;
}

and adding #languagediv everywhere I could see #poststatusdiv, so that they obeyed the same rules.

In this way, I have a small text field to edit to set the language. I pre-set it to “en”, and have just to change it to “fr” if I am writing in French.

We just need to add a little piece of code in the form processing script, post.php, just after the line that says add_meta($post_ID):

 // add language
	if(isset($_POST['language']))
	{
	$_POST['metakeyselect'] = 'language';
        $_POST['metavalue'] = $_POST['language'];
        add_meta($post_ID);
        }

The first thing I do with this language information is styling posts differently depending on the language. I do this by adding a lang attribute to my post <div>:

<div class="post" lang="<?php $post_language=get_post_custom_values("language"); $the_language=$post_language['0']; print($the_language); ?>">

In the CSS, I add these rules:

div.post:lang(fr) h2.post-title:before {
  content: " [fr] ";
  font-weight: normal;
}
div.post:lang(en) h2.post-title:before {
  content: " [en] ";
  font-weight: normal;
}
div.post:lang(fr)
{
background-color: #FAECE7;
}

I also make sure the language of the date matches the language of the post. For this, I added a new function, the_time_lg(), to my-hacks.php. I then use the following code to print the date: <?php the_time_lg($the_language); ?>.

Can more be done? Yes! I know I have readers who are not bilingual in the two languages I use. I know that at times I write a lot in one language and less in another, and my “monolingual” readers can get frustrated about this. During a between-session conversation at BlogTalk, I suddenly had an idea: I would provide an “other language” excerpt for each of my posts.

I’ve been writing excerpts for each of my posts for the last six months now, and it’s not something that raises the publishing barrier for me. Quickly writing a sentence or two about my post in the “other language” is something I can easily do, and it will at least give my readers an indication about what is said in the posts they can’t understand. This is the first post I’m trying this with.

So, as I did for language above, I added another “custom field” to my admin interface (in edit-form.php). Actually, I didn’t stop there. I also added the field for the excerpt to the “simple controls” posting page that I use (set that in Options > Writing), and another field for keywords, which I also store for each post as meta data. Use at your convenience:

<!-- BEGIN BUNNY HACK -->
<fieldset style="clear:both">
<legend><a href="http://wordpress.org/docs/reference/post/#excerpt"
title="<?php _e('Help with excerpts') ?>"><?php _e('Excerpt') ?></a></legend>
<div><textarea rows="1" cols="40" name="excerpt" tabindex="5" id="excerpt">
<?php echo $excerpt ?></textarea></div>
</fieldset>
<fieldset style="clear:both">
<legend><?php _e('Other Language Excerpt') ?></legend>
<div><textarea rows="1" cols="40" name="other-excerpt"
tabindex="6" id="other-excerpt"></textarea></div>
</fieldset>
<fieldset style="clear:both">
<legend><?php _e('Keywords') ?></legend>
<div><textarea rows="1" cols="40" name="keywords" tabindex="7" id="keywords">
<?php echo $keywords ?></textarea></div>
</fieldset>
<!-- I moved around some tabindex values too -->
<!-- END BUNNY HACK -->

I inserted these fields just below the “content” fieldset, and styled the #keywords and #other-excerpt textarea fields in exactly the same way as #excerpt. Practical translation: open wp-admin.css, search for “excerpt”, and modify the rules so that they look like this:

#excerpt, #keywords, #other-excerpt {
	height: 1.8em;
	width: 98%;
}

instead of simply this:

#excerpt {
	height: 1.8em;
	width: 98%;
}

I’m sure by now you’re curious about what my posting screen looks like!

To make sure the data in these fields is processed, we need to add the following code to post.php (as we did for the “language” field above):

// add keywords
	if(isset($_POST['keywords']))
	{
	$_POST['metakeyselect'] = 'keywords';
        $_POST['metavalue'] = $_POST['keywords'];
        add_meta($post_ID);
        }
   // add other excerpt
	if(isset($_POST['other-excerpt']))
	{
	$_POST['metakeyselect'] = 'other-excerpt';
        $_POST['metavalue'] = $_POST['other-excerpt'];
        add_meta($post_ID);
        }

Displaying the “other language excerpt” is done in this simple-but-not-too-elegant way:

<?php
$post_other_excerpt=get_post_custom_values("other-excerpt");
$the_other_excerpt=$post_other_excerpt['0'];
if($the_other_excerpt!="")
{
	if($the_language=="fr")
	{
	$the_other_language="en";
	}

	if($the_language=="en")
	{
	$the_other_language="fr";
	}
?>
    <div class="other-excerpt" lang="<?php print($the_other_language); ?>">
    <?php print($the_other_excerpt); ?>
    </div>
  <?php
  }
  ?>

accompanied by the following CSS:

div.other-excerpt:lang(fr)
{
background-color: #FAECE7;
}
div.other-excerpt:lang(en)
{
background-color: #FFF;
}
div.other-excerpt:before {
  content: " [" attr(lang) "] ";
  font-weight: normal;
}

Now that we’ve got the basics covered, what else can be done? Well, I’ve got some ideas. Mainly, I’d like visitors to be able to add “en” or “fr” at the end of any url to my weblog, and that would automatically filter out all the content which is not in that language — maybe using the trick Daniel describes? In addition to that, it would also change the language of what I call the “page furniture” — titles, footer, and even (let’s by ambitious) category names. Adding language sensitivity to trackbacks and comments could also be interesting.

A last thing I’ll mention in the multilingual department for this weblog is my styling of outgoing links if they are written in a language which is not my post language, using the hreflang attribute. It’s easy, and you should do it too!

Suw (who has just resumed blogging in Welsh) and I have just set up a “Multilingual blogging” channel on TopicExchange — please trackback it if you write about blogging in more than one language!

Batch Category Editing For WordPress [en]

I put together an admin screen for WordPress today which allows changing multiple categories of multiple posts at the same time. Code available, no guarantees.

[fr] J'ai codé une extension à  WordPress qui permet d'éditer les catégories de nombreux billets en un coup. L'écran liste par exemple tous les billets d'une catégorie, accompagnés d'un certain nombre de selects. On effectue les modifications que l'on désire et on soumet le formulaire entier en une fois.

Update 13.07: A more recent version is out!

I had planned to give you a write-up of the beginning of my WordPress experience today. Unfortunately, I decided to clean up my categories somewhat before I did that, and I managed to badly mess things up.

The result is that I spent most of my day writing a Batch Categories admin screen to help me clean things up. It was something I had planned to do, and I suppose it will also be useful to other people.

If you want to play around: copy the code above into a file named batch-categories.php in your wp-admin directory. I highly recommend that you back up your wp_post2cat table before you get going. This script works for me, but hasn’t been tested much, and comes with no guarantees. It is not optimised either, so depending on how many posts and categories you list, the screen can very well take over half a minute to load!

There are still a few functionalities I want to add, in particular: assigning all listed posts to a category in one go (or removing them).

If you want pretty integration with the other screens of the Edit menu, you’ll have to tweak the navigation bar in edit.php, edit-comments.php, and moderation.php.

Update 24.06.04: I’ve uploaded a screenshot of the admin screen so you can see what it could look like.

Update II 24.06.04: Instead of hacking the Edit menu bars, you can also access the Batch Categories screen from the Plugins page: create a file called batch-access.php (e.g.) in your plugins directory. (Beware not to leave any whitespace after the ?>, though, or you’ll get errors. Promised, zips and more detailed documentation will follow.

Update 04.07.04: I tried using the script this morning, and it seems nastily broken (removed all categories for some posts). Use with caution, and get back to me if ever you hack it or modify it, I’m interested! I’ll look into this once I get back home from Vienna.

Update 12.07.04: The script now works as it should! Thanks to Ben and MooKitty for helping me nail the big nasty bug which was driving me bonkers! Two improvements I’m working on right now: making the code more efficient by using the category cache, and adding a “add all listed posts to category X” option.