{"id":80545,"date":"2025-02-27T12:57:52","date_gmt":"2025-02-27T11:57:52","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=80545&#038;preview=true&#038;preview_id=80545"},"modified":"2025-03-05T11:24:06","modified_gmt":"2025-03-05T10:24:06","slug":"shell-script-api-kinsta","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/","title":{"rendered":"Gestire i siti WordPress con gli shell script e l&#8217;API di Kinsta"},"content":{"rendered":"<p>Se gestite molti siti WordPress, probabilmente sarete sempre alla ricerca di modi per semplificare e velocizzare i vostri workflow.<\/p>\n<p>Ora, immaginate questo: con un solo comando nel <a href=\"https:\/\/kinsta.com\/it\/blog\/wp-cli\/\">terminale<\/a>, potete attivare i backup manuali per tutti i vostri siti, anche se ne gestite a decine. Questa \u00e8 la comodit\u00e0 di combinare lo shell scripting con l&#8217;<a href=\"https:\/\/kinsta.com\/it\/docs\/kinsta-api\/\">API di Kinsta<\/a>.<\/p>\n<p>Questa guida mostra come utilizzare gli shell script per impostare comandi personalizzati che rendono pi\u00f9 efficiente la gestione dei vostri siti.<\/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>Prerequisiti<\/h2>\n<p>Prima di iniziare, ecco cosa serve:<\/p>\n<ol start=\"1\">\n<li><strong>Un terminale<\/strong>. Tutti i sistemi operativi moderni sono dotati di un software di terminale, quindi \u00e8 possibile iniziare a creare script subito.<\/li>\n<li><strong>Un IDE o un editor di testo<\/strong>. Consigliamo di usare uno strumento che si conosce bene, come VS Code, Sublime Text o anche un editor leggero come Nano per modificare rapidamente il terminale.<\/li>\n<li><strong>Una chiave API Kinsta<\/strong>. \u00c8 essenziale per interagire con l&#8217;<a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">API di Kinsta<\/a>. Per generare una chiave API basta:\n<ul>\n<li>Accedere alla dashboard <a href=\"https:\/\/my.kinsta.com\/login\/?lang=it\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>Andare su <strong>Nome utente<\/strong> &gt; <strong>Impostazioni azienda<\/strong> &gt; <strong>Chiavi API<\/strong>.<\/li>\n<li>Cliccare su <strong>Crea chiave API<\/strong> e salvarla in modo sicuro.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>curl<\/code><\/strong><strong> e <\/strong><strong><code>jq<\/code><\/strong>. Essenziali per effettuare richieste API e gestire i dati JSON. Consigliamo di verificare che siano installati o di installarli.<\/li>\n<li><strong>Conoscenze di base di programmazione<\/strong>. Non \u00e8 necessario essere degli esperti, ma la comprensione delle basi della programmazione e della sintassi degli shell script sar\u00e0 molto utile.<\/li>\n<\/ol>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se non conoscete ancora l&#8217;API di Kinsta, rimarrete stupiti dalla sua versatilit\u00e0. Nel corso degli anni, abbiamo pubblicato delle guide che illustrano alcuni casi d&#8217;uso eccezionali, come la <a href=\"https:\/\/kinsta.com\/it\/blog\/creare-slackbot-gestire-sito\/\">costruzione di uno Slackbot<\/a> o la <a href=\"https:\/\/kinsta.com\/it\/blog\/aggiornamento-di-massa-dei-plugin-wordpress\/\">creazione di un&#8217;interfaccia utente personalizzata<\/a> per automatizzare attivit\u00e0 come l&#8217;aggiornamento dei plugin su pi\u00f9 siti. Sebbene l&#8217;API sia attualmente in fase di beta pubblica, offre gi\u00e0 un&#8217;ampia gamma di endpoint. Assicuratevi di leggere la <a href=\"https:\/\/kinsta.com\/it\/docs\/kinsta-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione<\/a> per scoprire cosa potrete fare con la nostra API.<\/p>\n<\/aside>\n\n<h2>Scrivere il primo script<\/h2>\n<p>Creare il primo shell script per interagire con l&#8217;API di Kinsta \u00e8 pi\u00f9 semplice di quanto possiate pensare. Cominciamo con un semplice script che elenca tutti i siti WordPress gestiti da un account Kinsta.<\/p>\n<h3>Passo 1: Configurare l&#8217;ambiente<\/h3>\n<p>Iniziamo creando una cartella per il nostro progetto e un nuovo file di script. L&#8217;estensione <code>.sh<\/code> \u00e8 utilizzata per gli shell script. Ad esempio, possiamo creare una cartella, navigare al suo interno e creare e aprire un file di script in VS Code utilizzando questi comandi:<\/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>Passo 2: Definire le variabili d&#8217;ambiente<\/h3>\n<p>Per proteggere la chiave API, memorizziamola in un file <code>.env<\/code> invece di inserirla nello script. Ci\u00f2 permette di aggiungere il file <code>.env<\/code> a <code>.gitignore<\/code>, evitando che venga inviato al controllo di versione.<\/p>\n<p>Nel file <code>.env<\/code>, aggiungiamo:<\/p>\n<pre><code class=\"language-bash\">API_KEY=your_kinsta_api_key<\/code><\/pre>\n<p>Successivamente, inseriamo la chiave API dal file <code>.env<\/code> nello script aggiungendo quanto segue all&#8217;inizio dello script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsource .env<\/code><\/pre>\n<p>Lo shebang <code>#!\/bin\/bash<\/code> assicura che lo script venga eseguito con Bash, mentre <code>source .env<\/code> importa le variabili d&#8217;ambiente.<\/p>\n<h3>Passo 3: Scrivere la richiesta API<\/h3>\n<p>Per prima cosa, memorizziamo l&#8217;<strong>ID azienda<\/strong> (che si trova in MyKinsta alla voce <strong>Impostazioni azienda<\/strong> &gt; <strong>Dettagli di fatturazione<\/strong>) in una variabile:<\/p>\n<pre><code class=\"language-bash\">COMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Quindi, aggiungiamo il comando curl per effettuare una richiesta GET all&#8217;endpoint <code>\/sites<\/code>, passando l&#8217;ID dell&#8217;azienda come parametro della query. Usiamo <a href=\"https:\/\/www.baeldung.com\/linux\/jq-command-json\" target=\"_blank\" rel=\"noopener noreferrer\">jq<\/a> per formattare l&#8217;output in modo da renderlo pi\u00f9 leggibile:<\/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>Questa richiesta recupera i dettagli di tutti i siti associati all&#8217;azienda, compresi i loro ID, nomi e stati.<\/p>\n<h3>Passo 4: Rendere lo script eseguibile<\/h3>\n<p>Salviamo lo script e rendiamolo eseguibile:<\/p>\n<pre><code class=\"language-bash\">chmod +x script.sh<\/code><\/pre>\n<h3>Passo 5: Eseguire lo script<\/h3>\n<p>Eseguiamo lo script per visualizzare un elenco formattato dei nostri siti:<\/p>\n<pre><code class=\"language-bash\">.\/list_sites.sh<\/code><\/pre>\n<p>Eseguendo lo script, otterremo una risposta simile a questa:<\/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>Anche se funziona, miglioriamolo impostando una funzione che recuperi e formatti i dettagli del sito per facilitarne la lettura.<\/p>\n<h3>Passo 6: Rifattorizzare con una funzione<\/h3>\n<p>Sostituiamo la richiesta di <code>curl<\/code> con una funzione riutilizzabile per gestire il recupero e la formattazione dell&#8217;elenco dei siti:<\/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 eseguiremo nuovamente lo script, otterremo un output ben formattato:<\/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>Con questo script, avremo fatto il primo passo verso l&#8217;utilizzo degli shell script e dell&#8217;API di Kinsta per automatizzare la gestione dei siti WordPress. Nelle prossime sezioni esploreremo la creazione di script pi\u00f9 avanzati per interagire con l&#8217;API in modi davvero interessanti.<\/p>\n<h2>Caso d&#8217;uso avanzato 1: Creare dei backup<\/h2>\n<p>La creazione di backup \u00e8 un aspetto cruciale della gestione di un sito web. Permettono di ripristinare il sito in caso di problemi imprevisti. Con l&#8217;API di Kinsta e gli shell script, questo processo pu\u00f2 essere automatizzato, risparmiando tempo e fatica.<\/p>\n<p>In questa sezione creeremo dei backup e affronteremo il limite di Kinsta di <strong>cinque backup manuali per ambiente<\/strong>. Per gestire questo problema, implementeremo un processo per:<\/p>\n<ul>\n<li>Controllare il numero attuale di backup manuali.<\/li>\n<li>Identificare ed eliminare il backup pi\u00f9 vecchio (con la conferma dell&#8217;utente) se il limite \u00e8 stato raggiunto.<\/li>\n<li>Procedere alla creazione di un nuovo backup.<\/li>\n<\/ul>\n<p>Vediamone i dettagli.<\/p>\n<h3>Il workflow dei backup<\/h3>\n<p>Per creare i backup utilizzando l&#8217;API di Kinsta, bisogner\u00e0 utilizzare <a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">il seguente endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">POST \/sites\/environments\/{env_id}\/manual-backups<\/code><\/pre>\n<p>Questo richiede:<\/p>\n<ol start=\"1\">\n<li><strong>ID ambiente<\/strong>: identifica l&#8217;ambiente (come staging o live) in cui verr\u00e0 creato il backup.<\/li>\n<li><strong>Tag del backup<\/strong>: si tratta di un&#8217;etichetta per identificare il backup (opzionale).<\/li>\n<\/ol>\n<p>Recuperare manualmente l&#8217;ID ambiente ed eseguire un comando come <code>backup &lt;environment ID&gt;<\/code> pu\u00f2 essere complicato. Invece, creeremo uno script facile da usare in cui dovremo semplicemente specificare il <strong>nome del sito<\/strong> e lo script:<\/p>\n<ol start=\"1\">\n<li>Recuperer\u00e0 l&#8217;elenco degli ambienti del sito.<\/li>\n<li>Chieder\u00e0 di scegliere l&#8217;ambiente di cui eseguire il backup.<\/li>\n<li>Gestir\u00e0 il processo di creazione del backup.<\/li>\n<\/ol>\n<h3>Funzioni riutilizzabili per un codice pulito<\/h3>\n<p>Per mantenere il nostro script modulare e riutilizzabile, definiremo delle funzioni per compiti specifici. Esaminiamo la configurazione passo dopo passo.<\/p>\n<h4>1. Impostare le variabili di base<\/h4>\n<p>Possiamo eliminare il primo script che abbiamo creato o creare un nuovo file di script apposito. Iniziamo dichiarando l&#8217;URL dell&#8217;API Kinsta di base e l&#8217;ID dell&#8217;azienda nello 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>Queste variabili permettono di costruire gli endpoint dell&#8217;API in modo dinamico all&#8217;interno dello script.<\/p>\n<h4>2. Recuperare tutti i siti<\/h4>\n<p>Definiamo una funzione per recuperare l&#8217;elenco di tutti i siti aziendali. Ci\u00f2 permette di recuperare i dettagli di ogni sito in un secondo momento.<\/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>Noterete che questa funzione restituisce una risposta non formattata dall&#8217;API. Per ottenere una risposta formattata, possiamo aggiungere un&#8217;altra funzione per gestirla (ma non \u00e8 questo il nostro obiettivo in questa sezione):<\/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>Chiamando la funzione <code>list_sites<\/code>, i siti vengono visualizzati come mostrato in precedenza. L&#8217;obiettivo principale, tuttavia, \u00e8 quello di accedere a ciascun sito e al suo ID, consentendo di recuperare informazioni dettagliate su ciascun sito.<\/p>\n<h4>3. Recuperare i dettagli del sito<\/h4>\n<p>Per ottenere i dettagli di un sito specifico, usiamo la seguente funzione, che recupera l&#8217;ID del sito in base al nome del sito e recupera ulteriori dettagli, come gli ambienti:<\/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>La funzione precedente filtra il sito utilizzando il nome del sito e poi recupera ulteriori dettagli sul sito utilizzando l&#8217;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>. Questi dettagli includono gli ambienti del sito, che ci servono per attivare i backup.<\/p>\n<h3>Creare i backup<\/h3>\n<p>Ora che abbiamo impostato delle funzioni riutilizzabili per recuperare i dettagli del sito ed elencare gli ambienti, possiamo concentrarci sull&#8217;automatizzazione del processo di creazione dei backup. L&#8217;obiettivo \u00e8 quello di eseguire un semplice comando con il solo nome del sito e poi scegliere interattivamente l&#8217;ambiente di cui eseguire il backup.<\/p>\n<p>Iniziamo creando una funzione (la chiameremo <code>trigger_manual_backup<\/code>). All&#8217;interno della funzione, definiamo due variabili: la prima per accettare il nome del sito come input e la seconda per impostare un tag predefinito (<code>default-backup<\/code>) per il backup. Questo tag predefinito verr\u00e0 applicato a meno che non scegliamo di specificare un tag personalizzato in seguito.<\/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><code>SITE_NAME<\/code> \u00e8 l&#8217;identificativo del sito che vogliamo gestire. Inoltre, \u00e8 possibile impostare una condizione in modo che lo script esca con un messaggio di errore se l&#8217;identificatore non viene fornito. Ci\u00f2 assicura che lo script non proceda senza i dati necessari, evitando potenziali errori API.<\/p>\n<p>Successivamente, utilizziamo la funzione riutilizzabile <code>get_site_details_by_name<\/code> per ottenere informazioni dettagliate sul sito, compresi i suoi ambienti. La risposta viene poi ripulita per eliminare qualsiasi problema di formattazione inatteso che potrebbe verificarsi durante l&#8217;elaborazione.<\/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>Una volta ottenuti i dettagli del sito, lo script sottostante estrae tutti gli ambienti disponibili e li visualizza in un formato leggibile. Questo aiuta a visualizzare quali ambienti sono collegati al sito.<\/p>\n<p>Lo script ci chiede quindi di selezionare un ambiente in base al suo nome. Questa fase interattiva rende il processo pi\u00f9 semplice eliminando la necessit\u00e0 di ricordare o inserire gli ID degli ambienti.<\/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>Il nome dell&#8217;ambiente selezionato viene poi utilizzato per cercare l&#8217;<strong>ID dell&#8217;ambiente<\/strong> corrispondente nei dettagli del sito. Questo ID \u00e8 necessario per le richieste API per creare un 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>Nel codice qui sopra, viene creata una condizione in modo che lo script esca con un messaggio di errore se il nome dell&#8217;ambiente fornito non corrisponde.<\/p>\n<p>Ora che abbiamo l&#8217;ID dell&#8217;ambiente, possiamo verificare il numero attuale di backup manuali per l&#8217;ambiente selezionato. Il limite di Kinsta di cinque backup manuali per ambiente rende questo passaggio fondamentale per evitare errori.<\/p>\n<p>Iniziamo con il recuperare l&#8217;elenco dei backup utilizzando l&#8217;endpoint <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/getBackups\" target=\"_blank\" rel=\"noopener noreferrer\">\/backups<\/a><\/code> dell&#8217;API.<\/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>Lo script precedente filtra quindi i backup manuali e li conta. Se il conteggio raggiunge il limite, dobbiamo gestire i backup esistenti:<\/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>La condizione precedente identifica il backup pi\u00f9 vecchio ordinando l&#8217;elenco in base al timestamp <code>created_at<\/code>. Ci chiede quindi di confermare se desideriamo eliminarlo.<\/p>\n<p>Se accettiamo, lo script elimina il backup pi\u00f9 vecchio utilizzando il suo ID, liberando spazio per quello nuovo. In questo modo si garantisce che i backup possano essere sempre creati senza dover gestire manualmente i limiti.<\/p>\n<p>Ora che c&#8217;\u00e8 spazio, procediamo con il codice per attivare il backup dell&#8217;ambiente. Possiamo tranquillamente saltare questo codice, ma per un&#8217;esperienza migliore, ci chieder\u00e0 di specificare un tag personalizzato, che verr\u00e0 impostato su &#8220;default-backup&#8221; se non viene fornito.<\/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>Infine, lo script sottostante \u00e8 il punto in cui avviene l&#8217;azione di backup. Invia una richiesta <code>POST<\/code> all&#8217;endpoint <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">\/manual-backups<\/a><\/code> con l&#8217;ID dell&#8217;ambiente e il tag di backup selezionati. Se la richiesta va a buon fine, l&#8217;API restituisce una risposta che conferma la creazione del 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>Ecco fatto! La risposta ottenuta dalla richiesta precedente \u00e8 formattata in modo da mostrare l&#8217;ID dell&#8217;operazione, il messaggio e lo stato per maggiore chiarezza. Se chiamiamo la funzione ed eseguiamo lo script, vedremo un output simile a questo:<\/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>Creare comandi per lo script<\/h3>\n<p>I comandi semplificano l&#8217;utilizzo dello script. Invece di modificare lo script o di commentare manualmente il codice, gli utenti possono eseguirlo con un comando specifico come:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh list-sites\n.\/script.sh backup <\/code><\/pre>\n<p>Alla fine dello script (al di fuori di tutte le funzioni), includiamo un blocco condizionale che controlla gli argomenti passati allo 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>La variabile <code>$1<\/code> rappresenta il primo argomento passato allo script (ad esempio, in <code>.\/script.sh list-sites<\/code>, <code>$1<\/code> \u00e8 <code>list-sites<\/code>). Lo script utilizza controlli condizionali per abbinare <code>$1<\/code> a comandi specifici come <code>list-sites<\/code> o <code>backup<\/code>. Se il comando \u00e8 <code>backup<\/code>, si aspetta anche un secondo argomento (<code>$2<\/code>), che \u00e8 il nome del sito. Se non viene fornito alcun comando valido, lo script si limita a visualizzare le istruzioni d&#8217;uso.<\/p>\n<p>Ora possiamo attivare un backup manuale per un sito specifico eseguendo il comando:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh backup<\/code><\/pre>\n<h2>Caso d&#8217;uso avanzato 2: Aggiornamento dei plugin su pi\u00f9 siti<\/h2>\n<p>Gerstire i plugin di WordPress su pi\u00f9 siti pu\u00f2 essere un compito noioso, soprattutto quando sono disponibili aggiornamenti. Kinsta fa un ottimo lavoro per gestire questo aspetto attraverso la dashboard MyKinsta, grazie alla funzione di azione in blocco che abbiamo introdotto lo scorso anno.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/manage-plugins-mykinsta.png\" alt><\/p>\n<p>Ma se non vi piace lavorare con le interfacce utente, l&#8217;API di Kinsta offre un&#8217;altra opportunit\u00e0 per creare uno shell script per automatizzare il processo di identificazione dei plugin obsoleti e il loro aggiornamento su pi\u00f9 siti o ambienti specifici.<\/p>\n<h3>Suddivisione del workflow<\/h3>\n<p>1. <strong>Identificare i siti con plugin obsoleti<\/strong>. Lo script esegue l&#8217;iterazione di tutti i siti e gli ambienti alla ricerca del plugin specificato con un aggiornamento disponibile. Il <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/getPlugins\" target=\"_blank\" rel=\"noopener noreferrer\">seguente endpoint<\/a> viene utilizzato per recuperare l&#8217;elenco dei plugin per uno specifico ambiente del sito:<\/p>\n<pre><code class=\"language-bash\">GET \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>Dalla risposta, filtriamo i plugin in cui <code>\"update\": \"available\"<\/code>.<\/p>\n<p>2. <strong>Richiedere all&#8217;utente le opzioni di aggiornamento<\/strong>. Mostra i siti e gli ambienti con il plugin obsoleto, consentendo all&#8217;utente di selezionare istanze specifiche o di aggiornarle tutte.<\/p>\n<p>3. <strong>Attivare gli aggiornamenti del plugin<\/strong>. Per aggiornare il plugin in un ambiente specifico, lo script utilizza <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">questo endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">PUT \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>Il nome del plugin e la sua versione aggiornata vengono passati nel corpo della richiesta.<\/p>\n<h3>Lo script<\/h3>\n<p>Poich\u00e9 lo script \u00e8 lungo, la funzione completa \u00e8 <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">ospitata su GitHub<\/a> per facilitare l&#8217;accesso. Qui spiegheremo la logica di base utilizzata per identificare i plugin obsoleti su pi\u00f9 siti e ambienti.<\/p>\n<p>Lo script inizia accettando il nome del plugin dal comando. Questo nome indica il plugin che si desidera aggiornare.<\/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>Lo script utilizza quindi la funzione riutilizzabile <code>get_sites_list<\/code> (spiegata in precedenza) per recuperare tutti i siti dell&#8217;azienda:<\/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>Poi arriva il cuore dello script: il looping dell&#8217;elenco dei siti per verificare la presenza di plugin obsoleti. Il file <code>CLEAN_SITES_RESPONSE<\/code>, che \u00e8 un oggetto JSON contenente tutti i siti, viene passato a un ciclo while per eseguire le operazioni per ogni sito, uno per uno.<\/p>\n<p>Inizia estraendo alcuni dati importanti come l&#8217;ID del sito, il nome e il nome visualizzato nelle variabili:<\/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>Il nome del sito viene poi utilizzato insieme alla funzione <code>get_site_details_by_name<\/code> definita in precedenza per ottenere informazioni dettagliate sul sito, compresi tutti i suoi ambienti.<\/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>Gli ambienti vengono poi passati in rassegna per estrarre i dettagli di ogni ambiente, come l&#8217;ID, il nome e il nome visualizzato:<\/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>Per ogni ambiente, lo script recupera l&#8217;elenco dei plugin utilizzando l&#8217;API di 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>Successivamente, lo script controlla se il plugin specificato esiste nell&#8217;ambiente e se ha un aggiornamento disponibile:<\/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 viene trovato un plugin non aggiornato, lo script ne registra i dettagli e li aggiunge all&#8217;array <code>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>Ecco come appaiono i dettagli registrati dei plugin obsoleti:<\/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>Da qui, eseguiamo gli aggiornamenti dei plugin per ogni plugin utilizzando il <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">relativo endpoint<\/a>. Lo script completo si trova in questo <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">repository GitHub<\/a>.<\/p>\n<h2>Riepilogo<\/h2>\n<p>Questo articolo ci ha guidato nella creazione di uno shell script per interagire con l&#8217;API di Kinsta.<\/p>\n<p>Prendetevi un po&#8217; di tempo per esplorare ulteriormente l&#8217;<a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">API di Kinsta<\/a>: scoprirete altre funzionalit\u00e0 che potrete automatizzare per gestire attivit\u00e0 adatte alle vostre esigenze specifiche. Potreste prendere in considerazione l&#8217;integrazione dell&#8217;API con altre API per migliorare il vostro processo decisionale e l&#8217;efficienza.<\/p>\n<p>Infine, controllate regolarmente la <a href=\"https:\/\/kinsta.com\/it\/mykinsta\/\">dashboard di MyKinsta<\/a> per scoprire le nuove funzionalit\u00e0 pensate per rendere la gestione del sito web ancora pi\u00f9 semplice grazie alla sua interfaccia intuitiva.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se gestite molti siti WordPress, probabilmente sarete sempre alla ricerca di modi per semplificare e velocizzare i vostri workflow. Ora, immaginate questo: con un solo comando &#8230;<\/p>\n","protected":false},"author":287,"featured_media":80546,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26232],"class_list":["post-80545","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>Gestire i siti WordPress con gli shell script e l&#039;API di Kinsta<\/title>\n<meta name=\"description\" content=\"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l&#039;API di Kinsta per ottimizzare l&#039;automazione e le prestazioni.\" \/>\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\/it\/blog\/shell-script-api-kinsta\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gestire i siti WordPress con gli shell script e l&#039;API di Kinsta\" \/>\n<meta property=\"og:description\" content=\"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l&#039;API di Kinsta per ottimizzare l&#039;automazione e le prestazioni.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-27T11:57:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-05T10:24:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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=\"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l&#039;API di Kinsta per ottimizzare l&#039;automazione e le prestazioni.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Gestire i siti WordPress con gli shell script e l&#8217;API di Kinsta\",\"datePublished\":\"2025-02-27T11:57:52+00:00\",\"dateModified\":\"2025-03-05T10:24:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\"},\"wordCount\":2405,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\",\"name\":\"Gestire i siti WordPress con gli shell script e l'API di Kinsta\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"datePublished\":\"2025-02-27T11:57:52+00:00\",\"dateModified\":\"2025-03-05T10:24:06+00:00\",\"description\":\"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l'API di Kinsta per ottimizzare l'automazione e le prestazioni.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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\/it\/blog\/shell-script-api-kinsta\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gestire i siti WordPress con gli shell script e l&#8217;API di Kinsta\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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\/it\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gestire i siti WordPress con gli shell script e l'API di Kinsta","description":"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l'API di Kinsta per ottimizzare l'automazione e le prestazioni.","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\/it\/blog\/shell-script-api-kinsta\/","og_locale":"it_IT","og_type":"article","og_title":"Gestire i siti WordPress con gli shell script e l'API di Kinsta","og_description":"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l'API di Kinsta per ottimizzare l'automazione e le prestazioni.","og_url":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2025-02-27T11:57:52+00:00","article_modified_time":"2025-03-05T10:24:06+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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":"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l'API di Kinsta per ottimizzare l'automazione e le prestazioni.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Joel Olawanle","Tempo di lettura stimato":"19 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Gestire i siti WordPress con gli shell script e l&#8217;API di Kinsta","datePublished":"2025-02-27T11:57:52+00:00","dateModified":"2025-03-05T10:24:06+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/"},"wordCount":2405,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/","url":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/","name":"Gestire i siti WordPress con gli shell script e l'API di Kinsta","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","datePublished":"2025-02-27T11:57:52+00:00","dateModified":"2025-03-05T10:24:06+00:00","description":"Gestisci in modo efficiente i tuoi siti WordPress con gli shell script e l'API di Kinsta per ottimizzare l'automazione e le prestazioni.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/shell-script-api-kinsta\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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\/it\/blog\/shell-script-api-kinsta\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/it\/argomenti\/api\/"},{"@type":"ListItem","position":3,"name":"Gestire i siti WordPress con gli shell script e l&#8217;API di Kinsta"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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\/it\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/80545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=80545"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/80545\/revisions"}],"predecessor-version":[{"id":80565,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/80545\/revisions\/80565"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/80545\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/80546"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=80545"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=80545"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=80545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}