WP-Cli 多站点报告

WP-Cli Multisite Reports

我已经安装了多站点并且设置了 wp-cli 并且可以正常工作。最理想的是,我需要的是 运行 的脚本,它将生成多站点安装中所有站点的列表以及活动主题的名称。

我可以弄清楚如何在单个站点的基础上运行,但我真正需要的是生成列表的能力。

我们的网络中有大约 400 多个站点,而且每周都在增加。有人解决过这个问题吗?


更新:虽然我觉得这可以更好地优化,但我现在大部分时间都在使用它。

我将其保存为 list_active_themes.sh 并通过 运行ning sh list_active_themes.sh > active_themes.json 将其输出为 JSON 文件.

最后一块是删除作为下面第 9 行结果的尾随逗号——我不知道如何计算返回的 site 结果以便执行 if 语句不输出如果它是 for 循环中的最后一个逗号。

这是我的代码:

echo "{"
for site in $(wp site list --domain=sample.domain.com --field=url --quiet)
    do
        echo -e '\t"site":{'
            printf '\t\t"url":"%s",\n' "$site"
            echo -e '\t\t"theme":"'|tr '\n' ''
            wp theme list --status=active --field=name --url=$site|tr '\n' ''
            echo '"'
        echo -e '\n\t},'
    done
echo "}"

我们可以将任务拆分为两个基本操作:

  1. 列出多站点安装中的所有站点:wp site list
  2. 获取主题列表:wp theme list

根据这些信息,我们可以获得网络中所有站点 URL 的列表:

wp site list --field=url

了解站点 URL,我们能够列出相关的 active 主题:

wp theme list --status=active --url="<site_url>"

现在我们可以设置一个基本的 bash 脚本来遍历网络中的每个站点并获取关联的主题:

#!/bin/bash
for site in $(wp site list --field=url)
do
    wp theme list --status=active --url=$site
done

将其保存到文件(例如 list_active_themes.sh)并从终端 运行 保存它:

sh list_active_themes.sh

现在让我们 return 我们自己的自定义列表,其中包含站点 URL + 主题名称,其结构如下:

Site: <site_url> Theme: <theme_name>

相应的 bash 脚本可能如下所示:

#!/bin/bash
for site in $(wp site list --field=url)
do
    echo Site:|tr '\n' ' '
    echo $site|tr '\n' ' '
    echo Theme:|tr '\n' ' '
    wp theme list --status=active --field=name --url=$site
done

(表达式 |tr '\n' ' ' replaces the newline with a space, |tr -d '\n' 完全删除换行符。)


更新:

使用--format=count选项将return站点总数;我们可以将此值用作循环中的条件并生成 JSON-like 结构(如您的评论所建议):

#!/bin/bash
COUNTER=1
SITES=$(wp site list --format=count)
echo "{"
for site in $(wp site list --field=url)
    do
        echo '\t"site":{'
            printf '\t\t"url":"%s",\n' "$site"
            echo '\t\t"theme":"'|tr -d '\n'
            wp theme list --status=active --field=name --url=$site|tr -d '\n'
            echo '"'
        echo '\n\t}'|tr -d '\n'
        if (($COUNTER != $SITES)); then
            echo ,
        fi
        COUNTER=$[$COUNTER +1]
    done
echo "\n}"

上面的脚本会return像这样:

{
    "site":{
        "url":"http://site_one.dev/",
        "theme":"theme_one"
    },
    "site":{
        "url":"http://site_one.dev/",
        "theme":"theme_two"
    }
}