Auditer les problèmes de performance WordPress avec wp profile

La commande wp profile est un peu comme une alternative à New Relic, capable d’identifier précisément quels composants ralentissent votre site WordPress. Initialement disponible en tant que package premium via runcommand, il est désormais gratuit sur GitHub.

Si vous cherchez un hébergeur compatible avec l’installation de wp profile, jetez un œil à Kinsta et FastNyx.

J’utilise régulièrement wp profile pour diagnostiquer les problèmes de performance chez mes clients sur Codeable. Tous les développeurs WordPress devraient s’en servir ! Après avoir suivi ce guide, vous serez plus proche de la résolution de la lenteur de votre site WordPress.

Installation du package wp-profile

Lancez cette commande pour installer wp profile :

wp package install wp-cli/profile-command

Vous devriez voir que le processus s’est déroulé avec succès et que la commande wp profile est maintenant disponible:

Updating /root/.wp-cli/packages/composer.json to require the package...
Using Composer to install the package...
---
Loading composer repositories with package information
Updating dependencies
Resolving dependencies through SAT
Dependency resolution completed in 0.120 seconds
Analyzed 3696 packages to resolve dependencies
Analyzed 101022 rules to resolve dependencies
Package operations: 1 install, 0 updates, 0 removals
Installs: wp-cli/profile-command:dev-master ef44df5
- Installing wp-cli/profile-command (dev-master ef44df5)
Writing lock file
Generating autoload files
---
Success: Package installed.Code language: JavaScript (javascript)

Si vous voyez une erreur concernant composer.json reverté, l’augmentation de la mémoire devrait résoudre ce problème.

Mettre à jour wp profile

Pour mettre à jour le package profile à la dernière version :

wp package update --allow-root

Utilisation de la commande wp profile

Placez-vous dans le dossier de votre installation WordPress (ou utilisez l’option --path à la fin de votre commande WP-CLI).

La commande wp profile peut donner des résultats variables : il est recommandé de la lancer plusieurs fois lors de vos benchmarks.

Commande wp profile stage

Cette commande affiche les différentes étapes du chargement de WordPress :

wp profile stage --allow-root

Vous obtiendrez un tableau détaillé. Concentrez-vous principalement sur la colonne time.

En général, vous souhaitez que votre cache_ratio soit élevé (plus de 70 %), que vos cache_hits dépassent les cache_misses, et que votre query_time reste faible.

Exemple de sortie :

+------------+---------+------------+-------------+-------------+------------+--------------+-----------+------------+--------------+---------------+
| stage      | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | hook_time | hook_count | request_time | request_count |
+------------+---------+------------+-------------+-------------+------------+--------------+-----------+------------+--------------+---------------+
| bootstrap  | 0.8193s | 0.004s     | 28          | 92.7%       | 559        | 44           | 0.1279s   | 2972       | 0s           | 0             |
| main_query | 0.0136s | 0.0039s    | 7           | 87.25%      | 130        | 19           | 0.0042s   | 219        | 0s           | 0             |
| template   | 0.2741s | 0.011s     | 30          | 96.94%      | 2442       | 77           | 0.2334s   | 7030       | 0s           | 0             |
+------------+---------+------------+-------------+-------------+------------+--------------+-----------+------------+--------------+---------------+
| total (3)  | 1.107s  | 0.0189s    | 65          | 92.3%       | 3131       | 140          | 0.3654s   | 10221      | 0s           | 0             |
+------------+---------+------------+-------------+-------------+------------+--------------+-----------+------------+--------------+---------------+

Vous pouvez approfondir chaque étape, par exemple pour bootstrap :

wp profile stage bootstrap --allow-root

Vous verrez alors les hooks utilisés à cette étape, avec leur temps d’exécution, le nombre de requêtes SQL, le ratio de cache, etc:

+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| hook                     | callback_count | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | request_time | request_count |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| muplugins_loaded:before  |                | 0.3076s | 0.0015s    | 4           | 76.47%      | 39         | 12           | 0s           | 0             |
| muplugins_loaded         | 2              | 0.0002s | 0s         | 0           | 100%        | 2          | 0            | 0s           | 0             |
| plugins_loaded:before    |                | 0.1897s | 0.003s     | 12          | 93.28%      | 222        | 16           | 0s           | 0             |
| plugins_loaded           | 33             | 0.0354s | 0s         | 0           | 100%        | 44         | 0            | 0s           | 0             |
| setup_theme:before       |                | 0.0003s | 0s         | 0           | 100%        | 4          | 0            | 0s           | 0             |
| setup_theme              | 1              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| after_setup_theme:before |                | 0.0149s | 0s         | 0           | 100%        | 40         | 0            | 0s           | 0             |
| after_setup_theme        | 20             | 0.0068s | 0s         | 0           | 100%        | 20         | 0            | 0s           | 0             |
| init:before              |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| init                     | 55             | 0.0261s | 0.0009s    | 12          | 92.08%      | 186        | 16           | 0s           | 0             |
| wp_loaded:before         |                | 0.0001s | 0s         | 0           | 100%        | 2          | 0            | 0s           | 0             |
| wp_loaded                | 8              | 0.0001s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp_loaded:after          |                | 0.0265s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| total (13)               | 119            | 0.6078s | 0.0054s    | 28          | 95.76%      | 559        | 44           | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

Pour afficher tous les hooks de chaque étape, utilisez :

wp profile stage --all --orderby=time --allow-root

Cela affiche tous les hooks triés par temps d’exécution :

+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| hook                     | callback_count | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | request_time | request_count |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| muplugins_loaded:before  |                | 0.178s  | 0.0009s    | 1           | 25%         | 1          | 3            | 0s           | 0             |
| muplugins_loaded         | 2              | 0.0003s | 0s         | 0           | 50%         | 1          | 1            | 0s           | 0             |
| plugins_loaded:before    |                | 0.2855s | 0.0041s    | 19          | 83.95%      | 136        | 26           | 0s           | 0             |
| plugins_loaded           | 34             | 0.2442s | 0.0009s    | 3           | 98.31%      | 116        | 2            | 0s           | 0             |
| setup_theme:before       |                | 0.0005s | 0s         | 0           | 100%        | 4          | 0            | 0s           | 0             |
| setup_theme              | 1              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| after_setup_theme:before |                | 0.2653s | 0.0011s    | 3           | 99.68%      | 615        | 2            | 0s           | 0             |
| after_setup_theme        | 17             | 0.0241s | 0.0002s    | 1           | 98.8%       | 82         | 1            | 0s           | 0             |
| init:before              |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| init                     | 82             | 0.261s  | 0.0016s    | 9           | 98.74%      | 703        | 9            | 0s           | 0             |
| wp_loaded:before         |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp_loaded                | 7              | 0.0012s | 0s         | 0           | 100%        | 6          | 0            | 0s           | 0             |
| parse_request:before     |                | 0.0192s | 0s         | 0           | 100%        | 14         | 0            | 0s           | 0             |
| parse_request            | 2              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| send_headers:before      |                | 0.0001s | 0s         | 0           | 100%        | 4          | 0            | 0s           | 0             |
| send_headers             | 0              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| pre_get_posts:before     |                | 0.0003s | 0s         | 0           | 100%        | 10         | 0            | 0s           | 0             |
| pre_get_posts            | 8              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| the_posts:before         |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| the_posts                | 2              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp:before                |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp                       | 10             | 0.068s  | 0.0148s    | 30          | 97.3%       | 756        | 21           | 0s           | 0             |
| template_redirect:before |                | 0.0005s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| template_redirect        | 20             | 0.0098s | 0.0005s    | 1           | 99.06%      | 105        | 1            | 0s           | 0             |
| template_include:before  |                | 0.0004s | 0s         | 0           | 100%        | 9          | 0            | 0s           | 0             |
| template_include         | 1              | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp_head:before           |                | 0.0028s | 0.0003s    | 2           | 85.71%      | 18         | 3            | 0s           | 0             |
| wp_head                  | 42             | 0.0887s | 0.004s     | 9           | 97.85%      | 682        | 15           | 0s           | 0             |
| loop_start:before        |                | 0s      | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
| wp_footer                | 14             | 0.0068s | 0s         | 0           | 100%        | 61         | 0            | 0s           | 0             |
| wp_footer:after          |                | 0.0002s | 0s         | 0           |             | 0          | 0            | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| total (31)               | 242            | 1.4571s | 0.0284s    | 78          | 90.8%       | 3323       | 84           | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

Pour une lecture plus claire, filtrez les valeurs nulles avec :

wp profile stage --all --spotlight --orderby=time --allow-root

C’est beaucoup plus lisible maintenant 🙂

+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| hook                     | callback_count | time    | query_time | query_count | cache_ratio | cache_hits | cache_misses | request_time | request_count |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+
| muplugins_loaded:before  |                | 0.2969s | 0.0016s    | 1           | 25%         | 1          | 3            | 0s           | 0             |
| muplugins_loaded         | 2              | 0.0002s | 0s         | 0           | 50%         | 1          | 1            | 0s           | 0             |
| plugins_loaded:before    |                | 0.2374s | 0.0021s    | 19          | 83.95%      | 136        | 26           | 0s           | 0             |
| plugins_loaded           | 34             | 0.2094s | 0.0004s    | 3           | 98.31%      | 116        | 2            | 0s           | 0             |
| after_setup_theme:before |                | 0.1991s | 0.0006s    | 3           | 99.68%      | 615        | 2            | 0s           | 0             |
| after_setup_theme        | 17             | 0.0299s | 0.0002s    | 1           | 98.8%       | 82         | 1            | 0s           | 0             |
| init                     | 82             | 0.3435s | 0.001s     | 9           | 98.74%      | 703        | 9            | 0s           | 0             |
| parse_request:before     |                | 0.0274s | 0s         | 0           | 100%        | 14         | 0            | 0s           | 0             |
| wp                       | 10             | 0.0747s | 0.0078s    | 30          | 97.3%       | 756        | 21           | 0s           | 0             |
| template_redirect        | 20             | 0.0102s | 0.0002s    | 1           | 99.06%      | 105        | 1            | 0s           | 0             |
| wp_head:before           |                | 0.0039s | 0.0004s    | 2           | 85.71%      | 18         | 3            | 0s           | 0             |
| wp_head                  | 42             | 0.0884s | 0.0021s    | 9           | 97.85%      | 682        | 15           | 0s           | 0             |
+--------------------------+----------------+---------+------------+-------------+-------------+------------+--------------+--------------+---------------+

Commande wp profile hook

Vous pouvez également examiner les hooks pour voir lesquels consomment le plus de temps.

wp profile hook --allow-root

Vous pouvez ordonner par temps d’exécution :

wp profile hook --orderby=time --allow-root

Ou n’afficher que les hooks les plus lents :

wp profile hook --spotlight --orderby=time --allow-root

Cela vous donne un aperçu rapide des hooks qui prennent le plus de temps à s’exécuter.

Commande wp profile plugin

Vous pouvez voir quels plugins prennent le plus de temps à se charger.

wp profile plugin --allow-root

Ou trier par temps :

wp profile plugin --orderby=time --allow-root

Ou n’afficher que les plugins les plus lents :

wp profile plugin --spotlight --orderby=time --allow-root

Cela vous permet de repérer rapidement les plugins qui ralentissent votre site WordPress.

Commande wp profile theme

Vous pouvez également voir combien de temps votre thème WordPress prend à se charger.

wp profile theme --allow-root

Commande wp profile list

Vous pouvez voir toutes les commandes disponibles dans le package profile avec :

wp profile listCode language: PHP (php)

Conclusion

La commande wp profile est un outil extrêmement utile pour diagnostiquer les problèmes de performance de WordPress. Elle vous permet d’identifier rapidement les plugins, thèmes ou hooks qui ralentissent votre site. Vous pouvez alors prendre des mesures ciblées pour améliorer la vitesse de votre site, comme désactiver ou remplacer les composants problématiques, ou optimiser leur code.

Si vous souhaitez une aide professionnelle pour diagnostiquer et résoudre les problèmes de performance de votre site WordPress, vous pouvez me contacter via Codeable.

Besoin d’un partenaire fiable pour votre projet WordPress/WooCommerce ? Je mets mon expertise à votre service pour des résultats concrets.

Bénéficiez d’un accompagnement personnalisé »

Matt

Développeur certifié WordPress & WooCommerce chez Codeable, administrateur système et enseignant-chercheur, je mets mon expertise au service de vos projets web.

Ma priorité : des sites performants, fiables et sécurisés, pensés pour offrir la meilleure expérience utilisateur. J’accompagne chaque client avec écoute et pédagogie, pour transformer vos idées en solutions concrètes et durables.

Profitez de solutions WordPress et WooCommerce sur-mesure, pensées pour optimiser durablement votre site.
Explorez les leviers pour booster l’impact de votre site web.

Opinions