Fermer

mai 9, 2024

WordPress : identifiez et téléchargez les plugins Mu hébergés dans ou en dehors de votre instance WordPress

WordPress : identifiez et téléchargez les plugins Mu hébergés dans ou en dehors de votre instance WordPress


Un de mes collègues a migré un site client en vue de reprendre son compte et a été stupéfait lorsque, après une migration réussie, le site ne fonctionnait pas correctement. Le problème était assez frustrant dans l’industrie. L’agence a créé des fonctionnalités personnalisées inaccessibles au client – ​​soit via SFTP ou l’administration WordPress. J’expliquerai comment plus tard… et comment j’ai pu contourner le problème.

Dans WordPress, plugins mu (plugins à utiliser) sont des types spéciaux de plugins WordPress qui sont automatiquement activés et ne peuvent pas être désactivés à partir du panneau d’administration WordPress. Le dans dans plugins mu représente doit utiliser.

Quand tu vas au Plugins Dans la section du panneau d’administration WordPress, vous ne verrez que les plugins standards qui peuvent être activés, désactivés et gérés individuellement. Les plugins Mu, en revanche, sont automatiquement activés et n’apparait pas dans cette liste. Voici quelques points clés sur les plugins mu :

  • Emplacement: Les plugins Mu se trouvent dans un répertoire séparé nommé mu-plugins dans le wp-content répertoire de votre installation WordPress.
  • Activation automatique : Contrairement aux plugins classiques, les mu-plugins sont activés automatiquement et ne peuvent pas être désactivés depuis le panneau d’administration WordPress. Ils sont toujours actifs tant qu’ils sont présents dans le mu-plugins annuaire.
  • Priorité: Les plugins Mu sont chargés avant les plugins standards. Cela signifie qu’ils ont la possibilité de remplacer ou de modifier le comportement des plugins classiques.
  • Convention de dénomination : Les plugins Mu ne suivent pas la même convention de dénomination que les plugins classiques. Ils peuvent avoir n’importe quel nom, mais l’extension du fichier doit être .php. Par exemple, my-custom-functions.php peut être un nom de fichier de plugin mu valide.
  • Cas d’utilisation : Les plugins Mu sont couramment utilisés pour :
    • Implémentation de fonctionnalités spécifiques au site qui doivent toujours être actives.
    • Modification du comportement principal de WordPress ou remplacement des fonctionnalités par défaut.
    • Obliger certains plugins à être actifs sur tous les sites d’un réseau multisite.
    • Application de code personnalisé ou de modifications qui ne doivent pas être accessibles ou désactivables par les administrateurs du site.
  • Multisites : Dans un réseau multisite WordPress, les mu-plugins sont globaux et affectent tous les sites du réseau. Ils sont chargés avant les plugins réguliers sur chaque site.
  • Mises à jour: Les plugins Mu sont pas pouvant être mis à jour via le panneau d’administration WordPress. Ils doivent être mis à jour manuellement en remplaçant les fichiers respectifs dans le mu-plugins annuaire.

Dans ce cas particulier, l’agence disposait d’un plugin mu qui incluait un répertoire parent dans lequel elle avait créé des plugins personnalisés pour le client. Ce répertoire parent se trouvait sur leur environnement d’hébergement mais n’était pas du tout accessible au client. C’est vraiment sinistre, à mon avis. La promotion de WordPress auprès de vos clients s’accompagne de l’attente d’une plateforme open source.

En cachant le code à vos clients, vous leur empêchez de migrer loin de vous ou de gérer l’instance de manière indépendante. En gros, vous les tenez en otage à moins qu’ils ne créent un nouveau site à partir de zéro. Je ne prétends pas que l’agence ait fait quoi que ce soit d’illégal… Je suis certain qu’ils avaient des détails à ce sujet dans leur MSA ou TRUIE. Cependant, cela ne rend pas les choses correctes.

Plugin WordPress : comment identifier et télécharger les plugins mu

Si vous pouvez exécuter PHP code, vous pouvez finalement accéder à ce code. J’ai donc écrit un plugin personnalisé qui pourrait être installé sur le serveur et créé un shortcode répertoriant les mu-plugins dans le répertoire. J’ai créé un brouillon de page avec [listmuplugins] dans le contenu et l’ai prévisualisé dans une nouvelle fenêtre. Cela m’a fourni le plugin mu installé par l’agence.

Noter la mu-plugin Le répertoire est visible via SFTP, mais ils ont fait quelque chose de très sournois. Lorsque j’ai ouvert leur plugin, j’ai découvert qu’ils avaient écrit une fonction pour inclure un répertoire inaccessible depuis l’environnement d’hébergement du client ! J’ai donc mis à jour mon code pour permettre l’exploration du répertoire spécifique qu’ils incluaient avec [listmuplugins dir="/custom/path/"].

Une fois que j’ai mis à jour le shortcode avec le chemin qu’ils ont fourni dans leur mu-plugin, j’ai pu lire et télécharger tous les plugins dont le site avait besoin pour fonctionner. Voici une capture d’écran du résultat (j’ai supprimé tous les paramètres personnalisés de l’agence) mu-plugins).

Voir les plugins mu WordPress

J’ai ensuite pu écrire des plugins personnalisés, qui ont corrigé tous les problèmes du site. Etant donné que je ne savais pas s’ils avaient un accord légal, je ne voulais pas me contenter de copier le code de l’agence… malgré le fait qu’ils n’avaient aucune information de copyright dans la source.

Comment utiliser ce plugin

Je ne publierai pas ceci dans le référentiel WordPress car je ne pense pas qu’il devrait être diffusé sans une certaine responsabilité. Voici cependant comment vous pouvez l’utiliser si vous en avez besoin.

  1. Sauvegarder: Enregistrez l’intégralité du code sous listmuplugins.php dans un nouveau dossier nommé listmuplugins dans votre WordPress /wp-content/plugins/ annuaire. Ou vous pouvez compresser le répertoire et le fichier PHP et les télécharger via le panneau d’administration du plugin WordPress.

  2. Activer: Activez le plugin intitulé Répertorier les plugins MU avec téléchargement et structure de répertoires dans le tableau de bord de vos plugins WordPress.
  3. Utilisation du code court :
    • [listmuplugins] : Répertorie les plugins MU par défaut de votre site wp-content/mu-plugins/ annuaire.
    • [listmuplugins dir="/custom/path/"]: Répertorie les plugins MU d’un répertoire spécifié.
<?php
/*
Plugin Name: List MU Plugins with Download and Directory Structure
Description: Lists Must-Use Plugins with the ability to download their source code, and displays the directory structure. Directory can be specified in the shortcode.
Version: 2.0
Author: Douglas Karr
Author URI: https://dknewmedia.com
*/

function list_mu_plugins_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'dir' => WPMU_PLUGIN_DIR // Default to site's MU Plugins directory
    ), $atts );

    $dir = $atts['dir'];

    // Validate the directory path
    if ( ! is_dir( $dir ) || ! is_readable( $dir ) ) {
        return "<p>MU Plugins directory not found or not readable.</p>\n";
    }

    $output = "<h2>List of Included MU Plugins:</h2>\n";
    $output .= list_directory_contents( $dir );

    return $output;
}
add_shortcode( 'listmuplugins', 'list_mu_plugins_shortcode' );

function list_directory_contents( $dir ) {
    $output = "<ul>\n";
    $items = scandir( $dir );

    foreach ( $items as $item ) {
        if ( $item === '.' || $item === '..' ) {
            continue;
        }

        $path = $dir . '/' . $item;

        if ( is_dir( $path ) ) {
            $output .= '<li><strong>' . esc_html( $item ) . '/</strong>';
            $output .= list_directory_contents( $path );
            $output .= '</li>';
        } else {
            $output .= '<li>' . esc_html( $item );
            if ( current_user_can( 'manage_options' ) ) {
                $download_link = add_query_arg( ['mu_plugin_download' => $item] );
                $output .= ' <a href="' . esc_url( $download_link ) . '">Download</a>';
            }
            $output .= '</li>';
        }
    }

    $output .= "</ul>\n";
    return $output;
}

// Handle the download request
function handle_mu_plugin_download() {
    if ( isset( $_GET['mu_plugin_download'] ) && current_user_can( 'manage_options' ) ) {
        $filename = sanitize_file_name( $_GET['mu_plugin_download'] );
        $filepath = WPMU_PLUGIN_DIR . '/' . $filename;

        if ( file_exists( $filepath ) && is_readable( $filepath ) ) {
            header( 'Content-Description: File Transfer' );
            header( 'Content-Type: application/octet-stream' );
            header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
            header( 'Expires: 0' );
            header( 'Cache-Control: must-revalidate' );
            header( 'Pragma: public' );
            header( 'Content-Length: ' . filesize( $filepath ) );
            readfile( $filepath );
            exit;
        } else {
            wp_die( 'File not found or not readable.' );
        }
    }
}
add_action( 'init', 'handle_mu_plugin_download' );




Source link