Comment changer le thème wordpress depuis la base de données

Cet article vous explique comment changer le thème WordPress directement depuis la base de donnée.

Il m’est arrivé de travailler sur un thème wordpress qui utilisait une librairie spécifique pour gérer les templates, Timber. Timber permet d’utiliser des vues au format  twig ce qui est nettement plus propre et maintenable que le PHP que l’on voit dans l’écrasante majorité des thèmes.

Lors de l’installation d’une instance spécifique, le plugin Timber a était désactivé, ce qui fait que WordPress ne bootait plus du tout, que ce soit le front ou l’admin.

L’astuce pour pouvoir accéder à l’admin dans ce genre de cas consiste à changer le thème courant directement dans la base de données.

Pour cela, vous devez changer 2 variables de la table wp_options, template et stylesheet.

Pour afficher le contenu actuel de ces 2 variables

SELECT * FROM wp_options WHERE option_name = 'template';
SELECT * FROM wp_options WHERE option_name = 'stylesheet';

Changer le theme wordpress depuis la base de données

UPDATE wp_options SET option_value = 'spun' WHERE wp_options.option_id = 44;
UPDATE wp_options SET option_value = 'spun' WHERE wp_options.option_id = 45;

WordPress en ligne de commande

Il existe une autre technique pour manipuler l’installation d’un wordpress, l’interface en ligne de commande, wp.

Ce client permet de faire à peut prêt n’importe quoi sur son installation, comme ajouter, mettre à jour supprimer des plugins. Cela m’a sauvé plus d’une fois lorsqu’un plugin non à jour empêcher wordpress de fonctionner complètement.

Vous pouvez aussi manipuler directement le core de WordPress comme faire une mise à jour, et plus globalement manipuler n’importe quel entité de WordPress, un post, une taxonomie, etc…

 

WordPress: désactiver le versioning des articles

WordPress intègre un mécanisme de gestion de version des articles et pages que vous publiez. A chaque fois que vous enregistrez un article, la version précédente est conservée. Cela permet de revenir en arrière ou de récupérer du contenu qui aurait été effacé par mégarde.

Dans certains contextes vous pouvez avoir besoin de désactiver cette fonctionnalité. Pour ma part, c’est pour un blog sauvegardé quotidiennement et dont les articles sont d’abord rédigés dans google docs. L’idée ici est de ne pas encombrer la base de données avec des révisions dont on ne se sert pas.

Désactiver la gestion des versions

La désactivation se fait simplement dans le fichier de config wp-config.php en ajoutant la ligne suivante :

define(’WP_POST_REVISIONS’, false);

Nettoyage des anciennes révisions

Si vous désactivez la gestion des révisions sur une base déjà en place, vous pouvez effacer les révisions existantes pour nettoyer la base de données.

Une première méthode est d’utiliser un plugin conçu pour cette tâche :

  • WP Optimize qui permet aussi de faire tout un tas d’autres choses

Sinon vous pouvez aussi le faire directement dans la base de données :

DELETE FROM wp_posts WHERE post_type = "revision";

DELETE a,b,c
 FROM wp_posts a
 LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
 LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
 WHERE a.post_type = "revision";

La 1ere requête permet de supprimer les révisions et la seconde les meta-données associées à ces révisions.

 

WordPress : load important à cause de la tâche cron

Premiers symptômes

Le blog est down!!

Voilà ce que j’ai pu observer sur un serveur hébergeant un site sous WordPress :

$ w

18:21:28 up 104 days, 2:05, 3 users, load average: 121.49, 116.51, 105.74
[...]

$ tail -f access.log | grep_and_awk_magic
[...]
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:16:59 +0200] "POST /wp-cron.php?doing_wp_cron=1471968693.4946770668029785156250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 224/224821178
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:16:59 +0200] "POST /wp-cron.php?doing_wp_cron=1471968692.3692688941955566406250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 224/224903575
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:18:17 +0200] "POST /wp-cron.php?doing_wp_cron=1471968868.4862370491027832031250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 148/148257345
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:17:22 +0200] "POST /wp-cron.php?doing_wp_cron=1471968716.2659339904785156250000 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 203/203774409
[...]

Comme c’est bizarre… la machine s’appelle elle-même…

Pour effectuer des tâches périodiques, WordPress utilise un système où à chaque requête il exécute un mécanisme pour vérifier si il y a des tâches à déclencher.

Malheureusement, en cas de fort traffic, il se peut que ce système ce tire une balle dans le pied en augmentant la charge du serveur.

Correction du problème

Pour corriger le problème, vous pouvez désactiver tout simplement ce mécanisme dans la configuration WordPress et mettre en place une tâche cron des familles.

wp-config.php

define('DISABLE_WP_CRON', true);

crontab -e

42 * * * *      cd /blog && php wp-cron.php

 

WordPress: utiliser les shortcodes dans les descriptions de catégories

shortcode-ultimate-4x

Shortcodes ultimate est un plugin wordpress qui permet d’installer un nombre important de shortcodes prédéfinis (Youtube, audio, formatage, …).

J’utilise le champ de description des catégories pour apporter du contenu riche dans les listings d’articles liés à une catégorie. Malheureusement les shortcodes par défaut ne sont pas activés dans ces champs.

Configuration des shortcodes pour les descriptions de catégorie

Pour les activer, il suffit d’ajouter un filtre dans votre fichier functions.php

add_filter('term_description', 'shortcode_unautop');
add_filter('term_description', 'do_shortcode');

 

 

Passer un wordpress dans un git

Le but de cette procédure est de pouvoir suivre plus facilement les changements apportés à wordpress et d’utiliser les outils usuels de déploiement.

Le dépôt nous permet aussi de tester en amont les mises à jour wordpress et des extensions.

 

Initialiser le dépôt git

$ cd wordpress
$ git init

Ajouter un .gitignore

La configuration ne va pas être enregistrée dans le git, on ignore donc le fichier de config.

$ cat .gitignore
wp-config.php

 

Ajouter tous les fichiers de wordpress

$ git add -A

Enregistrer le commit

$ git commit -m "initial commit"

 

Configurer le dépôt

$ git remote add origin git@gitou.com:charlybr/wordpress.git

Soumettre le code sur le dépôt distant

$ git push -u origin master