{"id":71296,"date":"2025-03-04T11:29:40","date_gmt":"2025-03-04T14:29:40","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=71296&#038;preview=true&#038;preview_id=71296"},"modified":"2025-03-05T10:26:58","modified_gmt":"2025-03-05T13:26:58","slug":"shell-scripts-api-da-kinsta","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/","title":{"rendered":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta"},"content":{"rendered":"<p>Se voc\u00ea gerencia muitos sites WordPress, provavelmente est\u00e1 sempre em busca de maneiras de simplificar e acelerar seus fluxos de trabalho.<\/p>\n<p>Agora, imagine o seguinte: com um \u00fanico comando em seu <a href=\"https:\/\/kinsta.com\/pt\/blog\/wp-cli-v2\/\">terminal<\/a>, voc\u00ea pode acionar backups manuais para todos os seus sites, mesmo que esteja gerenciando dezenas deles. Esse \u00e9 o poder da combina\u00e7\u00e3o de scripts de shell com a <a href=\"https:\/\/kinsta.com\/pt\/docs\/kinsta-api\/\">API da Kinsta<\/a>.<\/p>\n<p>Este guia ensina como usar scripts Shell para configurar comandos personalizados que tornam o gerenciamento dos seus sites muito mais eficiente.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Pr\u00e9-requisitos<\/h2>\n<p>Antes de come\u00e7armos, aqui est\u00e1 o que voc\u00ea precisa:<\/p>\n<ol start=\"1\">\n<li><strong>Um terminal<\/strong>: Todos os sistemas operacionais modernos v\u00eam com software de terminal, portanto, voc\u00ea pode come\u00e7ar a criar scripts imediatamente.<\/li>\n<li><strong>Um IDE ou editor de texto<\/strong>: Use uma ferramenta com a qual voc\u00ea se sinta confort\u00e1vel, seja o VS Code, o Sublime Text ou at\u00e9 mesmo um editor leve como o Nano para edi\u00e7\u00f5es r\u00e1pidas no terminal.<\/li>\n<li><strong>Uma chave de API da Kinsta<\/strong>: Isso \u00e9 essencial para voc\u00ea interagir com a <a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">API da Kinsta<\/a>. Para gerar a sua:\n<ul>\n<li>Fa\u00e7a login em seu painel <a href=\"https:\/\/my.kinsta.com\/login\/?lang=pt\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>V\u00e1 para <strong>Seu nome<\/strong> &gt; <strong>Configura\u00e7\u00f5es da empresa<\/strong> &gt; <strong>Chaves API<\/strong>.<\/li>\n<li>Clique em <strong>Criar chave API<\/strong> e salve-a com seguran\u00e7a.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>curl<\/code><\/strong><strong> e <\/strong><strong><code>jq<\/code><\/strong>: Essenciais para fazer solicita\u00e7\u00f5es de API e manipular dados JSON. Certifique-se de que est\u00e3o instalados ou instale-os se necess\u00e1rio.<\/li>\n<li><strong>Conhecimento b\u00e1sico de programa\u00e7\u00e3o<\/strong>: Voc\u00ea n\u00e3o precisa ser um especialista, mas ser\u00e1 \u00fatil entender os conceitos b\u00e1sicos de programa\u00e7\u00e3o e a sintaxe de script de shell.<\/li>\n<\/ol>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se voc\u00ea n\u00e3o conhece a API da Kinsta, ficar\u00e1 surpreso com sua versatilidade. Ao longo dos anos, publicamos guias que mostram alguns casos de uso excelentes, como a <a href=\"https:\/\/kinsta.com\/pt\/blog\/criar-slackbot-gerenciamento-sites\/\">cria\u00e7\u00e3o de um Slackbot<\/a> ou a cria\u00e7\u00e3o de uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/atualizacao-em-massa-de-plugins-wordpress\/\">interface personalizada para automatizar tarefas<\/a>, como atualizar plugins em v\u00e1rios sites. Embora a API esteja atualmente na vers\u00e3o beta p\u00fablica, ela j\u00e1 oferece uma ampla variedade de endpoints. N\u00e3o deixe de explorar a <a href=\"https:\/\/kinsta.com\/pt\/docs\/kinsta-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o<\/a> para ver o que \u00e9 poss\u00edvel fazer.<\/p>\n<\/aside>\n\n<h2>Escrevendo seu primeiro script<\/h2>\n<p>Criar seu primeiro script de shell para interagir com a API da Kinsta \u00e9 mais simples do que voc\u00ea imagina. Vamos come\u00e7ar com um script simples que lista todos os sites WordPress gerenciados em sua conta Kinsta.<\/p>\n<h3>Etapa 1: Configure seu ambiente<\/h3>\n<p>Comece criando uma pasta para seu projeto e um novo arquivo de script. A extens\u00e3o <code>.sh<\/code> \u00e9 usada para scripts de shell. Por exemplo, voc\u00ea pode criar uma pasta, navegar at\u00e9 ela e criar e abrir um arquivo de script no VS Code usando estes comandos:<\/p>\n<pre><code class=\"language-bash\">mkdir my-first-shell-scripts\ncd my-first-shell-scripts\ntouch script.sh\ncode script.sh<\/code><\/pre>\n<h3>Etapa 2: Defina vari\u00e1veis de ambiente<\/h3>\n<p>Para manter sua chave de API segura, armazene em um arquivo <code>.env<\/code> em vez de codific\u00e1-la no script. Isso permite que voc\u00ea adicione o arquivo <code>.env<\/code> ao <code>.gitignore<\/code>, evitando que ele seja enviado para o controle de vers\u00e3o.<\/p>\n<p>Em seu arquivo <code>.env<\/code>, adicione:<\/p>\n<pre><code class=\"language-bash\">API_KEY=your_kinsta_api_key<\/code><\/pre>\n<p>Em seguida, importe a chave de API do arquivo <code>.env<\/code> para o seu script adicionando o seguinte \u00e0 parte superior do script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsource .env<\/code><\/pre>\n<p>O shebang <code>#!\/bin\/bash<\/code> garante que o script seja executado usando o Bash, enquanto <code>source .env<\/code> importa as vari\u00e1veis de ambiente.<\/p>\n<h3>Etapa 3: Escreva a solicita\u00e7\u00e3o de API<\/h3>\n<p>Primeiro, armazene o <strong>ID da sua<\/strong> <strong>empresa<\/strong> (dispon\u00edvel no MyKinsta em <strong data-start=\"777\" data-end=\"828\">Configura\u00e7\u00f5es da Empresa &gt; Detalhes de Cobran\u00e7a<\/strong>) em uma vari\u00e1vel:<\/p>\n<pre><code class=\"language-bash\">COMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Em seguida, adicione o comando curl para fazer uma solicita\u00e7\u00e3o GET ao\u00a0endpoint <code data-start=\"979\" data-end=\"987\">\/sites<\/code>, passando o ID da empresa como par\u00e2metro de consulta. Use <a href=\"https:\/\/www.baeldung.com\/linux\/jq-command-json\" target=\"_blank\" rel=\"noopener noreferrer\">jq<\/a> para formatar a sa\u00edda e torn\u00e1-la mais leg\u00edvel:<\/p>\n<pre><code class=\"language-bash\">curl -s -X GET \n  \"https:\/\/api.kinsta.com\/v2\/sites?company=$COMPANY_ID\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\" | jq<\/code><\/pre>\n<p>Essa solicita\u00e7\u00e3o recupera detalhes sobre todos os sites associados \u00e0 sua empresa, incluindo seus IDs, nomes e status.<\/p>\n<h3>Etapa 4: Torne o script execut\u00e1vel<\/h3>\n<p>Salve o script e torne-o execut\u00e1vel, executando:<\/p>\n<pre><code class=\"language-bash\">chmod +x script.sh<\/code><\/pre>\n<h3>Etapa 5: Execute o script<\/h3>\n<p>Agora, execute o script para ver a lista formatada dos seus sites:<\/p>\n<pre><code class=\"language-bash\">.\/list_sites.sh<\/code><\/pre>\n<p>Ao executar o script, voc\u00ea obter\u00e1 uma resposta semelhante a esta:<\/p>\n<pre><code class=\"language-bash\">{\n  \"company\": {\n    \"sites\": [\n      {\n        \"id\": \"a8f39e7e-d9cf-4bb4-9006-ddeda7d8b3af\",\n        \"name\": \"bitbuckettest\",\n        \"display_name\": \"bitbucket-test\",\n        \"status\": \"live\",\n        \"site_labels\": []\n      },\n      {\n        \"id\": \"277b92f8-4014-45f7-a4d6-caba8f9f153f\",\n        \"name\": \"duketest\",\n        \"display_name\": \"zivas Signature\",\n        \"status\": \"live\",\n        \"site_labels\": []\n      }\n    ]\n  }\n}<\/code><\/pre>\n<p>Isso funciona, mas podemos melhorar o script tornando a formata\u00e7\u00e3o mais leg\u00edvel.<\/p>\n<h3>Etapa 6: Reestruturar o script usando uma fun\u00e7\u00e3o<\/h3>\n<p>Substitua a solicita\u00e7\u00e3o <code>curl<\/code> por uma fun\u00e7\u00e3o reutiliz\u00e1vel para lidar com a busca e a formata\u00e7\u00e3o da lista de sites:<\/p>\n<pre><code class=\"language-bash\">list_sites() {\n  echo \"Fetching all sites for company ID: $COMPANY_ID...\"\n  \n  RESPONSE=$(curl -s -X GET \"https:\/\/api.kinsta.com\/v2\/sites?company=$COMPANY_ID\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  # Check for errors\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API.\"\n    exit 1\n  fi\n\n  echo \"Company Sites:\"\n  echo \"--------------\"\n  echo \"$RESPONSE\" | jq -r '.company.sites[] | \"(.display_name) ((.name)) - Status: (.status)\"'\n}\n\n# Run the function\nlist_sites<\/code><\/pre>\n<p>Quando voc\u00ea executar o script novamente, obter\u00e1 um resultado bem formatado:<\/p>\n<pre><code class=\"language-bash\">Fetching all sites for company ID: b383b4c-****-****-a47f-83999c5d2...\nCompany Sites:\n--------------\nbitbucket-test (bitbuckettest) - Status: live\nzivas Signature (duketest) - Status: live<\/code><\/pre>\n<p>Com esse script, voc\u00ea deu o primeiro passo para usar scripts de shell e a API da Kinsta para automatizar o gerenciamento de sites WordPress. Nas pr\u00f3ximas se\u00e7\u00f5es, exploraremos a cria\u00e7\u00e3o de scripts mais avan\u00e7ados para interagir com a API de maneiras ainda mais poderosas.<\/p>\n<h2>Caso de uso avan\u00e7ado 1: Criando backups<\/h2>\n<p>Criar backups \u00e9 uma parte essencial do gerenciamento de sites. Eles permitem restaurar seu site em caso de problemas inesperados. Com a API da Kinsta e scripts Shell, esse processo pode ser automatizado, economizando tempo e esfor\u00e7o.<\/p>\n<p>Nesta se\u00e7\u00e3o, criaremos backups e abordaremos o limite da Kinsta de <strong>cinco backups manuais por ambiente<\/strong>. Para isso, implementaremos um processo que:<\/p>\n<ul>\n<li>Verifica o n\u00famero atual de backups manuais.<\/li>\n<li>Identifica e exclui o backup mais antigo (com confirma\u00e7\u00e3o do usu\u00e1rio) caso o limite seja atingido.<\/li>\n<li>Cria um novo backup automaticamente.<\/li>\n<\/ul>\n<p>Vamos aos detalhes.<\/p>\n<h3>O fluxo de trabalho de backup<\/h3>\n<p>Para criar backups usando a API da Kinsta, voc\u00ea usar\u00e1 o <a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">seguinte endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">POST \/sites\/environments\/{env_id}\/manual-backups<\/code><\/pre>\n<p>Isso requer:<\/p>\n<ol start=\"1\">\n<li><strong>ID do ambiente<\/strong>: Identifica o ambiente (como teste ou produ\u00e7\u00e3o) em que o backup ser\u00e1 criado.<\/li>\n<li><strong>Etiqueta de backup<\/strong>: Uma etiqueta para identificar o backup (opcional).<\/li>\n<\/ol>\n<p>Obter manualmente o ID do Ambiente e rodar um comando como <code data-start=\"1147\" data-end=\"1172\">backup &lt;environment ID&gt;<\/code> pode ser trabalhoso. Em vez disso, construiremos um script interativo, onde basta informar o <strong>nome do site<\/strong>\u00a0e o script far\u00e1 o seguinte:<\/p>\n<ol start=\"1\">\n<li>Busca a lista de ambientes do site.<\/li>\n<li>Solicita que o usu\u00e1rio escolha o ambiente para backup.<\/li>\n<li>Executa a cria\u00e7\u00e3o do backup automaticamente.<\/li>\n<\/ol>\n<h3>Criando fun\u00e7\u00f5es reutiliz\u00e1veis para um c\u00f3digo mais organizado<\/h3>\n<p>Para manter nosso script modular e reutiliz\u00e1vel, definiremos fun\u00e7\u00f5es para tarefas espec\u00edficas. Vamos examinar a configura\u00e7\u00e3o passo a passo.<\/p>\n<h4>1. Configure as vari\u00e1veis b\u00e1sicas<\/h4>\n<p>Voc\u00ea pode eliminar o primeiro script que criou ou criar um novo arquivo de script para isso. Comece declarando a URL b\u00e1sica da API da Kinsta e o ID da sua empresa no script:<\/p>\n<pre><code class=\"language-bash\">BASE_URL=\"https:\/\/api.kinsta.com\/v2\"\nCOMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Essas vari\u00e1veis permitem construir os endpoints da API dinamicamente dentro do script.<\/p>\n<h4>2. Buscar todos os sites<\/h4>\n<p>Defina uma fun\u00e7\u00e3o para buscar a lista de todos os sites da empresa. Isso permite que voc\u00ea recupere detalhes sobre cada site posteriormente.<\/p>\n<pre><code class=\"language-bash\">get_sites_list() {\n  API_URL=\"$BASE_URL\/sites?company=$COMPANY_ID\"\n\n  echo \"Fetching all sites for company ID: $COMPANY_ID...\"\n  \n  RESPONSE=$(curl -s -X GET \"$API_URL\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  # Check for errors\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API.\"\n    exit 1\n  fi\n\n  echo \"$RESPONSE\"\n}<\/code><\/pre>\n<p>Voc\u00ea notar\u00e1 que essa fun\u00e7\u00e3o retorna uma resposta n\u00e3o formatada da API. Para voc\u00ea obter uma resposta formatada. Voc\u00ea pode adicionar outra fun\u00e7\u00e3o para lidar com isso (embora essa n\u00e3o seja a nossa preocupa\u00e7\u00e3o nesta se\u00e7\u00e3o):<\/p>\n<pre><code class=\"language-bash\">list_sites() {\n  RESPONSE=$(get_sites_list)\n\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API while fetching sites.\"\n    exit 1\n  fi\n\n  echo \"Company Sites:\"\n  echo \"--------------\"\n  # Clean the RESPONSE before passing it to jq\n  CLEAN_RESPONSE=$(echo \"$RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/') # Removes extra characters before the JSON starts\n\n  echo \"$CLEAN_RESPONSE\" | jq -r '.company.sites[] | \"(.display_name) ((.name)) - Status: (.status)\"'\n}<\/code><\/pre>\n<p>Ao chamar a fun\u00e7\u00e3o <code>list_sites<\/code>, voc\u00ea exibe seus sites conforme mostrado anteriormente. O objetivo principal, no entanto, \u00e9 acessar cada site e seu ID, permitindo que voc\u00ea recupere informa\u00e7\u00f5es detalhadas sobre cada site.<\/p>\n<h4>3. Obter detalhes do site<\/h4>\n<p>Para obter informa\u00e7\u00f5es detalhadas de um site espec\u00edfico, criamos a seguinte fun\u00e7\u00e3o. Ela busca o ID do site com base no nome informado pelo usu\u00e1rio e recupera os detalhes do site, incluindo seus ambientes (necess\u00e1rios para acionar backups).<\/p>\n<pre><code class=\"language-bash\">get_site_details_by_name() {\n  SITE_NAME=$1\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Error: No site name provided. Usage: $0 details-name \"\n    return 1\n  fi\n\n  RESPONSE=$(get_sites_list)\n\n  echo \"Searching for site with name: $SITE_NAME...\"\n\n  # Clean the RESPONSE before parsing\n  CLEAN_RESPONSE=$(echo \"$RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\n\n  # Extract the site ID for the given site name\n  SITE_ID=$(echo \"$CLEAN_RESPONSE\" | jq -r --arg SITE_NAME \"$SITE_NAME\" '.company.sites[] | select(.name == $SITE_NAME) | .id')\n\n  if [ -z \"$SITE_ID\" ]; then\n    echo \"Error: Site with name \"$SITE_NAME\" not found.\"\n    return 1\n  fi\n\n  echo \"Found site ID: $SITE_ID for site name: $SITE_NAME\"\n\n  # Fetch site details using the site ID\n  API_URL=\"$BASE_URL\/sites\/$SITE_ID\"\n\n  SITE_RESPONSE=$(curl -s -X GET \"$API_URL\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  echo \"$SITE_RESPONSE\"\n}<\/code><\/pre>\n<p>A fun\u00e7\u00e3o acima filtra o site usando o nome do site e, em seguida, recupera detalhes adicionais sobre o site usando o endpoint <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Sites#operation\/getSiteById\" target=\"_blank\" rel=\"noopener noreferrer\">\/sites\/&lt;site-id&gt;<\/a><\/code>. Esses detalhes incluem os ambientes do site, que \u00e9 o que precisamos para acionar os backups.<\/p>\n<h3>Cria\u00e7\u00e3o de backups<\/h3>\n<p>Agora que voc\u00ea configurou fun\u00e7\u00f5es reutiliz\u00e1veis para obter detalhes do site e listar ambientes, pode se concentrar na automatiza\u00e7\u00e3o do processo de cria\u00e7\u00e3o de backups. O objetivo \u00e9 executar um comando simples com apenas o nome do site e, em seguida, escolher interativamente o ambiente para fazer o backup.<\/p>\n<p>Comece criando uma fun\u00e7\u00e3o (vamos cham\u00e1-la de <code>trigger_manual_backup<\/code>). Dentro da fun\u00e7\u00e3o, defina duas vari\u00e1veis: a primeira para aceitar o nome do site como entrada e a segunda para definir uma tag padr\u00e3o (<code>default-backup<\/code>) para o backup. Essa tag padr\u00e3o ser\u00e1 aplicada, a menos que voc\u00ea opte por especificar uma tag personalizada posteriormente.<\/p>\n<pre><code class=\"language-bash\">trigger_manual_backup() {\n  SITE_NAME=$1\n  DEFAULT_TAG=\"default-backup\"\n\n  # Ensure a site name is provided\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Error: Site name is required.\"\n    echo \"Usage: $0 trigger-backup \"\n    return 1\n  fi\n\n  # Add the code here\n\n}<\/code><\/pre>\n<p>Essa <code>SITE_NAME<\/code> \u00e9 o identificador do site que voc\u00ea deseja gerenciar. Voc\u00ea tamb\u00e9m configura uma condi\u00e7\u00e3o para que o script se encerre com uma mensagem de erro caso o identificador n\u00e3o seja fornecido. Isso garante que o script n\u00e3o prossiga sem a entrada necess\u00e1ria, prevenindo poss\u00edveis erros da API.<\/p>\n<p>Em seguida, use a fun\u00e7\u00e3o reutiliz\u00e1vel <code>get_site_details_by_name<\/code> para obter informa\u00e7\u00f5es detalhadas sobre o site, incluindo seus ambientes. A resposta \u00e9 ent\u00e3o limpa para remover qualquer formata\u00e7\u00e3o inesperada que possa surgir durante o processamento.<\/p>\n<pre><code class=\"language-bash\">SITE_RESPONSE=$(get_site_details_by_name \"$SITE_NAME\")\n\nif [ $? -ne 0 ]; then\n  echo \"Error: Failed to fetch site details for site \"$SITE_NAME\".\"\n  return 1\nfi\n\nCLEAN_RESPONSE=$(echo \"$SITE_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p data-start=\"812\" data-end=\"1008\">Depois de obter os detalhes do site, o script abaixo extrai todos os ambientes dispon\u00edveis e os exibe em um formato leg\u00edvel. Isso ajuda a visualizar quais ambientes est\u00e3o vinculados ao site.<\/p>\n<p data-start=\"1010\" data-end=\"1216\">O script ent\u00e3o solicita que voc\u00ea selecione um ambiente pelo nome. Esse passo interativo torna o processo mais amig\u00e1vel, eliminando a necessidade de lembrar ou inserir manualmente os IDs dos ambientes.<\/p>\n<pre><code class=\"language-bash\">ENVIRONMENTS=$(echo \"$CLEAN_RESPONSE\" | jq -r '.site.environments[] | \"(.name): (.id)\"')\n\necho \"Available Environments for \"$SITE_NAME\":\"\necho \"$ENVIRONMENTS\"\n\nread -p \"Enter the environment name to back up (e.g., staging, live): \" ENV_NAME<\/code><\/pre>\n<p>O nome do ambiente selecionado \u00e9 usado para procurar o <strong>ID do ambiente<\/strong> correspondente nos detalhes do site. Esse ID \u00e9 necess\u00e1rio para que as solicita\u00e7\u00f5es de API criem um backup.<\/p>\n<pre><code class=\"language-bash\">ENV_ID=$(echo \"$CLEAN_RESPONSE\" | jq -r --arg ENV_NAME \"$ENV_NAME\" '.site.environments[] | select(.name == $ENV_NAME) | .id')\n\nif [ -z \"$ENV_ID\" ]; then\n  echo \"Error: Environment \"$ENV_NAME\" not found for site \"$SITE_NAME\".\"\n  return 1\nfi\n\necho \"Found environment ID: $ENV_ID for environment name: $ENV_NAME\"<\/code><\/pre>\n<p>No c\u00f3digo acima, \u00e9 criada uma condi\u00e7\u00e3o para que o script seja encerrado com uma mensagem de erro se o nome do ambiente fornecido n\u00e3o corresponder.<\/p>\n<p>Agora que voc\u00ea tem o ID do ambiente, pode continuar a verificar o n\u00famero atual de backups manuais para o ambiente selecionado. Como o limite da Kinsta \u00e9 de cinco backups manuais por ambiente, essa etapa \u00e9 crucial para evitar erros.<\/p>\n<p>Vamos come\u00e7ar buscando a lista de backups usando o endpoint da API <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/getBackups\" target=\"_blank\" rel=\"noopener noreferrer\">\/backups<\/a><\/code>.<\/p>\n<pre><code class=\"language-bash\">API_URL=\"$BASE_URL\/sites\/environments\/$ENV_ID\/backups\"\nBACKUPS_RESPONSE=$(curl -s -X GET \"$API_URL\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\")\n\nCLEAN_RESPONSE=$(echo \"$BACKUPS_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\nMANUAL_BACKUPS=$(echo \"$CLEAN_RESPONSE\" | jq '[.environment.backups[] | select(.type == \"manual\")]')\nBACKUP_COUNT=$(echo \"$MANUAL_BACKUPS\" | jq 'length')<\/code><\/pre>\n<p>O script acima filtra os backups manuais e os conta. Se o n\u00famero atingir o limite, ser\u00e1 necess\u00e1rio gerenciar os backups existentes:<\/p>\n<pre><code class=\"language-bash\">  if [ \"$BACKUP_COUNT\" -ge 5 ]; then\n    echo \"Manual backup limit reached (5 backups).\"\n    \n    # Find the oldest backup\n    OLDEST_BACKUP=$(echo \"$MANUAL_BACKUPS\" | jq -r 'sort_by(.created_at) | .[0]')\n    OLDEST_BACKUP_NAME=$(echo \"$OLDEST_BACKUP\" | jq -r '.note')\n    OLDEST_BACKUP_ID=$(echo \"$OLDEST_BACKUP\" | jq -r '.id')\n\n    echo \"The oldest manual backup is \"$OLDEST_BACKUP_NAME\".\"\n    read -p \"Do you want to delete this backup to create a new one? (yes\/no): \" CONFIRM\n\n    if [ \"$CONFIRM\" != \"yes\" ]; then\n      echo \"Aborting backup creation.\"\n      return 1\n    fi\n\n    # Delete the oldest backup\n    DELETE_URL=\"$BASE_URL\/sites\/environments\/backups\/$OLDEST_BACKUP_ID\"\n    DELETE_RESPONSE=$(curl -s -X DELETE \"$DELETE_URL\" \n      -H \"Authorization: Bearer $API_KEY\" \n      -H \"Content-Type: application\/json\")\n\n    echo \"Delete Response:\"\n    echo \"$DELETE_RESPONSE\" | jq -r '[\n      \"Operation ID: (.operation_id)\",\n      \"Message: (.message)\",\n      \"Status: (.status)\"\n    ] | join(\"n\")'\n  fi<\/code><\/pre>\n<p>A condi\u00e7\u00e3o acima identifica o backup mais antigo, classificando a lista com base no registro de data e hora <code>created_at<\/code>. Em seguida, ele solicita que voc\u00ea confirme se deseja exclu\u00ed-lo.<\/p>\n<p>Se voc\u00ea concordar, o script excluir\u00e1 o backup mais antigo usando seu ID, liberando espa\u00e7o para o novo. Isso garante que os backups sempre possam ser criados sem que voc\u00ea precise gerenciar manualmente os limites.<\/p>\n<p>Agora que h\u00e1 espa\u00e7o, vamos prosseguir com o c\u00f3digo para acionar o backup para o ambiente. Sinta-se \u00e0 vontade para ignorar esse c\u00f3digo, mas, para ter uma experi\u00eancia melhor, ele solicita que voc\u00ea especifique uma tag personalizada, tendo como padr\u00e3o &#8220;default-backup&#8221; se nenhuma for fornecida.<\/p>\n<pre><code class=\"language-bash\">read -p \"Enter a backup tag (or press Enter to use \"$DEFAULT_TAG\"): \" BACKUP_TAG\n\nif [ -z \"$BACKUP_TAG\" ]; then\n  BACKUP_TAG=\"$DEFAULT_TAG\"\nfi\n\necho \"Using backup tag: $BACKUP_TAG\"<\/code><\/pre>\n<p>Por fim, o script abaixo \u00e9 onde a a\u00e7\u00e3o de backup acontece. Ele envia uma solicita\u00e7\u00e3o <code>POST<\/code> para o endpoint <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">\/manual-backups<\/a><\/code> com o ID do ambiente selecionado e a tag de backup. Se a solicita\u00e7\u00e3o for bem-sucedida, a API retornar\u00e1 uma resposta confirmando a cria\u00e7\u00e3o do backup.<\/p>\n<pre><code class=\"language-bash\">API_URL=\"$BASE_URL\/sites\/environments\/$ENV_ID\/manual-backups\"\nRESPONSE=$(curl -s -X POST \"$API_URL\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\" \n  -d \"{\"tag\": \"$BACKUP_TAG\"}\")\n\nif [ -z \"$RESPONSE\" ]; then\n  echo \"Error: No response from the API while triggering the manual backup.\"\n  return 1\nfi\n\necho \"Backup Trigger Response:\"\necho \"$RESPONSE\" | jq -r '[\n  \"Operation ID: (.operation_id)\",\n  \"Message: (.message)\",\n  \"Status: (.status)\"\n] | join(\"n\")'<\/code><\/pre>\n<p>Isso \u00e9 tudo. A resposta obtida da solicita\u00e7\u00e3o acima \u00e9 formatada para exibir o ID da opera\u00e7\u00e3o, a mensagem e o status, garantindo clareza na sa\u00edda. Se voc\u00ea chamar a fun\u00e7\u00e3o e executar o script, ver\u00e1 uma sa\u00edda semelhante a esta:<\/p>\n<pre><code class=\"language-bash\">Available Environments for \"example-site\":\nstaging: 12345\nlive: 67890\nEnter the environment name to back up (e.g., staging, live): live\nFound environment ID: 67890 for environment name: live\nManual backup limit reached (5 backups).\nThe oldest manual backup is \"staging-backup-2023-12-31\".\nDo you want to delete this backup to create a new one? (yes\/no): yes\nOldest backup deleted.\nEnter a backup tag (or press Enter to use \"default-backup\"): weekly-live-backup\nUsing backup tag: weekly-live-backup\nTriggering manual backup for environment ID: 67890 with tag: weekly-live-backup...\nBackup Trigger Response:\nOperation ID: backups:add-manual-abc123\nMessage: Adding a manual backup to environment in progress.\nStatus: 202<\/code><\/pre>\n<h3>Criando comandos para o seu script<\/h3>\n<p>Os comandos simplificam o uso do script. Em vez de editar o c\u00f3digo manualmente ou comentar partes espec\u00edficas, os usu\u00e1rios podem execut\u00e1-lo com um comando espec\u00edfico, como:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh list-sites\n.\/script.sh backup <\/code><\/pre>\n<p>No final do seu script (fora de todas as fun\u00e7\u00f5es), inclua um bloco condicional que verifique os argumentos passados para o script:<\/p>\n<pre><code class=\"language-bash\">if [ \"$1\" == \"list-sites\" ]; then\n  list_sites\nelif [ \"$1\" == \"backup\" ]; then\n  SITE_NAME=\"$2\"\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Usage: $0 trigger-backup \"\n    exit 1\n  fi\n  trigger_manual_backup \"$SITE_NAME\"\nelse\n  echo \"Usage: $0 {list-sites|trigger-backup }\"\n  exit 1\nfi<\/code><\/pre>\n<p>A vari\u00e1vel <code>$1<\/code> representa o primeiro argumento passado para o script (por exemplo, em <code>.\/script.sh list-sites<\/code>, <code>$1<\/code> \u00e9 <code>list-sites<\/code>). O script usa verifica\u00e7\u00f5es condicionais para fazer a correspond\u00eancia entre <code>$1<\/code> e comandos espec\u00edficos, como <code>list-sites<\/code> ou <code>backup<\/code>. Se o comando for <code>backup<\/code>, ele tamb\u00e9m espera um segundo argumento (<code>$2<\/code>), que \u00e9 o nome do site. Se nenhum comando v\u00e1lido for fornecido, o script exibir\u00e1 por padr\u00e3o as instru\u00e7\u00f5es de uso.<\/p>\n<p>Agora voc\u00ea pode acionar um backup manual para um site espec\u00edfico executando o comando:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh backup<\/code><\/pre>\n<h2>Caso de uso avan\u00e7ado 2: Atualizando plugins em m\u00faltiplos sites<\/h2>\n<p>Gerenciar plugins do WordPress em m\u00faltiplos sites pode ser uma tarefa demorada, especialmente quando h\u00e1 atualiza\u00e7\u00f5es dispon\u00edveis. A Kinsta j\u00e1 oferece um recurso de atualiza\u00e7\u00e3o em massa no painel MyKinsta.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/manage-plugins-mykinsta.png\" alt><\/p>\n<p>No entanto, se voc\u00ea prefere n\u00e3o utilizar interfaces gr\u00e1ficas, a API da Kinsta permite criar um script Shell para automatizar a identifica\u00e7\u00e3o de plugins desatualizados e atualiz\u00e1-los em m\u00faltiplos sites ou ambientes espec\u00edficos.<\/p>\n<h3>Detalhando o fluxo de trabalho<\/h3>\n<p>1. <strong>Identificar sites com plugins desatualizados:<\/strong> O script percorre todos os sites e ambientes, procurando o plugin especificado com uma atualiza\u00e7\u00e3o dispon\u00edvel. O <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/getPlugins\" target=\"_blank\" rel=\"noopener noreferrer\">seguinte endpoint<\/a> \u00e9 usado para buscar a lista de plugins para um ambiente de site espec\u00edfico:<\/p>\n<pre><code class=\"language-bash\">GET \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>A resposta da API \u00e9 filtrada para encontrar plugins com <code>\"update\": \"available\"<\/code>.<\/p>\n<p>2. <strong>Solicitar op\u00e7\u00f5es de atualiza\u00e7\u00e3o ao usu\u00e1rio:<\/strong> Exibe os sites e ambientes com o plugin desatualizado, permitindo que o usu\u00e1rio selecione inst\u00e2ncias espec\u00edficas ou atualize todas elas.<\/p>\n<p>3. <strong>Acionar atualiza\u00e7\u00f5es do plugin:<\/strong> Para atualizar o plugin em um ambiente espec\u00edfico, o script usa <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">esse endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">PUT \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>O nome do plugin e a vers\u00e3o mais recente s\u00e3o enviados no corpo da requisi\u00e7\u00e3o.<\/p>\n<h3>O script<\/h3>\n<p>Como o script \u00e9 longo, a fun\u00e7\u00e3o completa est\u00e1 <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">hospedada no GitHub<\/a> para facilitar o acesso. Aqui, explicaremos a l\u00f3gica principal usada para identificar plugins desatualizados em v\u00e1rios sites e ambientes.<\/p>\n<p>O script come\u00e7a aceitando o nome do plugin como argumento. Esse nome define o plugin que ser\u00e1 atualizado.<\/p>\n<pre><code class=\"language-bash\">PLUGIN_NAME=$1\n\nif [ -z \"$PLUGIN_NAME\" ]; then\n  echo \"Error: Plugin name is required.\"\n  echo \"Usage: $0 update-plugin \"\n  return 1\nfi<\/code><\/pre>\n<p>Em seguida, o script usa a fun\u00e7\u00e3o reutiliz\u00e1vel <code>get_sites_list<\/code> (explicada anteriormente) para buscar todos os sites da empresa:<\/p>\n<pre><code class=\"language-bash\">echo \"Fetching all sites in the company...\"\n\n# Fetch all sites in the company\nSITES_RESPONSE=$(get_sites_list)\nif [ $? -ne 0 ]; then\n  echo \"Error: Failed to fetch sites.\"\n  return 1\nfi\n\n# Clean the response\nCLEAN_SITES_RESPONSE=$(echo \"$SITES_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>A seguir, o cora\u00e7\u00e3o do script: um loop que percorre a lista de sites para verificar se h\u00e1 plugins desatualizados. O JSON limpo contendo todos os sites <code>CLEAN_SITES_RESPONSE<\/code>\u00a0\u00e9 passado para um loop <code data-start=\"3821\" data-end=\"3828\">while<\/code>, que processa cada site um por um.<\/p>\n<p>Primeiro, o script extrai os dados importantes do site, como ID, nome e nome de exibi\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">while IFS= read -r SITE; do\n  SITE_ID=$(echo \"$SITE\" | jq -r '.id')\n  SITE_NAME=$(echo \"$SITE\" | jq -r '.name')\n  SITE_DISPLAY_NAME=$(echo \"$SITE\" | jq -r '.display_name')\n\n  echo \"Checking environments for site \"$SITE_DISPLAY_NAME\"...\"<\/code><\/pre>\n<p>O nome do site \u00e9 ent\u00e3o usado junto com a fun\u00e7\u00e3o <code>get_site_details_by_name<\/code> definida anteriormente para buscar informa\u00e7\u00f5es detalhadas sobre o site, incluindo todos os seus ambientes.<\/p>\n<pre><code class=\"language-bash\">SITE_DETAILS=$(get_site_details_by_name \"$SITE_NAME\")\nCLEAN_SITE_DETAILS=$(echo \"$SITE_DETAILS\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\n\nENVIRONMENTS=$(echo \"$CLEAN_SITE_DETAILS\" | jq -r '.site.environments[] | \"(.id):(.name):(.display_name)\"')<\/code><\/pre>\n<p>Os ambientes do site s\u00e3o ent\u00e3o percorridos para extrair ID, nome e nome de exibi\u00e7\u00e3o de cada um:<\/p>\n<pre><code class=\"language-bash\">while IFS= read -r ENV; do\n  ENV_ID=$(echo \"$ENV\" | cut -d: -f1)\n  ENV_NAME=$(echo \"$ENV\" | cut -d: -f2)\n  ENV_DISPLAY_NAME=$(echo \"$ENV\" | cut -d: -f3)\n\n  echo \"Checking plugins for environment \"$ENV_DISPLAY_NAME\"...\"<\/code><\/pre>\n<p>Para cada ambiente, o script agora obt\u00e9m sua lista de plugins usando a API da Kinsta.<\/p>\n<pre><code class=\"language-bash\">PLUGINS_RESPONSE=$(curl -s -X GET \"$BASE_URL\/sites\/environments\/$ENV_ID\/plugins\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\")\n\nCLEAN_PLUGINS_RESPONSE=$(echo \"$PLUGINS_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>Em seguida, o script verifica se o plugin especificado existe no ambiente e se h\u00e1 uma atualiza\u00e7\u00e3o dispon\u00edvel:<\/p>\n<pre><code class=\"language-bash\">OUTDATED_PLUGIN=$(echo \"$CLEAN_PLUGINS_RESPONSE\" | jq -r --arg PLUGIN_NAME \"$PLUGIN_NAME\" '.environment.container_info.wp_plugins.data[] | select(.name == $PLUGIN_NAME and .update == \"available\")')<\/code><\/pre>\n<p>Se um plugin desatualizado for encontrado, o script exibe suas informa\u00e7\u00f5es e o adiciona ao array <code data-start=\"5783\" data-end=\"5811\">SITES_WITH_OUTDATED_PLUGIN<\/code>:<\/p>\n<pre><code class=\"language-bash\">if [ ! -z \"$OUTDATED_PLUGIN\" ]; then\n  CURRENT_VERSION=$(echo \"$OUTDATED_PLUGIN\" | jq -r '.version')\n  UPDATE_VERSION=$(echo \"$OUTDATED_PLUGIN\" | jq -r '.update_version')\n\n  echo \"Outdated plugin \"$PLUGIN_NAME\" found in \"$SITE_DISPLAY_NAME\" (Environment: $ENV_DISPLAY_NAME)\"\n  echo \"  Current Version: $CURRENT_VERSION\"\n  echo \"  Update Version: $UPDATE_VERSION\"\n\n  SITES_WITH_OUTDATED_PLUGIN+=(\"$SITE_DISPLAY_NAME:$ENV_DISPLAY_NAME:$ENV_ID:$UPDATE_VERSION\")\nfi<\/code><\/pre>\n<p>Esta \u00e9 a apar\u00eancia dos detalhes registrados de plugins desatualizados:<\/p>\n<pre><code class=\"language-bash\">Outdated plugin \"example-plugin\" found in \"Site ABC\" (Environment: Production)\n  Current Version: 1.0.0\n  Update Version: 1.2.0\nOutdated plugin \"example-plugin\" found in \"Site XYZ\" (Environment: Staging)\n  Current Version: 1.3.0\n  Update Version: 1.4.0<\/code><\/pre>\n<p>A partir daqui, realizamos atualiza\u00e7\u00f5es de plugins para cada plugin usando <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">seu endpoint<\/a>. O script completo est\u00e1 neste <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">reposit\u00f3rio do GitHub<\/a>.<\/p>\n<h2>Resumo<\/h2>\n<p data-start=\"17\" data-end=\"115\">Este artigo guiou voc\u00ea na cria\u00e7\u00e3o de um script Shell para interagir com a API da Kinsta.<\/p>\n<p data-start=\"117\" data-end=\"459\">Reserve um tempo para explorar mais a fundo a <a href=\"https:\/\/api-docs.kinsta.com\/\">API da Kinsta<\/a> \u2014 voc\u00ea descobrir\u00e1 recursos adicionais que podem ser automatizados para gerenciar tarefas personalizadas conforme suas necessidades espec\u00edficas. Voc\u00ea tamb\u00e9m pode considerar integrar a API da Kinsta com outras APIs para aprimorar a tomada de decis\u00f5es e a efici\u00eancia.<\/p>\n<p data-start=\"461\" data-end=\"655\" data-is-last-node data-is-only-node>Por fim, verifique regularmente o <a href=\"https:\/\/kinsta.com\/pt\/mykinsta\/\">painel MyKinsta<\/a> para acompanhar novos recursos desenvolvidos para facilitar ainda mais o gerenciamento de sites por meio de sua interface intuitiva.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea gerencia muitos sites WordPress, provavelmente est\u00e1 sempre em busca de maneiras de simplificar e acelerar seus fluxos de trabalho. Agora, imagine o seguinte: com &#8230;<\/p>\n","protected":false},"author":287,"featured_media":71297,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[951],"class_list":["post-71296","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta<\/title>\n<meta name=\"description\" content=\"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta\" \/>\n<meta property=\"og:description\" content=\"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-04T14:29:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-05T13:26:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Joel Olawanle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png\" \/>\n<meta name=\"twitter:creator\" content=\"@olawanle_joel\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta\",\"datePublished\":\"2025-03-04T14:29:40+00:00\",\"dateModified\":\"2025-03-05T13:26:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\"},\"wordCount\":2581,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"inLanguage\":\"pt-PT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\",\"name\":\"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"datePublished\":\"2025-03-04T14:29:40+00:00\",\"dateModified\":\"2025-03-05T13:26:58+00:00\",\"description\":\"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"caption\":\"Joel Olawanle\"},\"description\":\"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.\",\"sameAs\":[\"https:\/\/joelolawanle.com\/\",\"https:\/\/www.linkedin.com\/in\/olawanlejoel\/\",\"https:\/\/x.com\/olawanle_joel\",\"https:\/\/www.youtube.com\/@joelolawanle\"],\"gender\":\"male\",\"knowsAbout\":[\"JavaScript\",\"React\",\"Next.js\"],\"knowsLanguage\":[\"English\"],\"jobTitle\":\"Technical Editor\",\"worksFor\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta","description":"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/","og_locale":"pt_PT","og_type":"article","og_title":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta","og_description":"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.","og_url":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2025-03-04T14:29:40+00:00","article_modified_time":"2025-03-05T13:26:58+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","type":"image\/png"}],"author":"Joel Olawanle","twitter_card":"summary_large_image","twitter_description":"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png","twitter_creator":"@olawanle_joel","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Joel Olawanle","Tempo estimado de leitura":"20 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta","datePublished":"2025-03-04T14:29:40+00:00","dateModified":"2025-03-05T13:26:58+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/"},"wordCount":2581,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","inLanguage":"pt-PT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/","url":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/","name":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","datePublished":"2025-03-04T14:29:40+00:00","dateModified":"2025-03-05T13:26:58+00:00","description":"Gerencie seus sites WordPress de forma eficiente usando scripts Shell e a API da Kinsta para uma automa\u00e7\u00e3o simplificada e melhor desempenho.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/shell-scripts-api-da-kinsta\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/pt\/topicos\/api\/"},{"@type":"ListItem","position":3,"name":"Gerenciando Sites WordPress com Scripts Shell e a API da Kinsta"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","caption":"Joel Olawanle"},"description":"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.","sameAs":["https:\/\/joelolawanle.com\/","https:\/\/www.linkedin.com\/in\/olawanlejoel\/","https:\/\/x.com\/olawanle_joel","https:\/\/www.youtube.com\/@joelolawanle"],"gender":"male","knowsAbout":["JavaScript","React","Next.js"],"knowsLanguage":["English"],"jobTitle":"Technical Editor","worksFor":"Kinsta","url":"https:\/\/kinsta.com\/pt\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/71296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=71296"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/71296\/revisions"}],"predecessor-version":[{"id":71342,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/71296\/revisions\/71342"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/71296\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/71297"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=71296"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=71296"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=71296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}