Désactiver les fonctions d'abonnements dans Ghost 4

Le 16 mars 2021, l'équipe en charge du développement du moteur de blog Ghost annonce la sortie de la nouvelle mise à jour majeure de son logiciel, Ghost 4. Elle apporte son lot de nouveautés et d'améliorations mais aussi la colère auprès de beaucoup de ses utilisateurs.

Avec l'arrivée de Ghost 3.0, l'équipe de développement annonce l'arrivée de la fonctionnalité des abonnements et de la gestion des membres. Toutefois de souvenir, cette fonctionnalité était désactivable depuis l'interface d'administration. Or avec l'arrivée de Ghost 4, l'équipe de développement de Ghost met encore en plus en avant cette fonctionnalité en l'empêchant d'être désactivée mais aussi en dédiant quasiment toute la page d'accueil de l'administration de Ghost à cette fonctionnalité.

Ghost 4.0
Almost exactly 8 years ago, we announced the first prototype of Ghost onKickstarter. Today, over 20,000 commits later we’re releasing Ghost 4.0[https://ghost.org/features/], the latest major version of the product, as wellas small refresh of our brand. If you’re short on time, here

Pour des personnes comme probablement vous et moi, nous n'avons rien à faire de cette fonctionnalité et ce dont nous souhaitons le plus, c'est d'avoir un moteur de blog simple et fonctionnel comme lors des premières versions de Ghost.

En migrant mon blog vers Ghost 4, je me suis retrouvé avec des éléments intrusifs et avec pas mal de colère. Un bouton « Subscribe » dans le menu de navigation, un bouton en bas à droite de chaque page qui ouvre un genre de portail et enfin un formulaire d'inscription à une liste de diffusion à chaque fin d'article.

En désactivant le maximum de choses dans l'interface d'administration de Ghost, je remarque qu'un script est toujours chargé depuis le domaine unpkg.com et qu'une erreur 401 survient a chaque chargement de page.

Capture d'écran de la console où l'on aperçoit le chargement du script portal.js ainsi que de l'erreur 401
Capture d'écran du code injecté par Ghost pour le portail

Après plusieurs recherches dans le code source de Ghost et du thème Casper, je trouve le moyen de désactiver l'injection de ce bout de code. La suite de cet article vous permettra de les éradiquer de votre site. Toutefois, il sera impossible de masquer ses fonctionnalités dans l'interface d'administration de Ghost.

Supprimer les fonctionnalités d'abonnements sur son thème

Si comme moi vous utilisez encore le thème par défaut « Casper », les modifications a apporter pour supprimer toutes les fonctionnalités liées aux abonnements est très simple. Si vous utilisez un autre thème, la procédure sera probablement la même.

Dans un premier temps, il sera nécessaire de récupérer le code source du thème afin d'y apporter les modifications. Vous pouvez soit télécharger votre thème depuis votre interface d'administration et dé-zipper l'archive. Toutefois je vous recommande plutôt de faire un fork ou bien de cloner directement le dépôt sur votre machine :

git clone https://github.com/TryGhost/Casper.git casper-fork

La première étape dans le nettoyage du thème est de supprimer le bouton d'abonnement visible dans la barre de navigation. Pour cela, ouvrez le fichier default.hbs et supprimez les lignes suivantes :

{{#unless @member}}
    <a class="gh-head-button" href="#/portal/signup">Subscribe</a>
{{else}}
    <a class="gh-head-button" href="#/portal/account">Account</a>
{{/unless}}

La seconde étape est de se rendre dans le fichier post.hbs et de supprimer les lignes suivantes :

{{!-- A signup call to action is displayed here, unless viewed as a logged-in member --}}
{{#unless @member}}
<section class="footer-cta">
    <div class="inner">
        <h2>Sign up for more like this.</h2>
        <a class="footer-cta-button" href="#/portal">
            <div>Enter your email</div>
            <span>Subscribe</span>
        </a>
        {{!-- ^ This looks like a form element, but it's just a link to Portal,
        making the form validation and submission much simpler. --}}
    </div>
</section>
{{/unless}}

Le nettoyage étant terminé, il est désormais nécessaire de créer l'archive qui sera téléversé dans l'interface d'administration de Ghost.

Il faut dans un premier temps installer les dépendances nécessaires à créer l'archive. Pour cela, exécuter la commande suivante (NodeJS est nécessaire pour cette étape) :

npm install

Pour créer l'archive la commande à exécuter est la suivante (à exécuter à chaque modification du thème) :

npm run zip

Rendez-vous dans les paramètres de votre instance, dans la section theme, appuyez sur le bouton « Upload a theme » et téléversez l'archive disponible dans le dossier dist.

Désormais, le bouton d'abonnement ne devrait désormais plus s'afficher tout comme le bloc d'inscription à la liste de diffusion en fin d'article.

Désactiver l'injection du portal.js

Pour les versions 4.0 jusqu'à la 4.2

Si vous utilisez une version de Ghost supérieure ou égale à la 4.0 et inférieure à la 4.3 (fonctionne aussi, mais il est préférable de procéder d'une autre façon), une modification du code de Ghost est nécessaire.

Rendez-vous dans le fichier core/frontend/helpers/ghost_head.js et recherchez le morceau de code suivant :

// no code injection for amp context!!!
if (!_.includes(context, 'amp')) {
    head.push(getMembersHelper(options.data));

    if (!_.isEmpty(globalCodeinjection)) {
        head.push(globalCodeinjection);
    }

En commentant la ligne head.push(getMembersHelper(options.data));, on arrête d'appeler la méthode qui injecte le code pour charger le script portal.js.

Désormais, le code devrait ressembler à ceci :

// no code injection for amp context!!!
if (!_.includes(context, 'amp')) {
    // head.push(getMembersHelper(options.data));

    if (!_.isEmpty(globalCodeinjection)) {
        head.push(globalCodeinjection);
    }

Il ne reste désormais plus qu'à suivre l'étape finale !

Pour les versions 4.3 et supérieures

Si vous avez mis a jour votre instance vers la version 4.3 (et supérieur), aucune modification de code dans le cœur de Ghost n'est nécessaire. À en croire le code source du helper ghost_head, une condition a été introduite afin de ne pas injecter le code qui charge le script portal.js. En creusant un peu, on comprend rapidement que la clé de configuration est stockée dans la base de données et non dans les fichiers de configuration. Une simple requête SQL pourrait suffire à désactiver cette horrible fonctionnalité ? Allons-y !

Dans un premier temps, ouvrez le client de votre serveur de base de données (qu'il soit dans un terminal, une version graphique ou dans votre navigateur) connectez-vous à la base de données de votre instance Ghost et exécuter la requête suivante :

UPDATE settings SET value = 'none' WHERE settings.key = 'members_signup_access';

C'est tout ! Il ne reste désormais plus qu'à suivre l'étape finale et adios méchant script !

L'étape finale

Il ne reste désormais plus que qu'à redémarrer votre instance et patientez quelques instants. Une fois l'instance de retour, rendez-vous sur votre site, ouvrez la console de votre navigateur dans l'onglet « Réseau » et rafraîchissez la page en invalidant le cache de votre navigateur (ctrl + shift + R ou bien utilisez un paramètre bidon dans l'URL, par exemple : monsite.com?blabla).

Si tout va bien, le chargement du fichier portal.js ainsi que l'appel API ne devrait plus figurer parmi les ressources appelées.

Capture d'écran de l'onglet réseau sans les appels du script portal.js

Si vous inspectez le code source de votre page, l'import ainsi que le code CSS inline ne devrait désormais plus être présent.

Capture d'écran du code source de la page sans le code injecté par Ghost

Conclusion

L'équipe de développement de Ghost continue de pousser des fonctionnalités au point d'en faire des MVP (Most valuable product) et ce au plein gré des critiques de la communauté.

L'ajout de la condition (et de la clé de configuration members_signup_access) dans le code du helper ghost_head n'est probablement pas anodine. Avec un peu de chance, il s'agit peut-être d'un début de réponse aux critiques de la communauté et qu'un potentiel paramètre dans l'interface d'administration pourrais arriver dans les prochaines mises à jour.