我的梦想是在主题中包含一个 php 文件,该文件检查是否安装了一组插件,并安装没有安装的插件。有点像主题的一组依赖项,但也是打包主题开发以包含一组好的插件的好方法。
我的问题...
- 有这样的东西吗?
- 是否可以从主题文件夹中的单个 php 文件实现?
- 这种方法是否存在任何明显的陷阱或问题?
- 我将如何实现这一目标?
- 是否可以从主题文件夹中枚举已安装的插件?
- 是否可以下载插件文件并将其放置在插件文件夹中?
- 是否可以从主题目录中激活插件?
最佳答案
07/06/2018 编辑:如果您遇到这个答案,下面突出显示的代码非常过时和不安全并且应该除了在本地服务器上进行实验外,不得以任何其他方式使用。如果您正在寻找更现代的插件管理解决方案,请考虑通过 Composer and Bedrock 安装 Wordpress。
我建议不要以编程方式检查某些插件是否存在,也不要从任何主题文件中下载、安装和激活它们。您必须考虑到每次加载给定页面时都会运行检查,这可能会导致大量多余的代码和不必要的事件。
相反,我的建议是将您的主题所依赖的任何插件打包为主题本身的一部分,而不是作为插件。插件的安装应由用户自行决定。如果主题依赖于插件才能正常或高效地运行,那么它确实应该与主题本身一起打包和下载。
但是直接回答你的问题:
- 可能吧。这当然是可能的。
- 是的。
- 见上文。通过不断检查插件并根据这些条件运行一系列操作,而不是仅仅包括所需的一切,您可能会遇到更多问题。
-
- 可能
- 是
- 是
不过,我怎么强调都不为过,PLUGIN 的目的是为用户提供扩展给定主题功能的选项。如果您的主题的功能取决于现有插件,那么当有人下载您的主题时,您真的应该包含所有文件。
尽管如果您觉得您的方法以我可能遗漏的方式有益于您的主题,请随意编写您喜欢的内容。
完整答案:我决定帮助您创建一个概念验证,因为我感到无聊和好奇。其中大部分应该是不言自明的。添加这些函数:
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) == '/' ? 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;
}
...然后像这样执行:
$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' 可以是任何东西,因为它更像是一个临时值。 “路径”正是它看起来的样子,是 Wordpress 服务器上 zip 文件的直接 URL。 'install' 值只是包含所有插件信息的主 PHP 脚本的路径。您必须知道该特定插件目录的布局才能填写此信息,因为这也是激活破解工作所必需的。
在这里找到激活函数(归功于 sorich87):https://wordpress.stackexchange.com/questions/4041/how-to-activate-plugins-via-code
警告:这绝不是一种非常安全的做事方式。实际上,我认为这很容易被滥用,所以我们最好的办法是将其用作我们的基线并尝试从那里改进。
如果您决定使用这种方法,我想问的是,最初的整个脚本以及他的激活过程都归功于我 愿上帝保佑怜悯你的灵魂。
07/06/2018 编辑:说真的,不要这样做。按照今天的标准,这段代码是热垃圾。插件管理应通过 Composer and Bedrock 完成.
关于php - 是否可以通过 wordpress 主题以编程方式安装插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10353859/