Erreur xxx.live is not a function dans WordPress

A partir de la version 5.5 de WordPress, jQuery Migrate n’est plus activé par défaut. Par conséquent les vieux plugins (dans mon cas un Divi version 3) peuvent ne plus fonctionner.

L’erreur la plus commune semble être xxx.live is not a function

Pour corriger ce problème il faut installer Enable jQuery Migrate Helper qui le réactive.

Source : https://wordpress.org/support/topic/jqeuery-error-live-is-not-a-function/#post-13256885

Destinataires de mails avec Contact Form 7

Ça n’a rien de nouveau mais je ne m’en souviens jamais donc voici comment avoir un destinataire du mail envoyé par contact form 7 en fonction du choix fait par l’utilisateur dans le formulaire.

Mettre un champ select dans le formulaire avec comme choix « Texte à afficher|e-mail destinataire »

[select your-recipient "CEO|[email protected]"
                    "Sales|[email protected]"
                    "Support|[email protected]"]

Dans l’onglet e-mail, mettre [your-recipient] comme destinataire.

Si on veut la valeur choisie dans le corps du mail, il faut mettre [_raw_{field name}] soit ici [_raw_your-recipient]

Source : https://contactform7.com/selectable-recipient-with-pipes/

Télécharger un fichier depuis Google Drive à partir du terminal

J’ai eu à restaurer un site dont les archives sont envoyées automatiquement sur Google Drive. C’est un peu compliqué pour les rapatrier depuis la console.

Voici la méthode la plus simple que j’ai trouvée:

    1. Rendre le fichier public
    2. Trouver l’ID du fichier
      Gdoc advanced sharing
      C’est le code qui ressemble à 1DQDioijcvsdf78qsdqsd586 dans le lien de partage. entre les /
    3. Si le fichier est suffisamment petit pour pouvoir être analysé par l’antivirus de Google :
      wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=DOCUMENT_ID' -O FILENAME
    4. S’il est trop gros :
      curl -c /tmp/cookies "https://drive.google.com/uc?export=download&id=DOCUMENT_ID" > /tmp/confirmation.html
      curl -L -b /tmp/cookies "https://drive.google.com$(cat /tmp/confirmation.html | grep -Po 'uc-download-link" [^>]* href="\K[^"]*' | sed 's/\&/\&/g')" > FILENAME

Sources :

Contact Form 7 et Popup Maker

Popup Maker peut réagir aux validations des formulaires de Contact Form 7. Enfin il devrait parce que ça ne fonctionne plus.

Je ne sais pas à quel moment Contact Form 7 a changé le nom de ses événements : wpcf7:mailsent  est devenu wpcf7mailsent

Pour remédier à ça, il faut ajouter au JavaScript du site

    jQuery(document).on('wpcf7mailsent', '.wpcf7', function (e, t) {
        var event = new CustomEvent( 'wpcf7:mailsent', {
            bubbles: true,
            detail: e.detail
        } );
        e.target.dispatchEvent(event);
    });Langage du code : JavaScript (javascript)

comme cela les 2 événements sont envoyés.

Utiliser Bootstrap dans une partie d’une page

J’ai eu a créer une page avec Bootstrap dans un site n’utilisant pas Bootstrap

Bootstrap gérant l’apparence de toute la page, il fallait l’isoler dans une classe pour ne pas créer de conflits

Voici comment procéder :

  1. Télécharger la version compilée de Bootstrap
  2. Installer LESS
    npm install -g less
  3. Créer un fichier prefix.less dans le dossier du css de Bootstrap
    .bootstrap {
        @import (less) 'bootstrap.css';
    }
  4. Exécuter en ligne de commande
    lessc --math=strict prefix.less bootstrap-prefixed.css

    Vous aurez donc un fichier bootstrap-prefixed.css avec toutes les règles incluses dans une classe .bootstrap

  5. Il y a quelques corrections à apporter au début du fichier bootstrap-prefixed.css au niveau des règles appliquées à  :root  et body  :
    enlever .bootstrap  de :root  et remplacer.bootstrap body  par .bootstrap

Et voilà, vous pouvez utiliser ce fichier pour avoir le style de Bootstrap dans un élément ayant la classe .bootstrap.

Cela pouvait surement se faire en sass et j’aurais préféré, Bootstrap utilisant Sass, mais je n’ai pas trouvé de méthode simple.

Sources :

Supprimer les notices du mode debug de PrestaShop

Le mode debug de PrestaShop 1.7 fonctionne trop bien. Par défaut il s’arrête sur toutes les erreurs, avertissement ou notice, ce qui fait que quand un problème, même minime, se trouve en amont de ce que vous voulez corriger, le système s’arrête avant la partie qui vous intéresse.

Par exemple avec PHP 7.4, Doctrine utilisé par PrestaShop affiche un Warning : https://github.com/doctrine/DoctrineORMModule/issues/579 ce qui empêche tout débogage.

Pour corriger tout cela, il faut dire à Symfony quelles erreurs afficher :

On a 2 fichiers à modifier « classes/controller/FrontController.php » et « admin/index.php » dans les deux cas il faut remplacer

Debug::enable();Langage du code : CSS (css)

par

Debug::enable(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);Langage du code : PHP (php)

en adaptant le paramètre à ce qu’on veut. La documentation est ici : https://www.php.net/error_reporting

Il peut être utile de modifier aussi « config/defines.inc.php » en remplaçant

@error_reporting(E_ALL | E_STRICT);Langage du code : PHP (php)

par

@error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING);Langage du code : PHP (php)

Supprimer un site WordPress

Voici un script qui supprime un site WordPress. C’est une adaptation de Supprimer une boutique PrestaShop. Il suffit de le placer à la racine du site en FTP ou autre et de le visiter avec son navigateur.

⚠ Le script supprime le répertoire de WordPress avec tous ses fichiers et sous répertoires et toutes les tables de la base de données qui ont le préfixe de WordPress.

⚠⚠ Le script ne demande pas de confirmation. Vous le lancez, il supprime tout.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$root = dirname(__FILE__);
$server = false;
$user = false;
$password = false;
$database = false;
$prefix = false;

if (file_exists($root.'/wp-config.php')) {
    include $root.'/wp-config.php';
    $server = DB_HOST;
    $user = DB_USER;
    $password = DB_PASSWORD;
    $database = DB_NAME;
    $prefix = $table_prefix;
} else {
    die();
}

if (!$server || !$user || !$database || !$prefix) {
    die();
}

dropTables($server, $user, $password, $database, $prefix);
rrmdir($root);
mkdir($root);

// https://stackoverflow.com/questions/1589278/sql-deleting-tables-with-prefix#1589324
// https://stackoverflow.com/a/10664265/2530962
function dropTables($server, $user, $password, $database, $prefix)
{
    $link = mysqli_connect($server, $user, $password, $database);
    $query = 'SET SESSION group_concat_max_len = 999999999;
    SELECT CONCAT( \'DROP TABLE \', GROUP_CONCAT(table_name) , \';\' )
        AS statement FROM information_schema.tables
        WHERE table_schema = \''.mysqli_real_escape_string($link, $database).'\'
            AND table_name LIKE \''.mysqli_real_escape_string($link, $prefix).'%\';';
    if (mysqli_multi_query($link, $query)) {
        do {
            if ($result = mysqli_store_result($link)) {
                while ($row = mysqli_fetch_array($result)) {
                    $drop_query = $row[0];
                }
                mysqli_free_result($result);
            }
        } while (mysqli_more_results($link) && mysqli_next_result($link));
    }

    // echo 'MySQL "'.$drop_query.'"'.PHP_EOL;
    mysqli_query($link, $drop_query);
}

// https://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-files-sub-dir#3338133
function rrmdir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != "." && $object != "..") {
                if (is_dir($dir."/".$object)) {
                    rrmdir($dir."/".$object);
                } else {
                    // echo 'Delete '.$dir."/".$object.'    ';
                    if (unlink($dir."/".$object)) {
                        // echo 'OK';
                    } else {
                        // echo 'ERROR';
                    }
                    // echo PHP_EOL;
                }
            }
        }
        // echo 'Delete '.$dir.'    ';
        if (rmdir($dir)) {
            // echo 'OK';
        } else {
            // echo 'ERROR';
        }
        // echo PHP_EOL;
    }
}