WordPress: определите и загрузите плагины Mu, размещенные внутри или за пределами вашего экземпляра WordPress | Зона Мартех

Один из моих коллег переносил клиентский сайт, готовясь принять на себя управление его учетной записью, и был шокирован, когда после успешной миграции сайт не работал должным образом. Эта проблема вызвала большое разочарование в отрасли. Агентство создало специальные функции, которые были недоступны клиенту — ни через SFTP, ни через администрирование WordPress. Позже я объясню, как… и как мне удалось решить проблему.

В WordPress, мю плагины (обязательные плагины) — это специальные типы плагинов WordPress, которые активируются автоматически и не могут быть деактивированы из панели администратора WordPress. Что в в мю плагины означает нужно использовать.

Когда ты идешь в Плагины В разделе панели администратора WordPress вы увидите только общие плагины, которые можно активировать, деактивировать и управлять ими индивидуально. С другой стороны, плагины Mu автоматически активируются и Не отображается в этом списке. Вот некоторые ключевые моменты о плагинах mu:

  • Расположение: Плагины Mu расположены в отдельной именованной папке. mu-plugins в wp-content папка для вашей установки WordPress.
  • Автоматическая активация: В отличие от обычных плагинов, mu-плагины активируются автоматически и не могут быть отключены из панели администратора WordPress. Они всегда активны, пока присутствуют в mu-plugins каталог.
  • Приоритет: Плагины Mu загружаются раньше обычных плагинов. Это означает, что у них есть возможность переопределить или изменить поведение распространенных плагинов.
  • Соглашение об именовании: Плагины Mu не следуют тому же соглашению об именах, что и обычные плагины. Они могут иметь любое имя, но расширение файла должно быть .php. Например, my-custom-functions.php может быть допустимым именем файла плагина mu.
  • Случаи использования: Плагины Mu обычно используются для:
    • Реализация специфичного для сайта функционала, который должен быть всегда активен.
    • Изменение основного поведения WordPress или переопределение функций по умолчанию.
    • Заставляет определенные плагины быть активными на всех сайтах в многосайтовой сети.
    • Использование пользовательского кода или модификаций, которые не должны быть доступны или отключены администраторами сайта.
  • Мультисайт: В многосайтовой сети WordPress плагины mu являются глобальными и влияют на все сайты в сети. Они загружаются раньше обычных плагинов на каждом сайте.
  • Обновления: Плагины Mu не можно обновить через административную панель WordPress. Их необходимо обновить вручную, заменив соответствующие файлы в mu-plugins каталог.
ЧИТАТЬ   Утечка рендеров iPhone 16 Pro может дать нам первый взгляд на предполагаемую кнопку захвата

В данном конкретном случае у агентства был плагин mu, который включал родительскую папку, в которой были созданы специальные плагины для клиента. Этот родительский каталог находился в их среде хостинга, но вообще не был доступен клиенту. На мой взгляд, это действительно жутко. Продвижение WordPress среди ваших клиентов предполагает наличие платформы с открытым исходным кодом.

Скрывая код от своих клиентов, вы лишаете их возможности мигрировать от вас или самостоятельно управлять экземпляром. Вы держите их в заложниках, пока они не создадут новый сайт с нуля. Я не говорю, что агентство сделало что-то противозаконное… Я уверен, что у них были подробности этого в их MSA или SOW. Однако это не делает это правильным.

Плагин WordPress: как определить и загрузить плагины mu

Если вы можете выполнить код PHP, вы в конечном итоге сможете получить доступ к этому коду. Поэтому я написал собственный плагин, который можно было установить на сервер, и создал в папке шорткод с mu-плагинами. Я сделал черновик страницы с [listmuplugins] в содержимом и отобразил его в новом окне. Он дал мне плагин mu, установленный агентством.

Обратите внимание mu-plugin папка видна через SFTP, но они сделали что-то более хитрое. Когда я открыл их плагин, я обнаружил, что они написали функцию для включения папки, недоступной из среды хостинга клиента! Поэтому я обновил свой код, чтобы разрешить обход определенного каталога, который они включили. [listmuplugins dir="/custom/path/"].

Как только я обновил код карты до пути, который они указали в своих mu-plugin, я мог прочитать и загрузить каждый плагин, необходимый для работы сайта. Вот скриншот вывода (я удалил все пользовательские настройки агентства). mu-plugins).

ЧИТАТЬ   Это приложение за 7 долларов удвоило производительность моего игрового ПК | Цифровые тенденции

Затем я смог написать собственные плагины, которые исправили все проблемы на сайте. Не зная, есть ли у них юридическое соглашение, я не хотел просто копировать код агентства… несмотря на то, что в исходнике у них не было информации об авторских правах.

Как использовать этот плагин

Я не буду публиковать это в репозитории WordPress, так как не считаю, что его следует распространять без какой-либо ответственности. Тем не менее, вы можете использовать его, если вам это нужно.

  1. Сохранение: Сохраните весь код как listmuplugins.php в новой папке с именем listmuplugins внутри вашего WordPress /wp-content/plugins/ каталог. Или вы можете заархивировать папку и файл PHP и загрузить их через панель администратора плагина WordPress.

  2. Давать возможность: Активируйте плагин по названию Список плагинов MU с загрузкой и структурой каталогов в панели управления плагином WordPress.
  3. Использование шорткода:
    • [listmuplugins] : отображает плагины MU по умолчанию на вашем сайте. wp-content/mu-plugins/ каталог.
    • [listmuplugins dir="/custom/path/"]: выводит список плагинов MU из указанной папки.
<?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: 
*/

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