获取所有插件的列表

时间:2018-08-23 16:43:11

标签: php wordpress

我想获得所有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
        ))));

这将返回我不需要的全部数据:

我唯一需要的数据是下面标记为黄色的键:nameslug

enter image description here

我知道我可以将它们从阵列中取出,但这对性能会非常不利。

即使我尝试循环使用,我也会获得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>";
        }
    }
}

2 个答案:

答案 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
        )));

将数据另存为JSON

由于我们获取的数据量巨大,并且会降低性能,因此我们尝试从数组中获取nameslug,然后将其写入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 ) );