Optimiser le SEO de WordPress


Nos thématiques d'optimisation SEO :

Vous trouverez dans cette catégorie l’ensemble des codes donnés dans ce livre de référencement.

Vous pouvez également consulter la catégorie Référencement WordPress de SeoMix pour trouver des articles complets et ciblés sur certains aspects de la visibilité de ce CMS.


Modèle de fichier WP Config de WordPress

Filtrer les articles récents selon leur catégorie

Le code

Redirections automatiques de la pagination des auteurs sous WordPress

Le code

Ajouter les étiquettes de WordPress aux autres Post Types

Ici un exemple pour ajouter les étiquettes de WordPress aux pages

Supprimer les étiquettes de WordPress (Ch.18.)

Utilisez ce code

Ne pas afficher deux fois le même contenu (ch.14.)

Code d’exemple pour ne pas afficher deux fois un article dans une page avec deux boucles (code d’exemple)

Détecter une page de commentaire et éviter la duplication de contenu (ch.14.)

Utiliser ce code en remplacement du simple the_content dans vos fichiers de thèmes affichant des contenus (single.php, singular.php, …)

Ajouter du contenu à la fin d’une publication (ch.14.)

Ajouter ce code :

Ajouter PageNavi à WordPress (Ch.13.)

Une fois installée, activée et paramétrée, il faut ajouter ce code dans votre thème Il remplacera des codes qui peuvent être les suivants :

La boucle par défaut de WordPress (Ch.1.)

Voici à quoi ressemble la boucle par défaut de WordPress, boucle servant à afficher dans un thème vos contenus :

Mélanger pages et articles

[pastacode lang= »php » manual= »function%20sx_tags_categories_support()%20%7B%0A%09register_taxonomy_for_object_type(%20’post_tag’%2C%20’page’%20)%3B%0A%09register_taxonomy_for_object_type(%20’category’%2C%20’page’%20)%3B%0A%7D%0Aadd_action(%20’init’%2C%20’sx_tags_categories_support’%20)%3B » message= »Ajouter les catégories et étiquettes aux pages » highlight= » » provider= »manual »/] [pastacode lang= »php » manual= »function%20sx_tags_categories_support_query(%20%24wp_query%20)%20%7B%0A%09if%20(%20%24wp_query-%3Eget(%20’tag’%20)%20)%20%7B%0A%09%09%24wp_query-%3Eset(%20’post_type’%2C%20array(%20’post’%2C%20’page’%20)%20)%3B%0A%09%7D%0A%09if%20(%20%24wp_query-%3Eget(%20’category_name’%20)%20)%20%7B%0A%09%09%24wp_query-%3Eset(%20’post_type’%2C%20array(%20’post’%2C%20’page’%20)%20)%3B%0A%09%7D%0A%7D%0Aadd_action(%20’pre_get_posts’%2C%20’sx_tags_categories_support_query’%20)%3B » message= »Afficher les pages dans les catégories et étiquettes » highlight= » » provider= »manual »/]

Ajouter proprement la balise Title dans WordPress

Pour ajouter proprement la balise title, supprimez tout code ressemblant au code suivant dans votre thème (souvent dans le fichier header.php) : [pastacode lang= »php » message= »Ancien code Title » highlight= » » provider= »manual » manual= »%3Ctitle%3E%3C%3Fphp%20wp_title( »)%3B%20%3F%3E%3C%2Ftitle%3E »/] Ajoutez ensuite ce code dans le fichier functions.php de votre thème [pastacode lang= »php » message= »Ajouter proprement le title dans WordPress » highlight= » » provider= »manual » manual= »add_theme_support(%20’title-tag’%20)%3B »/]

Faire une sélection d’article dans WordPress

Pour faire une sélection d’articles dans une liste d’articles (page d’accueil, de catégorie, de mots clés…). Modifiez le loop ainsi : [pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%3C%3Fphp%0A%2F%2FMa%20boucle%20pour%20afficher%20des%20articles%20mis%20en%20avant%0Awhile%20(%24query-%3Ehave_posts())%20%3A%20%24query-%3Ethe_post()%3B%0A%2F%2FOn%20stocke%20dans%20%24do_not_duplicate%20les%20articles%20%C3%A0%20ne%20pas%20afficher%20plus%20tard%0A%24do_not_duplicate%5B%5D%20%3D%20%24post-%3EID%3B%0A%2F%2F%20Le%20contenu%20de%20ma%20premi%C3%A8re%20boucle%20est%20plac%C3%A9%20ici%0Aendwhile%3B%0A%3F%3E%0A%3C%3Fphp%0A%2F%2FMa%20boucle%20pour%20afficher%20les%20articles%20habituels%0Aif%20(%20have_posts()%20)%20%3A%20while%20(%20have_posts()%20)%20%3A%20the_post()%3B%0A%2F%2FOn%20n%E2%80%99affiche%20pas%20les%20articles%20d%C3%A9j%C3%A0%20affich%C3%A9s%0Aif%20(in_array(%24post-%3EID%2C%20%24do_not_duplicate))%20continue%3B%0A%2F%2FLOOP%0A%E2%80%A6″/]

Pas de 404 pour la pagination de WordPress (Ch.28.)

Code à placer dans le fichier functions.php de votre thème : [pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F**%0APas%20de%20404%20pour%20la%20pagination%20qui%20n%E2%80%99existe%20pas%20ou%20plus%0A%C2%A9%20Julio%20Potier%20BoiteAweb%20-%20Modifi%C3%A9%20par%20Daniel%20Roch%20et%20correction%20par%20Willy%0ABahuaud%20(ne%20fonctionnait%20pas%20sur%20la%20page%20d%E2%80%99accueil)%0A*%2F%0Afunction%20seomix_template_redirect_no_404_pagination()%20%7B%0A%2F%2FR%C3%A9cup%C3%A9ration%20de%20la%20variable%20%22paged%22%0A%24paged%20%3D%20get_query_var(%20’paged’%20)%3B%0A%24page%20%3D%20get_query_var(‘page’)%3B%0A%2F%2FSi%20nous%20sommes%20sur%20une%20page%20404%20avec%20une%20page%20sup%C3%A9rieure%20%C3%A0%200%0Aif(%20is_404()%20%26%26%20(%20%24paged%20%7C%7C%20%24page%20)%20%3E%200%20)%3A%0Aglobal%20%24wp_rewrite%3B%0A%24url%20%3D%20preg_replace(%20%22%23%24wp_rewrite-%3Epagination_base%2F%24paged(%2F%2B)%3F%24%23%22%2C%20 »%2C%0A%24_SERVER%5B’REQUEST_URI’%5D%20)%3B%0Awp_redirect(%20%24url%2C%20301%20)%3B%0Adie%3B%0Aendif%3B%7D%0Aadd_action(‘template_redirect’%2C%20’seomix_template_redirect_no_404_pagination’%20)%3B »/]

Supprimer les étiquettes de WordPress

Code à placer dans le fichier functions.php de WordPress [pastacode lang= »php » manual= »add_action(‘init’%2C%20’remove_default_taxos’%2C%202%20)%3B%0Afunction%20remove_default_taxos()%20%7B%0A%09global%20%24wp_taxonomies%3B%0A%09unset(%24wp_taxonomies%5B’post_tag’%5D)%3B%0A%7D » message= » » highlight= » » provider= »manual »/]

Ajouter les étiquettes aux autres posts types

Ajouter ce code au fichier functions.php : [pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F%2Fadd%20tag%20support%20to%20pages%0Afunction%20tags_support_all()%20%7B%0Aregister_taxonomy_for_object_type(‘post_tag’%2C%20’page’)%3B%0A%7D%0A%2F%2Fensure%20all%20tags%20are%20included%20in%20queries%0Afunction%20tags_support_query(%24wp_query)%20%7B%0Aif%20(%24wp_query-%3Eget(‘tag’))%20%24wp_query-%3Eset(‘post_type’%2C%20’any’)%3B%0A%7D%0A%0A%2F%2Ftag%20hooks%0Aadd_action(‘init’%2C%20’tags_support_all’)%3B%0Aadd_action(‘pre_get_posts’%2C%20’tags_support_query’)%3B%0A »/]  

Afficher le texte alternatif dans la colonne des médias de WordPress (Ch.23.)

Ajoutez ce code dans le fichier functions.php : [pastacode lang= »php » manual= »function%20seomix_adm_media_attachment_alt(%24cols)%20%7B%0A%09%24cols%5B%22alt%22%5D%20%3D%20’ALT%20Text’%3B%0A%09return%20%24cols%3B%0A%7D%0Afunction%20seomix_adm_media_attachment_alt_content(%24column_name%2C%20%24id)%20%7B%0A%09if%20(%20%24column_name%20%3D%3D%3D%20’alt’%20)%20%7B%0A%09%09echo%20get_post_meta(%20%24id%2C%20’_wp_attachment_image_alt’%2C%20true)%3B%0A%09%7D%0A%7D%0Aadd_filter(‘manage_media_columns’%2C%20’seomix_adm_media_attachment_alt’%2C%201)%3B%0Aadd_action(‘manage_media_custom_column’%2C%20’seomix_adm_media_attachment_alt_content’%2C%201%2C%202)%3B » message= » » highlight= » » provider= »manual »/]

Ajouter une balise ALT aux images qui n’en possèdent pas (ch.23.)

[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »function%20seomix_seo_img_add_alt_tags(%24content)%7B%0Aglobal%20%24post%3B%0Apreg_match_all(‘%2F%3Cimg%20(.*%3F)%5C%2F%3E%2F’%2C%20%24content%2C%20%24images)%3B%0Aif(!is_null(%24images))%20%7B%0Aforeach(%24images%5B1%5D%20as%20%24index%20%3D%3E%20%24value)%20%7B%0Aif(!preg_match(‘%2Falt%3D%2F’%2C%20%24value))%7B%0A%24new_img%20%3D%20str_replace(‘%3Cimg’%2C%20’%3Cimg%20alt%3D%22’.get_the_title().’%22’%2C%0A%24images%5B0%5D%5B%24index%5D)%3B%0A%24content%20%3D%20str_replace(%24images%5B0%5D%5B%24index%5D%2C%20%24new_img%2C%20%24content)%3B%7D%7D%7D%0Areturn%20%24content%3B%7D%0Aadd_filter(‘the_content’%2C%20’seomix_seo_img_add_alt_tags’%2C%2099999)%3B »/]

Paramétrage par défaut pour l’ajout d’images dans WordPress

[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F**%0AParam%C3%A9trage%20par%20d%C3%A9faut%20pour%20les%20attachments%0ASource%20%3A%20http%3A%2F%2Fwpsnipp.com%2Findex.php%2Ffunctions-php%2Fset-default-attachmentdisplay-%0Asettings-alignment-link-size-wordpress%2F%0A*%0A*%2F%0Afunction%20seomix_adm_attachment_display_settings()%20%7B%0Aupdate_option(%20’image_default_align’%2C%20’center’%20)%3B%0Aupdate_option(%20’image_default_link_type’%2C%20’file’%20)%3B%0Aupdate_option(%20’image_default_size’%2C%20’large’%20)%3B%0A%7D%0Aadd_action(%20’after_setup_theme’%2C%20’seomix_adm_attachment_display_settings’%20)%3B »/]

Donner des instructions à l’utilisateur (ch.23.)

Le code pour Gutenberg Le code pour tinyMCE [pastacode lang= »php » message= »Ajouter un texte par défaut lors de la création d’un contenu » highlight= » » provider= »manual » manual= »function%20seomix_adm_default_post_text(%20%24content%20)%20%7B%0A%24content%20%3D%20%22%0A%3Cp%3EMerci%20pour%20la%20cr%C3%A9ation%20de%20ce%20nouvel%20article.%20Voici%20les%20r%C3%A8gles%20%C3%A0%20respecter%0A%3A%3C%2Fp%3E%3Cul%3E%0A%3Cli%3EVotre%20contenu%20est%20%3Cstrong%3Eunique%3C%2Fstrong%3E%3C%2Fli%3E%0A%3Cli%3E%3Cstrong%3EVotre%20contenu%20r%C3%A9pond%20%C3%A0%20un%20besoin%3C%2Fstrong%3E%3C%2Fli%3E%0A%3Cli%3EVotre%20contenu%20est%20bien%20%C3%A9crit%2C%20a%C3%A9r%C3%A9%20et%20mis%20en%20page%2C%20et%20si%20possible%20avec%0Ades%20images%20et%20des%20vid%C3%A9os%3C%2Fli%3E%0A%3Cli%3E%3Cstrong%3ENe%20faites%20pas%20les%20bourrins%3C%2Fstrong%3E%20avec%20les%20liens%3C%2Fli%3E%0A%3Cli%3ESoyez%20pertinents%2C%20d%C3%A9cal%C3%A9s%20et%20originaux%2C%20sous%20peine%20de%20finir%20dans%20le%0Amixeur%3C%2Fli%3E%0A%3C%2Ful%3E%3Cp%3EBonne%20r%C3%A9daction%20%C3%A0%20tous%20!%3C%2Fp%3E%22%3B%0Areturn%20%24content%3B%7D%0Aadd_filter(%20’default_content’%2C%20’seomix_adm_default_post_text’%20)%3B »/]

Supprimer des menus dans l’administration de WordPress (ch.23.)

[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F**%0ASupprimer%20des%20menus%0A*%2F%0Afunction%20seomix_adm_content_contributor_remove_menu()%20%7B%0Aglobal%20%24menu%3B%0Aremove_menu_page(‘wpcf7’)%3B%20%2F*%20Plugin%20Contact%20Form%207*%2F%0Aunset(%24menu%5B10%5D)%3B%20%2F%2F%20M%C3%A9dias%0Aunset(%24menu%5B25%5D)%3B%20%2F%2F%20Commentaires%0Aunset(%24menu%5B75%5D)%3B%20%2F%2F%20Outils%0Aunset(%24menu%5B15%5D)%3B%20%2F%2F%20Liens%0Aunset(%24menu%5B60%5D)%3B%20%2F%2F%20Apparence%0Aunset(%24menu%5B65%5D)%3B%20%2F%2F%20Plugins%0Aunset(%24menu%5B70%5D)%3B%20%2F%2F%20Utilisateurs%0Aunset(%24menu%5B80%5D)%3B%20%2F%2F%20R%C3%A9glages%0A%7D%0Aadd_action(‘admin_head’%2C%20’seomix_adm_content_contributor_remove_menu’)%3B »/]

Ajouter les sticky posts aux custom posts types

[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F**%0A*%20Source%20%3A%20GeekPress%20http%3A%2F%2Fwww.geekpress.fr%2Fwordpress%2Fastuce%2Fsticky-postscustom-%0Apost-types-1967%2F%0A*%2F%0Afunction%20seomix_add_sticky_post_support()%20%7B%0Aglobal%20%24post%2C%20%24typenow%3B%0Aif%20(%20%24typenow%20%3D%3D%20’saucisson’%20%26%26%20current_user_can(%20’edit_others_posts’%20)%20)%20%3A%20%3F%3E%0A%3Cscript%3E%0AjQuery(function(%24)%20%7B%0Avar%20sticky%20%3D%20%22%3Cbr%2F%3E%3Cspan%20id%3D’sticky-span’%3E%3Cinput%20id%3D’sticky’%0Aname%3D’sticky’%20type%3D’checkbox’%20value%3D’sticky’%20%3C%3Fphp%20checked(%20is_sticky(%20%24post-%0A%3EID%20)%20)%3B%20%3F%3E%20%2F%3E%20%3Clabel%20for%3D’sticky’%20class%3D’selectit’%3E%3C%3Fphp%20_e(%20%22Stick%20this%20post%0Ato%20the%20front%20page%22%20)%3B%20%3F%3E%3C%2Flabel%3E%3Cbr%20%2F%3E%3C%2Fspan%3E%22%3B%0A%24(‘%5Bfor%3Dvisibility-radio-public%5D’).append(sticky)%3B%0A%7D)%3B%0A%3C%2Fscript%3E%0A%3C%3Fphp%20endif%3B%20%7D%0Aadd_action(%20’admin_footer-post.php’%2C%20’seomix_add_sticky_post_support’%20)%3B%0Aadd_action(%20’admin_footer-post-new.php’%2C%20’seomix_add_sticky_post_support’%20)%3B »/]

Ajax et WordPress (Ch.29.)

Tous les codes traitant de l’Ajax dans le livre sont tiré de cet article sur le site SeoMix : Ajax et WordPress : le guide Consultez-le pour accéder aux codes.

Codes types pour les transients

Code 1 : [pastacode lang= »php » manual= »function%20seomix_transient()%7B%0A%09%2F%2FQuel%20est%20le%20nom%20du%20transient%20%3F%0A%09%24nomtransient%20%3D%20’tototransient’%3B%0A%0A%09%2F%2FLe%20transient%20est-il%20inexistant%20ou%20expir%C3%A9%20%3F%0A%09if%20(%20false%20%3D%3D%3D%20(%20%24transient%20%3D%20get_transient(%20%24nomtransient%20)%20)%20)%20%7B%0A%0A%09%09%2F%2FSi%20oui%2C%20je%20fais%20appel%20%C3%A0%20n%E2%80%99importe%20quelle%20fonction%20pour%20donner%20une%20valeur%20au%20futur%20transient.%20Dans%20mon%20exemple%2C%20ce%20sera%20ma%20fonction%20toto%20().%0A%09%09%24value%20%3D%20toto()%3B%0A%0A%09%09%2F%2FJe%20mets%20%C3%A0%20jour%20la%20valeur%20du%20transient%20avec%20%24value%2C%20et%20j%E2%80%99indique%20%C3%A0%20WordPress%20une%20dur%C3%A9e%20d%E2%80%99expiration%20de%2060%20secondes.%0A%09%09set_transient(%24nomtransient%2C%20%24value%2C%2060)%3B%0A%0A%09%09%2F%2FJe%20mets%20%C3%A0%20jour%20la%20valeur%20de%20ma%20variable%20%24transient%2C%20car%20%C3%A0%20ce%20stade%20elle%20est%20encore%20%C3%A9gale%20%C3%A0%20false%20.%0A%09%09%24transient%20%3D%20get_transient(%20%24nomtransient%20)%0A%09%7D%0A%0A%09%2F%2FJe%20renvoie%20la%20valeur%20du%20transient%20mis%20%C3%A0%20jour.%0A%09return%20%24transient%3B%0A%7D » message= »Exemple de code pour un transient dans WordPress » highlight= » » provider= »manual »/] Code 2 : [pastacode lang= »php » manual= »%2F%2F%20Cr%C3%A9ation%20de%20l%E2%80%99action%20qui%20va%20d%C3%A9clencher%20la%20suppression%20des%20transients%0Afunction%20seomix_content_transients_opti()%20%7B%0A%09seomix_action_delete_transient()%3B%0A%7D%0A%0A%2F%2F%20Activation%20de%20l%E2%80%99action%20en%20m%C3%AAme%20temps%20que%20wp_scheduled_delete%0A%2F%2F%20La%20variable%20EMPTY_TRASH_DAYS%20doit%20%C3%AAtre%20d%C3%A9finie%20dans%20le%20fichier%20wp%20-%20c%20onfig.%0A%2F%2F%20Par%20exemple%20%3A%20define(‘EMPTY_TRASH_DAYS’%2C%203%20)%3B%0Aadd_action(%20’wp_scheduled_delete’%2C%20’seomix_content_transients_opti’%20)%3B%0A%0A%2F%2F%20Fonction%20de%20suppression%20des%20transients%0Afunction%20seomix_action_delete_transient()%20%7B%0A%09%2F%2F%20Si%20WordPress%20ne%20fait%20pas%20appel%20%C3%A0%20un%20cache%20externe%0A%09global%20%24_wp_using_ext_object_cache%3B%0A%09%0A%09if%20(%20!%24_wp_using_ext_object_cache%20)%20%7B%0A%09%09%2F%2F%20On%20r%C3%A9cup%C3%A8re%20la%20globale%20du%20site%0A%09%09global%20%24wpdb%3B%0A%09%0A%09%09%2F%2F%20On%20r%C3%A9cup%C3%A8re%20l%E2%80%99heure%20actuelle%0A%09%09%24time%20%3D%20time()%3B%0A%09%0A%09%09%2F%2F%20On%20r%C3%A9cup%C3%A8re%20tous%20les%20transients%20trop%20vieux%0A%09%09%24sql%20%3D%20%22SELECT%20option_name%20FROM%20%24wpdb-%3Eoptions%20WHERE%20option_name%20LIKE%20’_transient_timeout%25’%20AND%20option_value%20%3C%20%24time%22%3B%0A%09%0A%09%09%2F%2F%20On%20les%20r%C3%A9cup%C3%A8re%20proprement%0A%09%09%24mestransients%20%3D%20%24wpdb-%3Eget_col(%20%24sql%20)%3B%0A%09%0A%09%09%2F%2F%20Pour%20chacun%20d%E2%80%99entre%20eux%2C%20on%20les%20supprime%0A%09%09foreach(%20%24mestransients%20as%20%24transient%20)%20%7B%0A%09%09%09%24deletion%20%3D%20delete_transient(%20str_replace(%20’_transient_timeout_’%2C%20 »%2C%20%24transient%20)%20)%3B%0A%09%09%7D%0A%09%0A%09%09%2F%2F%20On%20optimise%20la%20base%20de%20donn%C3%A9es%20apr%C3%A8s%20les%20suppressions%0A%09%09%24wpdb-%3Equery(‘OPTIMIZE%20TABLE%20’%20.%20%24wpdb-%3Eoptions)%3B%0A%09%7D%0A%7D » message= »Nettoyage automatique des transients » highlight= » » provider= »manual »/] Un article traite ce sujet en profondeur sur SeoMix : Transient et WordPress : comment les utiliser ?

Changer la compression des images de WordPress

Code type : [pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »add_filter(‘jpeg_quality’%2C%20function(%24arg)%7Breturn%2080%3B%7D)%3B »/] Code pour PHP inférieur à 5.3 : [pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »add_filter(%20’jpeg_quality’%2C%20create_function(%20 »%2C%20’return%2080%3B’%20)%20)%3B »/]

Améliorer les performances avec WP-config (ch.15.)

Code 1 : [pastacode lang= »php » message= »Réduire le nombre de révisions de chaque article » highlight= » » provider= »manual » manual= »define(‘WP_POST_REVISIONS’%2C%205)%3B »/] Code 2 : [pastacode lang= »php » message= »Désactiver les révisions » highlight= » » provider= »manual » manual= »define(‘WP_POST_REVISIONS’%2Cfalse)%3B »/] Code 3 : [pastacode lang= »php » message= »Régler le temps entre chaque sauvegarde automatique » highlight= » » provider= »manual » manual= »define(‘AUTOSAVE_INTERVAL’%2C%20300)%3B »/] Code 4 [pastacode lang= »php » message= »Ne pas envoyer de cookies aux sous-domaines » highlight= » » provider= »manual » […]

Sécuriser le fichier WP Config et le htaccess de WordPress (Ch.11.)

Plusieurs lignes sont à ajouter dans le fichier wp-config.php situé à la racine de WordPress. 1er code : [pastacode lang= »php » manual= »define(%20’ALLOW_UNFILTERED_UPLOADS’%2C%20FALSE%20)%3B » message= »Forcer le filtrage des uploads » highlight= » » provider= »manual »/] 2ème code : [pastacode lang= »php » message= »Pas d’éditeur de fichier dans l’administration de WordPress » highlight= » » provider= »manual » manual= »define(%20’DISALLOW_FILE_EDIT’%2C%20TRUE%20)%3B »/] Puis, ajoutez ces codes dans le fichier htaccess : [pastacode lang= »php » […]

Améliorer la vitesse d’un thème WordPress (CSS, HTML, etc.)

Pour apprendre à améliorer la vitesse de WordPress, suivez le lien contenu dans cet article.

Améliorer l’intégration des custom post types : flux RSS et boucle principale (ch.27.)

Ces codes permettent de mieux intégrer les custom post types dans le reste de votre site WordPress

N’afficher qu’un nombre restreint d’articles sur les pages auteur (ch.28.)

Ce code permet de réduire le nombre d’articles à afficher sur les pages auteur de WordPress, ainsi que la pagination qui va avec.

© 2013-2023 Optimiser son référencement WordPress, le livre - Par Daniel Roch


Theme by Anders NorenHaut de page ↑