我想获得所有Wordpress插件的列表。
有一个名为get_plugins()
的函数,但它将返回我已安装的所有插件。我需要的是所有插件的列表,无论是否已安装它们。
有没有可以使用的功能?如果没有,是否有JSON,数据库,API或我可以使用的任何东西?
编辑:
var_dump(plugins_api('query_plugins', array(
'per_page' => 100,
'tag' => 'contact form 7',
'number' => 5,
'page' => 1,
'fields' =>
array(
'short_description' => false,
'description' => false,
'sections' => false,
'tested' => false,
'requires' => false,
'rating' => false,
'ratings' => false,
'downloaded' => false,
'downloadlink' => false,
'last_updated' => false,
'added' => false,
'tags' => false,
'compatibility' => false,
'homepage' => false,
'versions' => false,
'donate_link' => false,
'reviews' => false,
'banners' => false,
'icons' => false,
'active_installs' => false,
'group' => false,
'contributors' => false
))));
这将返回我不需要的全部数据:
我唯一需要的数据是下面标记为黄色的键:name
和slug
我知道我可以将它们从阵列中取出,但这对性能会非常不利。
即使我尝试循环使用,我也会获得45个插件,但不会更多。其余在哪里?
foreach ($plugins as $plugin) { // $plugins is the variable of my code above but without 'tag' => 'contact form 7',
foreach ($plugin as $p) {
if ($p != null) {
echo $p->name . "<br>";
}
}
}
答案 0 :(得分:3)
不是最好的答案,但我试图以最好的方式解决自己的问题。
这将不返回所有插件,但将返回评价最高的插件:
$plugins = plugins_api('query_plugins', array(
'per_page' => 100,
'browse' => 'top-rated',
'fields' =>
array(
'short_description' => false,
'description' => false,
'sections' => false,
'tested' => false,
'requires' => false,
'rating' => false,
'ratings' => false,
'downloaded' => false,
'downloadlink' => false,
'last_updated' => false,
'added' => false,
'tags' => false,
'compatibility' => false,
'homepage' => false,
'versions' => false,
'donate_link' => false,
'reviews' => false,
'banners' => false,
'icons' => false,
'active_installs' => false,
'group' => false,
'contributors' => false
)));
由于我们获取的数据量巨大,并且会降低性能,因此我们尝试从数组中获取name
和slug
,然后将其写入JSON文件:
$plugins_json = '{' . PHP_EOL;
// Get only the name and the slug
foreach ($plugins as $plugin) {
foreach ($plugin as $key => $p) {
if ($p->name != null) {
// Let's beautify the JSON
$plugins_json .= ' "'. $p->name . '": {' . PHP_EOL;
$plugins_json .= ' "slug": "' . $p->slug . '"' . PHP_EOL;
end($plugin);
$plugins_json .= ($key !== key($plugin)) ? ' },' . PHP_EOL : ' }' . PHP_EOL;
}
}
}
$plugins_json .= '}';
file_put_contents('plugins.json', $plugins_json);
现在,我们有了一个仅包含所需数据的细长JSON文件。
为了不断更新JSON文件,我们通过设置Cron作业每24小时运行该脚本以创建一个JSON文件。
答案 1 :(得分:1)
由于一次性获取所有插件对于服务器来说太重了,因此最好逐步进行。
您可以一次处理服务器可以处理的尽可能多的插件。例如,我一次使用了一个安全的100个插件。
每次脚本运行时,它将“ page”编号增加1。因此,下次脚本运行时,将检索下100个插件。现有plugins.json
的内容将被解析。在对新插件进行编码和再次保存之前,会将新插件添加到现有数据中(如果已有插件,则将其覆盖)。
如果页码超过最后一页,则不会返回任何结果。这样脚本可以知道接下来没有更多的插件了。然后将页面重置为1,因此重新开始。
我使用wp_options
表来跟踪页面,仅仅是因为这是最快的方法。最好使用某种文件系统缓存。如果需要,手动重置将更容易。
您可以设置 cronjob 来每隔x分钟执行脚本。现在plugins.json
文件将在每次运行时逐步建立并逐步增长。
// get the current "page", or if the option not exists, set page to 1.
$page = get_option( 'plugins_page' ) ? (int)get_option( 'plugins_page' ) : 1;
// get the plugin objects
$plugins = plugins_api( 'query_plugins', [
'per_page' => 100,
'page' => $page,
'fields' => [
//.........
]
] );
// increment the page, or when no results, reset to 1.
update_option( 'plugins_page', count( $plugins ) > 0 ? ++ $page : 1 );
// build up the data array
$newData = [];
foreach ( $plugins as $plugin ) {
foreach ( $plugin as $key => $p ) {
if ( $p->name != null ) {
$newData[ $p->name ] = [ 'slug' => $p->slug ];
}
}
}
// get plugin data already in file.
// The last argument (true) is important. It makes json objects into
// associative arrays so they can be merged with array_merge.
$existingData = json_decode( file_get_contents( 'plugins.json' ), true );
// merge existing data with new data
$pluginData = array_merge( $existingData, $newData );
file_put_contents( 'plugins.json', json_encode( $pluginData ) );