Ist es möglich, Plugins aus dem WordPress-Design programmgesteuert zu installieren

Lesezeit: 9 Minuten

Mein Traum ist es, eine PHP-Datei in ein Design einzufügen, die überprüft, ob eine Reihe von Plugins installiert sind, und diejenigen installiert, die dies nicht sind. So etwas wie eine Reihe von Abhängigkeiten für das Theme, aber auch nur eine gute Möglichkeit, die Theme-Entwicklung so zu verpacken, dass sie eine Reihe guter Plugins enthält.

Meine Fragen…

  1. Gibt es so etwas?
  2. Ist es möglich, von einer einzelnen PHP-Datei in einem Themenordner aus zu erreichen?
  3. Gibt es offensichtliche Fallstricke oder Probleme bei diesem Ansatz?
  4. Wie würde ich vorgehen, um dies zu erreichen?
    • Ist es möglich, installierte Plugins aus dem Themenordner heraus aufzulisten?
    • Ist es möglich, Plug-in-Dateien herunterzuladen und im Plug-in-Ordner abzulegen?
    • Ist es möglich, Plugins aus dem Theme-Verzeichnis heraus zu aktivieren?

  • Die meisten Dinge, nach denen Sie fragen, sind bereits Dinge, zu denen WordPress in der Lage ist, was bedeutet, dass Sie sich ansehen können, wie sie es tun. Zum Beispiel können Sie mit WordPress Plugins installieren, Plugins aktivieren usw. usw. Sehen Sie, wie sie es tun.

    – Jamie Dixon

    27. April 2012 um 15:56 Uhr

Benutzer-Avatar
maiorano84

06.07.2018 EDIT: Wenn Sie auf diese Antwort stoßen, ist der unten hervorgehobene Code extrem veraltet und unsicher und sollte in keiner Weise außerhalb des Experimentierens auf einem lokalen Server verwendet werden. Wenn Sie nach einer moderneren Lösung für die Plugin-Verwaltung suchen, sollten Sie die Installation von WordPress über in Betracht ziehen Komponist und Urgestein


Ich würde empfehlen, NICHT programmgesteuert zu prüfen, ob bestimmte Plugins vorhanden sind, sie herunterzuladen, zu installieren und aus einer Designdatei heraus zu aktivieren. Sie müssen bedenken, dass die Überprüfung jedes Mal ausgeführt wird, wenn die angegebene Seite geladen wird, und zu viel überflüssigem Code und unnötigen Aktivitäten führen kann.

Stattdessen wäre mein Rat, alle Plugins, von denen Ihr Design abhängt, als Teil des Designs selbst und NICHT als Plugin zu verpacken. Plugins sollten nach Ermessen des Benutzers installiert werden. Wenn ein Design von einem Plugin abhängt, um richtig oder effizient zu funktionieren, dann sollte es wirklich mit dem Design selbst gepackt und heruntergeladen werden.

Aber um deine Fragen direkt zu beantworten:

  1. Wahrscheinlich. Es ist sicherlich möglich, dies zu tun.
  2. Ja.
  3. Siehe oben. Möglicherweise stoßen Sie auf weitere Probleme, wenn Sie ständig nach Plugins suchen und eine Reihe von Aktionen basierend auf diesen Bedingungen ausführen, anstatt nur alles Notwendige einzubeziehen.
  4. Viel Recherche

    • Wahrscheinlich
    • Ja
    • Ja

Ich kann jedoch nicht genug betonen, dass der Zweck eines PLUGINs darin besteht, dem Benutzer die Möglichkeit zu geben, die Fähigkeiten eines bestimmten Themas zu erweitern. Wenn die Fähigkeiten Ihres Themes von bestehenden Plugins ABHÄNGIG sind, sollten Sie wirklich WIRKLICH alle Dateien einschließen, wenn jemand Ihr Theme herunterlädt.

Wenn Sie jedoch der Meinung sind, dass Ihr Ansatz Ihrem Thema in einer Weise zugute kommt, die ich möglicherweise vermisse, können Sie ihn gerne so schreiben, wie Sie möchten.

VOLLSTÄNDIGE ANTWORT: Ich habe mich entschlossen, bei der Erstellung eines Proof of Concept für Sie zu helfen, weil ich gelangweilt und neugierig wurde. Vieles davon sollte selbsterklärend sein. Fügen Sie diese Funktionen hinzu:

function mm_get_plugins($plugins)
{
    $args = array(
            'path' => ABSPATH.'wp-content/plugins/',
            'preserve_zip' => false
    );

    foreach($plugins as $plugin)
    {
            mm_plugin_download($plugin['path'], $args['path'].$plugin['name'].'.zip');
            mm_plugin_unpack($args, $args['path'].$plugin['name'].'.zip');
            mm_plugin_activate($plugin['install']);
    }
}
function mm_plugin_download($url, $path) 
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    curl_close($ch);
    if(file_put_contents($path, $data))
            return true;
    else
            return false;
}
function mm_plugin_unpack($args, $target)
{
    if($zip = zip_open($target))
    {
            while($entry = zip_read($zip))
            {
                    $is_file = substr(zip_entry_name($entry), -1) == "https://stackoverflow.com/" ? false : true;
                    $file_path = $args['path'].zip_entry_name($entry);
                    if($is_file)
                    {
                            if(zip_entry_open($zip,$entry,"r")) 
                            {
                                    $fstream = zip_entry_read($entry, zip_entry_filesize($entry));
                                    file_put_contents($file_path, $fstream );
                                    chmod($file_path, 0777);
                                    //echo "save: ".$file_path."<br />";
                            }
                            zip_entry_close($entry);
                    }
                    else
                    {
                            if(zip_entry_name($entry))
                            {
                                    mkdir($file_path);
                                    chmod($file_path, 0777);
                                    //echo "create: ".$file_path."<br />";
                            }
                    }
            }
            zip_close($zip);
    }
    if($args['preserve_zip'] === false)
    {
            unlink($target);
    }
}
function mm_plugin_activate($installer)
{
    $current = get_option('active_plugins');
    $plugin = plugin_basename(trim($installer));

    if(!in_array($plugin, $current))
    {
            $current[] = $plugin;
            sort($current);
            do_action('activate_plugin', trim($plugin));
            update_option('active_plugins', $current);
            do_action('activate_'.trim($plugin));
            do_action('activated_plugin', trim($plugin));
            return true;
    }
    else
            return false;
}

… und dann so ausführen:

$plugins = array(
    array('name' => 'jetpack', 'path' => 'http://downloads.wordpress.org/plugin/jetpack.1.3.zip', 'install' => 'jetpack/jetpack.php'),
    array('name' => 'buddypress', 'path' => 'http://downloads.wordpress.org/plugin/buddypress.1.5.5.zip', 'install' => 'buddypress/bp-loader.php'),
    array('name' => 'tumblr-importer', 'path' => 'http://downloads.wordpress.org/plugin/tumblr-importer.0.5.zip', 'install' => 'tumblr-importer/tumblr-importer.php')
);
mm_get_plugins($plugins);

„Name“ kann alles sein, da es eher ein temporärer Wert ist. „Pfad“ ist genau das, wonach es aussieht, und ist die direkte URL zur ZIP-Datei auf dem WordPress-Server. Der Wert „install“ ist einfach der Pfad zum Haupt-PHP-Skript, das alle Plugin-Informationen enthält. Sie müssen das Layout dieses bestimmten Plugin-Verzeichnisses kennen, um diese Informationen auszufüllen, da dies auch erforderlich ist, damit der Aktivierungs-Hack funktioniert.

Aktivierungsfunktion wurde hier gefunden (Dank an sorich87): https://wordpress.stackexchange.com/questions/4041/how-to-activate-plugins-via-code

WARNUNG: Dies ist keineswegs ein sehr sicherer Weg, Dinge zu tun. Ich denke tatsächlich, dass dies ziemlich leicht missbraucht werden kann, also ist es unsere beste Wahl, dies als unsere Basis zu verwenden und zu versuchen, uns von dort aus zu verbessern.

Sollten Sie sich für diesen Ansatz entscheiden, Alles, worum ich bitte, ist, dass mir das anfängliche Gesamtskript gutgeschrieben wird, zusammen mit sorich87 für seinen Aktivierungsprozess Möge Gott deiner Seele gnädig sein.

06.07.2018 EDIT: Im Ernst, tun Sie das nicht. Nach heutigen Maßstäben ist dieser Code heißer Müll. Die Plugin-Verwaltung sollte durchgeführt werden Komponist und Urgestein.

  • Danke für deine gründliche und nachdenkliche Antwort. Ich denke, ich versuche, zwei Probleme anzugehen. Zum einen müssen alle Theme-Abhängigkeiten erfüllt sein, was Sie zu Recht erklärt haben, sollte ohne Plugins erfolgen. Und zweitens, um auf einfache Weise all die allgemeinen vernünftigen Plugins zu installieren, die ich immer für Kunden installiere. Ich möchte, dass der Client das Design installieren kann und dann alle Plugins automatisch installiert werden, ohne jedoch die Möglichkeit zu verlieren, sie in Zukunft zu entfernen oder zu ändern, wenn er dies wünscht.

    – Billy Mond

    27. April 2012 um 16:37 Uhr

  • Ein Beispiel dafür, warum ich das möchte, ist, dass ich ein Plugin hinzufügen kann, um den HTML-Editor so zu ändern, dass er Definitionen für Divs mit einer bestimmten Klasse hat, die vom Thema verwendet wird. Es ist ein wesentlicher Teil der Funktionsweise des Themas, um eine einfache Bearbeitung von Beiträgen zu ermöglichen und Teile als einer bestimmten Klasse zuzuordnen. Ich möchte den Client jedoch nicht daran hindern, weitere Änderungen vorzunehmen oder das Backend-System zu ändern, wenn er der Meinung ist, dass er eine bessere Möglichkeit hat, dies zu tun. Haben Sie irgendwelche Gedanken zu diesem Punkt?

    – Billy Mond

    27. April 2012 um 16:40 Uhr

  • Wenn Sie in diesem Fall eine Reihe von Plugins als vorgeschlagenen Toolbelt einbeziehen, kann ich sehen, dass Ihr Ansatz hilfreich und weniger aufdringlich ist als ursprünglich angenommen. Der Ansatz, den ich persönlich wählen würde, anstatt das Ganze zu automatisieren, wäre, einfach eine Reihe von empfohlenen Plugin-Links in eine Themendokumentation aufzunehmen (vielleicht in Ihre Themenoptionen). Aber es läuft wirklich auf die persönlichen Vorlieben hinaus. Nachdem Sie nun Ihren Ansatz verdeutlicht haben, kann ich sagen, dass an Ihren Ideen zur Verbesserung der Benutzerfreundlichkeit grundsätzlich nichts auszusetzen ist.

    – maiorano84

    27. April 2012 um 16:47 Uhr

  • @BillyMoon Überprüfen Sie mein Update für Details. Es ist ein wenig hässlich, aber ich habe keinen Zweifel, dass Sie es beim Herunterladen von Plugins vom WordPress-Server verwenden werden. Viel Glück.

    – maiorano84

    27. April 2012 um 17:32 Uhr

  • Das Skript sieht aus wie ein guter Ausgangspunkt. Ich denke, ich könnte auch Ihren anderen Vorschlag nehmen und eine Schaltfläche auf der Seite mit den Themeneinstellungen einfügen, die die Installation durchführt. Wenn ich einen halbwegs anständigen Nachweis der funktionierenden Methode erhalte, werde ich ihn zur hoffnungsvollen Verbesserung auf Git-Hub veröffentlichen und den Link hier posten. Danke für die Hilfe.

    – Billy Mond

    27. April 2012 um 17:46 Uhr

Benutzer-Avatar
Thomas

Inspiriert durch den Kommentar von Jamie Dixon habe ich mir angeschaut, wie WordPress funktioniert.

Der Ablauf ist in zu sehen /wp-admin/update.php ab Zeile 93. Eine Kurzversion könnte so erstellt werden:

include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); //for plugins_api..

$plugin = 'plugin-name';

$api = plugins_api( 'plugin_information', array(
    'slug' => $plugin,
    'fields' => array(
        'short_description' => false,
        'sections' => false,
        'requires' => false,
        'rating' => false,
        'ratings' => false,
        'downloaded' => false,
        'last_updated' => false,
        'added' => false,
        'tags' => false,
        'compatibility' => false,
        'homepage' => false,
        'donate_link' => false,
    ),
));

//includes necessary for Plugin_Upgrader and Plugin_Installer_Skin
include_once( ABSPATH . 'wp-admin/includes/file.php' );
include_once( ABSPATH . 'wp-admin/includes/misc.php' );
include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );

$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact('title', 'url', 'nonce', 'plugin', 'api') ) );
$upgrader->install($api->download_link);

Wenn Sie nicht möchten, dass das Feedback angezeigt wird, sollten Sie eine benutzerdefinierte Skin-Klasse erstellen. Zum Beispiel:

$upgrader = new \Plugin_Upgrader( new Quiet_Skin() );

class Quiet_Skin extends \WP_Upgrader_Skin {
    public function feedback($string)
    {
        // just keep it quiet
    }
}

  • @thomas : Ich bin ziemlich neu in PHP und WordPress, aber ich mache ein Plugin, um meine Fähigkeiten in beiden zu üben. Mein Plugin sollte prüfen, ob andere Plugins installiert sind (das funktioniert) und wenn nicht, sollte es sie installieren (das funktioniert noch nicht). Ich möchte Ihre Methode verwenden, da sie die Funktionalität von WordPress verwendet. Aber ich verstehe nicht, wie man es benutzt, können Sie ein Beispiel geben? Das erste Plugin, das ich zu installieren versuche, ist Yoast SEO. Danke für die Hilfe

    – Schalter87

    6. Januar 2017 um 14:30 Uhr

1365720cookie-checkIst es möglich, Plugins aus dem WordPress-Design programmgesteuert zu installieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy