Problème de transcodage UTF-8 (caractère 195)

probleme de transcodage utf-8 caractere 195Problématique

Je suis amené à récupérer des données sur un de mes sites (codé en UTF-8) et à les basculer dans un autre après quelques traitements.

J’ai donc programmé un bout de code en PHP qui fonctionne sur mon serveur local, paramétrer également en UTF-8 et à mettre à jour par programme les tables WordPress de mon nouveau site par l’instruction mysqli_query.

Or que constaté-je de mes yeux horrifiés ? Que tous les caractères accentués et autres « ç » qui font le charme de notre belle langue apparaissent sous la forme que vous avez déjà tous observés (faites donc une recherche un peu poussée sur Amazon et vous verrez) : les fameux é et autres è … Inesthétiques au possible, illisibles et qui font franchement aussi négligé qu’une tâche de ketchup sur un plastron de smoking, tel que j’en porte tous les soirs pour le dîner depuis que j’ai vu et revu Downton Abbey.

J’essaie tous les utf8_encode, utf8_decode, iconv de PHP : rien n’y fait. Essayez de forcer le codage en UTF-8 d’un texte déjà en UTF-8, c’est spectaculaire !

Après une longue errance dans les forums, je constate que ce problème est très répandu et que ceux qui prétendent qu’il est facile à résoudre n’ont pas dû programmer depuis la chute de Bismarck.

Il faut admettre que dans la situation où je m’étais mis, je passais par un nombre de couches qui avaient toutes les raisons de ne pas tomber d’accord.

Solution

Le consensus ayant ses limites, j’ai donc décidé de passer un peu en force et de rappeler à tout ce petit monde (PHP, mySQL, WordPress) qui était le patron. Et pour ça, il existe une excellente instruction à passer à mySQL juste après la connexion (ou dans la chaîne de connexion). C’est (roulements de tambour …) :

SET NAMES UTF8

Et tout rentre dans l’ordre, je peux écrire « éçà€ » et j’obtiendrai bien « éçà€ ».

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Vous êtes en train de modifier la page qui affiche vos derniers articles (MAJ)

WordPress. Impossible d'ajouter au menuProblématique

Hier, je vous parlais d’un blocage dans la mise à jour de mes menus WordPress. Je cliquais sur « Ajouter au menu » et rien ne se produisait. Pas plus d’ajout d’entrée supplémentaire à mon menu que de messages d’alerte.

Après avoir tout testé (changement de thème, désactivation de plugins, …), j’avais constaté qu’un simple nettoyage de la base avec WP (ou Advanced) DB Cleaner en version basique réglait le problème sans que je sache pourquoi.

Aujourd’hui nouveau problème de même facture, je veux créer un nouvel article. La zone de saisie du texte n’apparaît pas et, à la place que devrait occuper le permalien, s’affiche le message sybillin suivant :

Vous êtes en train de modifier la page qui affiche vos derniers articles

Mais désolé mon WordPress chéri, quand nous nous sommes quittés hier, nous filions le parfait amour. Et ce matin, j’arrive sans avoir rien fait et tu me fais cette scène ?

Solution

Les deux paragraphes suivants sont un simple copier/coller des paragraphes de mon post précédent.

Je me dis qu’après tout, je vais tenter un nettoyage de la base. J’utilise pour ce faire le plugin WP (ou Advanced) DB Cleaner en version basique.

Il me nettoie quelques trashposts et dashboard transient feeds, puis j’optimise les tables. Et bingo ! ça marche.

Et ce n’est guère plus satisfaisant. Je vais donc lancer une enquête têtue mais de faible intensité : j’ai un peu autre chose à faire.

L’enquête :

  • le 26 août à 12h27 : le problème s’est reproduit. Je n’ai supprimé que les dashboard transient feeds. Le problème a persisté. Malgré leur nom barbare, les dashboard transient feeds sont donc hors de cause.
  • le 26 août à 13h16 : le problème se reproduit avec une fréquence qui devient exaspérante. Cette fois, je n’ai supprimé que les 3 révisions que m’annonce le plugin de nettoyage. Et ça marche ! La prochaine fois, je regarderai l’allure de ces révisions. A suivre …
  • le 27 août à 14h01 (eh ! oui ! je bosse même ls week-ends d’août) : j’élimine une par une les entrées inutiles sauf deux révisions de posts. Toujours le même blocage. Juste pour voir, je supprime les deux révisions – tout à fait simples, légitimes et tout et tout – manuellement dans phpMyAdmin et miracle ! la situation est débloquée.

La solution ?

  • le 4 septembre à 17h47 : en fait, je tombe par inadvertance sur la page register_taxonomy du Codex WordPress et plus précisément sur le paragraphe Reserved Terms qui fournit une liste plutôt longue des mots réservés – donc interdits – à ne pas utiliser comme nom de taxonomie. Or une de mes taxonomies s’appelait « theme ». Et WordPress précise bien qu’il peut se passer n’importe quoi si on utilise un terme réservé. Je crois que les problèmes observés se rattachaient bien au n’importe quoi promis.

N’utilisez donc pas de mots réservés pour un nom de taxonomy. Rien ne vous en empêchera mais vous risquez de le payer cher !

Et consultez soigneusement register_taxonomy. Reserved Terms dans le Codex WordPress.

  • le 13 septembre à 0h37 : eh bien non ! le choix de « theme » comme nom de taxinomie n’était pas judicieux mais ce n’était pas l’explication au verrouillage.
  • le 23 septembre à 10h25 : cauchemardesque, ce message … il est revenu. j’ai donc passé trois heures (!!!) à explorer les forums en français comme en anglais. Ce bug semble dater de la version 4.1 de WordPress et avoir différentes origines. Les solutions proposées reprenent pour la plupart celle que je vous proposais jusqu’ici : nettoyer la base de données (la table wp_posts principalement). Mais cette fois, ce remède n’a pas fonctionné et j’ai refusé de me rsoudre à l’autre solution proposée : réinstaller WordPress. En fait, je m’en suis sorti en éditant un article existant et en validant une modification mineure. J’aimerais bien trouver la table et l’entrée qui contiennent l’origine du problème mais aucune piste pour l’instant …

Dépannage

En résumé, il me semble bien avoir fait le tour de la question. Et je crois bien avoir à faire à un bug vicieux mais que je contourne en supprimant les révisions de mes posts. Guère brillant mais ça fonctionne.

Donc en résumé :

si WordPress vous affiche

Vous êtes en train de modifier la page qui affiche vos derniers articles

supprimez les révisions des posts …

sinon, éditez des articles existants jusqu’à disparition.

En espérant qu’une future release de WordPress élimine ce poison.

 

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

WordPress. Impossible d’ajouter au menu

WordPress. Impossible d'ajouter au menuProblématique

Je souhaitais mettre en place de nouvelles entrées dans le menu principal et unique de mon thème.

Qu’il s’agisse d’une catégorie, d’une page, d’un lien personnalisé, je clique sur « Ajouter au menu » et que se passe-t-il ? Rien. Pas même un message d’erreur.

En mise à jour par la personnalisation, je vois bien les entrées s’afficher sur la pré-visualisation. Mais après enregistrement et publication, la modification n’est pas prise en compte.

Comme j’utilise un thème-enfant, je me dis que j’ai peut-être commis une boulette. Je reviens donc au thème de départ. Même absence de résultat.

J’essaie alors les thèmes par défaut Twenty Fourteen, Twenty Fifteen, Twenty Sixteen. Pas mieux.

Je désactive donc les plugins (dont l’inévitable Yoast SEO sur lequel je reviendrai). Rien ne bouge. Sauf mes nerfs qui se mettent doucement en pelote et ça fait mal.

En désespoir de cause, je réinstalle mon WordPress déjà en vr 4.6. Rien n’y fait : cette fois, par élimination, je suis sûr que ça provient de ma base de données.

Alors je cherche sur Google et en particulier sur le support de WordPress francophone. Et là, je tombe sur un article qui me met la puce à l’oreille Impossible d’ajouter des éléments au menu. Le contexte de l’article ne correspond pas à ma situation – l’hébergement OVH mis à part – mais me fait penser à une solution ..

Solution (partielle, une fois n’est pas coutume)

Je me dis qu’après tout, je vais tenter un nettoyage de la base. J’utilise pour ce faire le plugin WP (ou Advanced) DB Cleaner en version basique.

Il me nettoie quelques trashposts et dashboard transient feeds, puis j’optimise les tables. Et bingo ! ça marche.

Mais avouons que ce n’est guère satisfaisant, il me semble qu’il y a une fragilité dans le module wp-admin/nav-menu.php de WordPress. Et ce problème n’est pas récent (voir cet article).

Si vous avez des pistes …

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Serveurs OVH. Comment migrer d’un dédié vers VPS

OVH VPS Cloud

Cliquez pour examiner l’offre VPS d’OVH

Problématique

Un problème d’évolution de Plesk

Le contexte m’est personnel mais ça peut arriver à tout le monde. Mes sites sont hébergés depuis toujours chez OVH. Pourquoi se priver ? Ils ont de bons produits, pas trop chers et un support plutôt correct même si j’ai la fâcheuse manie de leur poser des colles. Car si je les appelle, c’est que je suis vraiment dans l…’embarras, dirons-nous.

Jeudi dernier, je constate qu’il y a une mise à jour WordPress 4.5. je mets à jour. Divers plugins, dont Backup Guard fort intéressant au demeurant, se mettent à jour. Mais Backup Guard a besoin de PHP 5.3.3. Ce n’est pas un caprice puisque la version courante de PHP est la 5.6. D’ailleurs, la vr 7 pointe largement le bout de son nez même si elle n’est pas encore répandue dans le monde WordPress.

Mais là, tout se bloque. Tout car BackupGuard prend la main et décide que puisque je n’ai pas PHP 5.3.3, le site ne fonctionnera plus. J’avais fait une sauvegarde, j’aurais donc pu revenir en arrière mais il faudra bien y passer un jour non ?

J’appelle donc le support OVH qui me dit me mon serveur dédié sous Ubuntu 10, distribution Plesk 12.0 ne pourra probablement pas aller plus loin et me suggère de passer sous VPS. Je regarde, je vois les prix, l’examine les performances. Après tout mon serveur dédié était un peu sur-dimensionné, faisons quelques économies et repartons à 0.

Et là tout se corse …

VPS et les DNS

D’abord, on peut faire le reproche à OVH de ne pas avoir de docs très à jour. Le message d’installation de VPS m’annonce que les docs sont disponibles sous guide.ovh.com. Je n’y trouve pas plus de doc sur le VPS que de stripteaseuses à un congrès de l’Armée du Salut.

Le support m’informe qu’en fait la doc est sous docs.ovh.com qui semble effectivement plus moderne et bien engagé. A ceci près que cliquer sur la majorité des liens fait à peu près le même effet que sur mon iPhone le mois dernier lors du passage sous iOS 3,5 : ça clique dans le vide.

Bien déterminé à conserver Plesk 12.0 et à le laisser gérer les DNS, je recrée mes sites sous VPS et m’en vais mettre à jour la gestion des DNS dans le manager pour demander au VPS d’aller chercher sur le VPS.

On m’explique qu’il faut saisir l’adresse du VPS (vps999999.ovh.net) dans la gestion DNS et quand c’est à jour, déclarer le DNS secondaire dans l’onglet dédié du VPS.

11 sites = 10 difficultés + 1 échec

J’ai 11 sites à migrer, plus ou moins anciens, certains ont des DNS d’hébergement mutualisé, d’autres pointent sur le dédié, certains affiche une zone DNS, d’autres non.

Pour 8 d’entre eux, ça passe. Mais sur les 8, je ne peux déclarer le DNS secondaire sous VPS que pour 4 d’entre eux, pour les autres on me dit que le DNS secondaire existe déjà. Et sur les 4 qui fonctionnent correctement, seuls deux affichent le DNS secondaire comme il faut dans la gestion DNS de la partie Web. Bref laborieux.

Et un site, le 9ème, refuse obstinément de migrer. Au bout de 4 appels à OVH, personne ne semble comprendre ce qui se passe. On me demande gentiment d’envoyer une liste des sites avec le détail de mes malheurs pour que les techniciens fassent le nécessaire. Nous sommes en fin de journée, rien ne se passera donc avant demain et demain j’ai autre chose à faire.

Alors, j’ai subitement un éclair, je tente le coup et ça marche.

Solution

Un de mes nombreux interlocuteurs de chez OVH m’a indiqué qu’il fallait saisir le nom du DNS et l’adresse IP. Or je me suis dit que pour leDNS secondaire les choses ne semblait pas évidentes.

Alors pour migrer vos DNS, je vous recommande la marche à suivre suivante :

  1. faites toujours en sorte qu’il y ait au final deux DNS déclarés dans la gestion DNS
  2. s’il est manquant, saisissez d’abord le fameux sdns2.ovh.net SANS l’adresse IP
  3. s’il est présent, saisissez le nouveau DNS (vps999999.ovh.net) SANS l’adresse IP et détruisez l’ancien.

Vous avez bien compris qu’il ne fallait pas (du moins dans un premier temps) saisir l’adresse IP.

Mais comme je suis soigneux et que je préfère savoir vers quoi je pointe quand dans 3 ans on me dira qu’il faut migrer parce que mon Plesk ne pourra pas me fournir PHP 9.3.7, j’ai ensuite saisi les IP.

Preuve que ça ne sert pas à grand-chose sinon à mettre la pagaille, du moins au début, la gestion des opérations répond « Final status will do no change – Opération annulée ». Il garde quand même la mémoire de l’IP que vous voyez s’afficher royalement et faire la fière après nous les avoir brisées menu pendant 3 jours.

Alors compris ? On saisit le DNS secondaire d’abord, le nouveau ensuite et on vire l’ancien après. On y va étape par étape, validation par validation et on ne saisit l’IP qu’en fin de parcours pour faire joli.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Outlook Mac erreur 17895

Problématique

Vous avez une erreur Outlook 17895. Elle signifie généralement qu’Outlook ne parvient pas à envoyer un mail sous le prétexte qu’il ne reconnaît pas le processus d’authentification.

Vous cherchez comme moi la réponse dans le support Apple qui vous renvoie chez Microsoft sous le prétexte que c’est un problème Outlook et réciproquement. Vous passez donc aux divers forums qui fournissent toujours aussi peu de réponses claires.

Et c’est apparemment logique car cette erreur Outlook 17895 a vraisemblablement un nombre assez élevé de causes. Je vais donc vous préciser le contexte dans lequel j’ai été confronté au problème.

Je suis en train de migrer mes sites d’un serveur dédié OVH sous Plesk 12,0 pour passer en VPS sous Plesk 12.0 aussi. C’est déjà assez pénible de migrer des sites, je ne vais pas en plus me former à une nouvelle distribution !

Passant d’un Plesk 12,0 à un autre, théoriquement, le paramétrage d’Outlook pour prendre en compte les mails définis sous Plesk doit être assez élémentaire : on ne change rien !

Et patatras ! Je reçois bien les mails mais ne peut les renvoyer : je me prends la fameuse erreur Outlook 17895.

J’appelle donc le support OVH, généralement de bonne qualité, qui me demande de vérifier un certain nombre de points : j’ai toujours des difficultés à leur faire comprendre que je ne les appelle pas par pur sadisme et que j’ai déjà tout vérifié mais bon !

Et on ne trouve rien !

Solution

Quand une configuration fonctionne et l’autre non, que faites-vous ? Moi je compare ligne à ligne les paramétrages et que constaté-je ?

Sous l’onglet Serveur > Paramètres du serveur de messagerie, dans la configuration qui fonctionne, le serveur de messagerie est QMail, dans l’autre PostFix.

Et en remplaçant PostFix par QMail tout rentre dans l’ordre !

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

HTML. Faire un tableau, les bonnes balises

Problématique

Faire un tableau en HTML ! Elémentaire me direz-vous : pas faux. Ringard dirons d’autres : pas faux, il faut mieux utiliser la balise <div> que la balise <table>. Très juste, je ne sais pas pourquoi mais c’est ce que tout le monde dit et on ne va pas se battre pour ça.

Mais c’est tout de même intéressant sous WordPress par exemple et c’est dans ce contexte que je vous en parle. Donc petite piqûre de rappel sur les balises pour tableau.

Solution

  1. on encadre le tableau par <table> et </table>
  2. chaque ligne du tableau (entête comprise) est encadrée par <tr> et </tr>
  3. si vous voulez une entête distincte du corps du tableau, chaque entête de colonne de la première ligne (premier <tr>… </tr>) devra être encadré par <th></th>. Ceci vous permet dans votre CSS de formater une entête selon vos goûts
  4. si vous avez défini une entête, les lignes suivantes (l’ensemble des <tr> … </tr> suivants) devra être encadrée par <tbody> et </tbody>
  5. et dans les lignes normales, les colonnes doivent être encadrées par <td> </td>

Exemple de syntaxe avec entête :

<table>

<tr>

<th>nom colonne1</th>

<th>nom colonne2</th>

</tr>

<tbody>

<tr>

<td>lig1 col1</td>

<td>lig1 col2</td>

</tr>

<tr>

<td>lig2 col1</td>

<td>lig2 col2</td>

</tr>

</tbody>

</table>

Exemple de syntaxe sans entête

<table>

<tr>

<td>nom colonne1</td>

<td>nom colonne2</td>

</tr>

<tr>

<td>lig1 col1</td>

<td>lig1 col2</td>

</tr>

<tr>

<td>lig2 col1</td>

<td>lig2 col2</td>

</tr>

</table>

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

WordPress – « Thème-enfant »

Problématique

Vous avez chargé un thème WordPress. Mais des détails de présentation vous chiffonnent et vous voudriez changer le CSS. Par exemple, je préfère de loin les textes justifiés aux paragraphes en vrac que vous proposent la plupart de ces sauvages d’anglo-saxons (je plaisante, j’adore la Grande-Bretagne).

D’autre part, vous avez déjà vu que dans les mises à jours, on vous propose parfois celles du thème que vous utilisez. Drame cornélien : si je le mets à jour, je vais écraser mes modifications, sinon, je perds peut-être des fonctionnalités intéressantes.

Solution

Eh bien oui ! Dans ce cas, on peut avoir le beurre et l’argent du beurre : il suffit de créer un thème-enfant. Il suffit, me direz-vous, mais ce sera encore une galère. Non, il suffit, je le répète de procéder selon les étapes que je vais vous décrire.

Aujourd’hui, j’ai installé un site avec le thème « Skirmish » dont je veux faire un thème-enfant (je n’ai pas dit que je voulais faire un enfant à une certaine Skirmish que je ne connais pas). Je prendrai donc ce thème pour exemple.

Etape 1

Dans le répertoire wp-content/themes, créer le répertoire skirmsih-child

Etape 2

Créer dans ce nouveau répertoire, un fichier style.css (ça c’est habituel, normal et indispensable) avec le contenu suivant

/*
Theme Name:     Skirmish Child
Theme URI:      http://www.monsite.com/
Description:    Thème enfant pour le thème Skirmish
Author:         Adhemar Patamob
Author URI:     http://www.patamob.com/
Template:       skirmish                             
Version:        0.1.0
*/

@import url(« ../skirmish/style.css »);

Plusieurs points sont à retenir

  • il est judicieux dans le Theme Name et la Description de préciser le nom du thème-parent. Est-ce indispensable ? Je n’en sais rien (merci de le préciser si vous le savez) mais c’est conseillé, c’est plus prudent et ça marche
  • il est obligatoire dans le Template d’indiquer le nom du répertoire qui contient le thème-parent : attention, il s’agit du nom du répertoire et non pas le nom du thème parent.
  • dans les autres lignes vous faites ce que vous voulez sauf …
  • ne pas mettre un blanc avant les « : »,. Il faut laisser les « : » collés à leur label (Author URI, Template, etc …) sinon WordPress risque de bugger
  • enfin la ligne @import indique qu’on importe toutes les spécifications CSS du thème-parent (ici skirmish), elle doit donc précéder toute autre spécification CSS qui prend en compte vos modifications

Etape 3

Pour finir le tout, vous allez dans le tableau de bord WordPress, dans Apparence puis Thèmes où vous voyez apparaître votre thème-enfant (en général sans le snapshot d’exemple parce que vous avez oublié de le faire).

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress 

Le SEO, une illusion ?

Pour une fois, mon post ne proposera pas de solution mais posera une question qui me taraude depuis plus de trois ans.

Je suis webmaster d’un site qui comporte 359 516 pages pas moins !

Début février, seules 20 000 pages environ étaient indexées d’après le Google Webmaster Tools. J’ai fait tout ce qui est possible pour optimiser le site et, effectivement, le nombre de pages référencées est monté assez vite à 290 000 : belle performance n’est-ce pas ?

Et progressivement, ce nombre de pages s’est érodé. Rien à redire, un grand nombre de pages n’apporte pas un avantage comparatif majeur et peuvent même comporter du « duplicate content » avec d’autres sites de même nature. Nous sommes retombés jusqu’à hier à 103 000 pages référencées.

Et ce matin, le nombre de pages référencées a rebondi à 258 000.

Certes on parle d’un nième changement d’algorithme de Google et je ferais partie des petits veinards.

Mais dans ce cas, quel SEO pourrait me justifier une facturation quelconque. Il me semble qu’avoir recours à un référenceur est le meilleur moyen de se faire arnaquer. Car peuvent-ils prétendre maîtriser quoique ce soit ?

Autres exemples vécus :

  • il y a trois mois : Google me signale plus de 40000 erreurs 404 (pages inexistantes). Je vérifie : il s’agissait de pages disparues depuis 3 ans lors d’un changement d’architecture. Toutes les redirections 301 nécessaires avaient alors été faites dans un bel .htaccess et un an plus tard, Google ne passant plus sur ces redirections, je les avais supprimées histoire d’alléger le .htaccess qui a une tendance à augmenter les temps de réponse
  • et quand je suivais ces redirections, j’ai pu constater que Google passait jusqu’à 58 fois (le record) sur une redirection 301 avant d’assimiler l’URL définitive.
  • explication à ces deux problèmes : Google a plusieurs dizaines (voire centaines) de serveurs sur lesquelles les données du site sont enregistrées et il se réveille de temps en temps sur un serveur

Conclusion : Google n’en fait qu’à sa tête, prétendre dominer le sujet est un mensonge et les référenceurs se moquent de vous. Suivez le guide des bonnes pratiques Google et priez !

Juste une citation de Lincoln détournée : se fier à Google « c’est comme tenir un loup par les oreilles : on n’aime pas ça mais on n’ose pas le lâcher ».

WordPress. J’ai une esperluette (&) dans mes numéros de page !

Logo WordPressProblématique

Comme je suis d’un soin maniaque, je mets à jour à chaque fois que WordPress me le propose. Et depuis la version 3.8 (même la toute dernière la 3.8.3), il se produit un truc étrange.

Dans le bas de mes pages, j’ai une pagination générée par paginate_links. Or que vois-je effaré ? Si la page dépasse la valeur 1000, WordPress me met comme séparateur de milliers un ‘&’ : en gros, cette année, nous serions en 2&014. Pas beau, n’est-ce pas ? En outre, ça fait hurler le contrôle de conformité HTML5 de validator.w3.org

Qu’est-ce qui se passe-t-il donc ? Mes amis, je crois bien qu’il s’agit d’un bug WordPress. Il faut donc le corriger. Et comment ?

Solution

paginate_links est défini dans wp-includes/general-template.php. Il faut donc modifier ce fichier.

En version 3.8.3 de WordPress, la ligne à corriger est la ligne 2038 (elle pourra changer dans les version suivantes) dont le code est :

$n_display = number_format_i18n($n);

Cette fonction number_format_i18n est définie dans wp-includes/functions.php. Elle prend par défaut un séparateur de milliers a priori erroné. Je n’ai pas envie de la modifier car j’ignore le risque qu’elle fait courir. Il me semble préférable de la remplacer localement par une fonction plus standard de PHP : number_format.

$n_display = number_format($n,0,““,““);

Ce qui signifie : 0 décimale,““ (chaîne vide) comme séparateur décimal, ““ (idem) comme séparateur de milliers. Ce qui est assez logique pour un numéro de page. Et ça marche !

Je laisse  number_format_i18n sévir ailleurs mais désormais je me méfierai.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress

Microsoft Word. Supprimer toutes les entrées d’index.

Problématique

Difficile de supprimer les entrées d’index dans un document Word. A quoi les voit-on ? Si vous cochez l’option  qui rend visibles tous les caractères « de contrôle », les entrées d’index apparaissent sous la forme {xe ….}. Vous pouvez essayer de les supprimer à la main si vous avez de nombreux péchés à expier ou un mauvais karma à purger ou si vous êtes adeptes de Leopold von Sacher-Masoch : comme supplice, c’est du niveau du fouet clouté.

Je vais donc abréger vos souffrances.

Solution

Je vais à la fois être honnête et me vanter un petit peu :

  • j’ai trouvé le début de la solution sur le site de 01.net, une référence ! Mais elle est fausse
  • et donc je vais faire mieux que 01.net : je vais vous proposer une solution qui marche !

Je sens que le suspense vous prend à la gorge donc j’y vais : je lâche tout :

  1. ouvrez la fenêtre de remplacement (par CTRL+H par exemple)
  2. vérifiez que dans les options spéciales (accessibles par « Plus >> »), la case « Utiliser les caractères génériques » est décochée (01.net oublie de le préciser … et la mienne était cochée)
  3. remplacez ^dXE par rien du tout (01.net met un espace entre le ^d et XE et ça ne marche pas)

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur Microsoft Word sont sur

DerniersParus.com » Microsoft Word

VB.NET. Tester l’existence d’un répertoire FTP

Problématique

Nous avons vu tout à l’heure comment créer un répertoire sur votre serveur via FTP.

La procédure proposée renverra une anomalie si le répertoire existe déjà. Il y a peut-être intérêt à tester d’abord si ce répertoire n’existerait pas déjà.

Solution

Je ne vais pas vous saouler de baratin. Voici le code, très semblable au code nécessaire pour créer un répertoire.

Public Function FTPCheckDir(ByVal ftpWebsite As String, ByVal ftpDir As String) As Boolean
Dim destURI As String
Dim message As String = «  »

destURI = « ftp://votreserveur/ » & ftpWebsite & « / » & ftpDir

Dim ftpRequest As FtpWebRequest = Nothing
Dim ftpStream As Stream = Nothing

Try

ftpRequest = DirectCast(FtpWebRequest.Create(New Uri(destURI)), FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(ftpUser, ftpPassword)

Dim response As FtpWebResponse = DirectCast(ftpRequest.GetResponse(), FtpWebResponse)
ftpStream = response.GetResponseStream()
ftpStream.Close()
response.Close()

FTPCheckDir = True

Catch ex As Exception

If ftpStream IsNot Nothing Then
ftpStream.Close()
ftpStream.Dispose()
End If

FTPCheckDir = False

End Try

Exit Function

End Function

Cette fonction renvoie true si le répertoire existe déjà, false sinon.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET. Créer un répertoire FTP

Problématique

Vous voulez créer par programme un répertoire sur votre serveur via FTP. Comme d’habitude la documentation MSDN n’est pas franchement limpide, ce qui est un doux euphémisme. Et si vous recherchez dans les forums, ça atteint des sommets : aucun des exemples ne fonctionne.

Alors qui vient à votre secours ? Votre humble serviteur.

Solution

en posant

  • destURI : l’URI de destination de type « ftp://votreserveur/votresite/the_directory »
  • ftpUser : votre login FTP
  • ftpPassword : votre mot de passe FTP

le code est le suivant :

Dim ftpRequest As FtpWebRequest = Nothing
Dim ftpStream As Stream = Nothing

Try

ftpRequest = DirectCast(FtpWebRequest.Create(destURI), FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(ftpUser, ftpPassword)

Dim response As FtpWebResponse = DirectCast(ftpRequest.GetResponse(), FtpWebResponse)
ftpStream = response.GetResponseStream()
ftpStream.Close()
response.Close()

Catch ex As Exception

If ftpStream IsNot Nothing Then
ftpStream.Close()
ftpStream.Dispose()
End If

Throw New Exception(ex.Message.ToString())

End Try

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

VB.NET. Comment faire un upload FTP ? en particulier sur un serveur dédié OVH

Problématique

Vous souhaitez uploader un fichier sur votre serveur dédié. Je précise bien qu’il s’agit du sens ordinateur local vers serveur, car du point de vue du serveur, il s’agit d’un download, et dans certaines administrations de serveurs, on n’est jamais sûr du point de vue dont il est question.

Et pour uploader un fichier, vous vous dites que vous aller écrire une fonction réutilisable parce qu’on est tout de même pas des bricolos. Non mais !

Vous regardez sur les sites techniques, vous tombez sur plusieurs options possibles : laquelle choisir ? Plus de souci, la mienne exposée ci-dessous, elle fonctionne bien et vous pouvez toujours l’adapter si mes noms de variables ne vous plaise pas, ce qui est votre droit le plus strict.

Et puis, il y a une deuxième question : comment nommé-je l’hôte, sachant que dans mon cas, il s’agit d’un serveur dédié OVH (dont je suis très satisfait d’ailleurs, du serveur et d’OVH). Vous aurez la solution en bonus.

NE SUIS-JE PAS D’UNE GRANDE CLÉMENCE ?

Solution

La fonction ne permet que de traiter les fichiers un par un. Vous pourriez l’adapter pour en traiter plusieurs. Mais l’objectif n’est pas de réécrire FileZilla tout de même ! Si ?

en posant les noms suivants pour les arguments :

  • srcFile : nom complet du fichier à envoyer (ex. « c:\images\janine.jpg »)
  • destWebSite : nom du site hébergé (ex. « www.ma-vie-mon-oeuvre.com »)
  • destDir : nom du répertoire dans le site (ex. « photos-de-vacances/2013/ »)
  • destFile : nom du fichier de réception (ex. « janine-a-la-plage.jpg » parce que vous aviez déjà un « janine.jpg » sur le serveur mais c’était au ski)

Public Function FTPUpload(ByVal srcFile As String, ByVal destWebSite As String, ByVal destDir As String, ByVal destFile As String) As Boolean

Dim ftp As System.Net.FtpWebRequest
Dim destURI As String

FTPUpload = False

On Error GoTo erreur

destURI = « ftp://ns123456.ovh.net/ » & destWebSite & « / » & destDir & « / » & destFile
ftp = DirectCast(System.Net.WebRequest.Create(destURI), System.Net.FtpWebRequest)
ftp.Credentials = New System.Net.NetworkCredential(ftpUser, ftpPassword)
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile
ftp.KeepAlive = False

‘ lecture du fichier à envoyer
Dim bFile() As Byte = System.IO.File.ReadAllBytes(srcFile)

‘ upload proprement dit
Dim ftpStream As System.IO.Stream = ftp.GetRequestStream()
ftpStream.Write(bFile, 0, bFile.Length)
ftpStream.Close()
ftpStream.Dispose()
ftpStream.Flush()

FTPUpload = True

End Function

vous aurez noté soigneusement la syntaxe de l’URI de destination.

Bien entendu, vous pouvez aussi retirer les préfixes System.Net et System.IO si vous avez placé en tête de votre module respectivement : Imports System.Net et Imports.System.IO.

Enfin, Henri, dans un commentaire du 30/12/2014 précise que le solution, testée en VB.NET 2008 fonctionne telle quelle en version 2013. Ce dont je le remercie. Henri pas VB 2013.

 POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

WordPress. Trier une requête selon deux champs

WordPress. Trier une requête selon deux champsProblématique

Vous souhaitez ordonner vos posts selon deux champs conjugués. Dans l’exemple qui me préoccupait, il s’agissait de trier par post_date DESC puis par post_modified DESC. Prenons donc cet exemple.

Le Codex WordPress vous indique ici la manière suivante :

Multiple ‘orderby’ values
Display pages ordered by ‘title’ and ‘menu_order’. (title is dominant):

$query = new WP_Query( array( 'post_type' => 'page', 'orderby' => 'title menu_order', 'order' => 'ASC' )

(sachant qu’il trie dans ce cas d’abord par ‘title’ puis ‘par menu_order’)

Je m’y suis peut-être mal pris en écrivant :

'orderby' => 'post_date modified', 'order' => 'DESC'

Mais le fait est que ça n’a pas fonctionné. En outre, on ne peut pas appliquer, par exemple, un ordre ASC à la première clef et un DESC à la seconde. Et une longue exploration m’a montré que je ne suis pas le seul à m’être cassé les dents là-dessus. Mais pas pour longtemps : têtu je suis, jeune padawan !

Solution

WordPress propose toujours des solutions. Mais il faut les trouver. En l’occurrence, il faut ajouter un filtre post_orderby (voir le codex WordPress ici) avant le query_posts($args) de la manière suivante :

add_filter(‘posts_orderby’, ‘my_posts_orderby’);
function my_posts_orderby($orderby_statement) {
$orderby_statement = « post_date DESC, post_modified DESC »;
return $orderby_statement;
}

Inutile évidemment dans ce cas de préciser dans la déclaration du $args, le classique ‘orderby’ => … et le ‘order’ => …

Et ne pas oublier le moment venu (après le query_args par exemple …) le :

add_filter(‘posts_orderby’, ‘my_posts_orderby’);

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress 

VB.NET. Mettre un programme en pause (sleep)

Problématique

Vous souhaitez suspendre l’exécution d’un programme pendant une durée quelconque pour une raison qui ne regarde que vous (je suis d’un naturel discret).

Solution

Comme d’habitude avec Microsoft, c’est simple mais il faut le trouver. Si vous voulez « pauser » pendant disons n millisecondes, j’ai bien dit millisecondes, laissez l’instruction :

System.Threading.Thread.Sleep(n)

sauf si en tête du module vous avez déjà inséré la ligne

Imports System.Threading

et dans ce cas, il vous suffira d’écrire

Thread.Sleep(n)

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur Visual Basic sont sur

DerniersParus.com » Visual Basic

MySQL. Attention au CONCAT avec argument NULL !

Problématique

Un grand classique mais c’est toujours là-dessus qu’on se plante … Vous voulez dans un champ concaténer, admettons, titre, prénom et nom. Mais comme tout le monde n’est pas docteur, le champ « docteur » est nullable et vous ne vous êtes pas privés.

Vous faites un gros update genre :

UPDATE matable SET nomcomplet=CONCAT (titre, prenom, nom)

et, amère surprise, vous obtenez des champs « nomcomplet » vides.

Le pire est lorsque, comme dans le cas de votre serviteur, vous avez négligemment laissé des champs « titre » à NULL et d’autres blancs (= »)

Solution

Alors on se le tient pour dit, et quelqu’un aurait pu me le rappeler, j’avais oublié, que :

Si un des arguments du CONCAT est NULL, CONCAT renvoie NULL

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur MySQL sont sur

DerniersParus.com » MySQL

WordPress. Problème de pagination

Problématique

Vous souhaitez afficher n posts par page. Vous avez installé une pagination au moyen d’un des nombreux plugins disponibles ou avec vos blanches mains. Et quand vous cliquez sur page 2, vous vous retrouvez encore et toujours avec les posts de la page 1. Idem pour la page n, n étant compris entre 1 et la partie entière de votre nombre de posts divisé par le nombre de posts par page + 1. Cette dernière phrase n’est là que pour faire savant …

Solution

D’abord pour éviter les problèmes de pagination, il vaut mieux utiliser la commande

query_posts ($args);

couplée avec un

while ( have_posts() )

mais ça vous le saviez déjà.

N’avez-vous pas par hasard un offset dans les arguments de votre query_post ?

Retirez-le car il indique le n° du post de départ, donc quelque soit la page, il recommence à ce post-là.

Pour preuve, je vous joins le lien sur la documentation WordPress.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

POUR EN SAVOIR PLUS : les derniers livres parus sur WordPress sont sur

DerniersParus.com » WordPress

WordPress. Les thèmes doivent avoir au moins une feuille de style et un modèle

WordPress. Les thèmes doivent avoir au moins une feuille de style et un modèleProblématique

Aujourd’hui, nous allons faire court. Très court.

Vous souhaitez créer un thème à partir de 0. Vous activez votre début d’embryon de commencement de thème et WordPress vous assène :

Les thèmes doivent avoir au moins une feuille de style et un modèle

Solution

Vous avez très certainement soigneusement créé votre style.ccs avec le nom du thème, le vôtre, le n° de version (0.0.1 a priori).

Mais vous avez oublié de créer un fichier index.php même vide.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress 

Validation HTML. Erreur « Stray start tag script »

Problèmatique

Vous venez d’achever votre nouvelle page HTML ou PHP. Comme vous êtes sérieux vous la passez à la moulinette du W3C Markup Validation Service. Et vous tombez sur l’erreur Stray start tag script.

Solution

On vous a probablement expliqué qu’il valait mieux charger les scripts JavaScript en fin de page.

(Si on ne vous l’a pas expliqué, en voici la raison : tant que les scripts ne se sont pas exécutés, les instructions suivantes du fichier HTML (ou PHP) ne s’exécutent pas, ce qui signifie pour faire clair que la page ne s’affiche pas. Et l’utilisateur râle et ne revient plus car il vient de vivre ce qu’on appelle une mauvaise expérience utilisateur.)

Mais si vous avez eu cette erreur, c’est probablement parce que vous avez fait du zèle : vous avez mis les scripts JavaScript en toute fin du fichier, c’est-à-dire après le </body> et le </html>. C’est MAL ! Car après ces balises, il n’y a rien, vous avez précipité vos scripts dans le néant mais ce bon W3C Validator l’a vu.

L’optimum est de placer vos scripts juste avant la balise </body>.

Si vous êtes sous WordPress, un petit conseil : mettez-moi tout ça dans le footer.php de la manière suivante

<script src= »script1.js »></script>
<script src= »script2.js »></script>
<script src= »script3.js »></script>
</body>
</html>

(NB : vous remarquerez que j’ai utilisé la syntaxe de HTML5, soyons modernes !)

et en fin de chaque php WordPress personnalisé insérez le get_footer. Attention cependant si vous utilisez un thème existant ou un thème-fils d’un thème existant. Cette technique n’est sûre que si vous avez entièrement élaboré votre thème.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Pour en savoir plus, quelques livres sur WordPress