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…
- Gibt es so etwas?
- Ist es möglich, von einer einzelnen PHP-Datei in einem Themenordner aus zu erreichen?
- Gibt es offensichtliche Fallstricke oder Probleme bei diesem Ansatz?
- 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?
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:
- Wahrscheinlich. Es ist sicherlich möglich, dies zu tun.
- Ja.
- 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.
-
Viel Recherche
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.
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
}
}
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