【问题标题】:Getting a list of ALL plugins获取所有插件的列表
【发布时间】:2018-08-23 16:43:10
【问题描述】:

我想获取所有 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

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

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

【问题讨论】:

  • 查看answer here,虽然它已经有几年历史了。更多信息 herehere
  • @MarsAndBack 谢谢,非常好的信息! https://api.wordpress.org/plugins/info/1.0/all-in-one-seo-pack.json 返回一个 JSON,其中包含插件“All in one SEO pack”的所有信息。但是获取所有插件列表的 URL 是什么?如果您知道,请将其作为答案发布,我会接受。
  • 有一个插件API,您可以像这样查询插件:$api = plugins_api( 'query_plugins', $args );`developer.wordpress.org/reference/functions/plugins_api
  • @jrswgtr 我用过plugins_api('hot_tags'), array('page' =&gt; 90000000000, 'number' =&gt; 90000000000)。它返回一些插件,但不是全部。
  • 试试这个:$api = plugins_api( 'query_plugins', [ 'per_page' =&gt; -1 ] )

标签: php wordpress


【解决方案1】:

不是最好的答案,但我试图以最好的方式解决我自己的问题。

获取插件列表

这将不会返回所有插件,但会返回评分最高的插件:

$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 文件。

【讨论】:

  • 看起来不错。您可以将数据放在嵌套数组中,而不是连接字符串。然后当完成调用json_encode()就可以了。看起来干净一些。
  • 如果您仍然想要所有插件,我可以为您提供解决方案。我没有意识到你会使用 cronjobs,所以我想到了一个解决方案。如果您有兴趣,我会在答案中为您解决。
  • @jrswgtr 首先我用json_encode() 尝试了它,但它在 JSON 中包含了一个数组。因为我不想有一个数组,所以我就这样尝试了。我仍然对所有插件感兴趣。如果您有解决方案,请将其作为答案发布。这将非常有帮助!
【解决方案2】:

因为一次获取​​所有插件对于服务器来说太重了,所以最好分步进行。

您可以一次执行服务器可以处理的尽可能多的插件。例如,我一次使用安全的 100 个插件。

每次脚本运行时,它都会将“页”号增加 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 ) );

【讨论】:

  • 感谢您的出色回答,您的代码看起来很棒! JSON 文件包含 857 行,即 285 个插件。比我的版本有 45 个插件,但实际上有 56.163 个插件。
  • @RezaSaadati 如果 cron 作业继续运行,如果正确,文件将继续增长。它多久运行一次?你又检查过文件了吗?
  • 哦,哇,我没有意识到这一点。这绝对是最好的解决方案。惊人的!非常感谢!
  • 这是我的荣幸。周末愉快,编码愉快!如果您有任何其他问题,请提出。
  • @RezaSaadati 我稍微更新了我的答案。我希望让您对我的代码的工作原理有更多的了解。
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
相关资源
最近更新 更多