{"id":62038,"date":"2025-03-05T08:43:10","date_gmt":"2025-03-05T07:43:10","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=62038&#038;preview=true&#038;preview_id=62038"},"modified":"2025-03-06T08:43:26","modified_gmt":"2025-03-06T07:43:26","slug":"shellscripts-kinsta-api","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/","title":{"rendered":"Zo beheer je WordPress sites met shellscripts en Kinsta API"},"content":{"rendered":"<p>Als je veel WordPress sites beheert, ben je waarschijnlijk altijd op zoek naar manieren om je werkprocessen te vereenvoudigen en te versnellen.<\/p>\n<p>Stel je dit eens voor: met \u00e9\u00e9n commando in je <a href=\"https:\/\/kinsta.com\/nl\/blog\/wp-cli\/\">terminal<\/a> kun je handmatige backups voor al je sites activeren, zelfs als je er tientallen beheert. Dat is de kracht van het combineren van shellscripts met de <a href=\"https:\/\/kinsta.com\/nl\/docs\/kinsta-api\/\">Kinsta API<\/a>.<\/p>\n<p>Deze handleiding leert je hoe je shellscripts kunt gebruiken om aangepaste commando&#8217;s in te stellen die het beheren van je sites effici\u00ebnter maken.<\/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>Vereisten<\/h2>\n<p>Voordat we beginnen, hier is wat je nodig hebt:<\/p>\n<ol start=\"1\">\n<li><strong>Een terminal<\/strong>: Alle moderne besturingssystemen worden geleverd met terminal software, dus je kunt meteen beginnen met scripts maken.<\/li>\n<li><strong>Een IDE of tekstverwerker<\/strong>: Gebruik een tool waar je vertrouwd mee bent, of het nu VS Code, Sublime Text of zelfs een lichtgewicht editor zoals Nano is voor snelle terminalbewerkingen.<\/li>\n<li><strong>Een Kinsta API-sleutel<\/strong>: Dit is essentieel voor interactie met de <a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Kinsta API<\/a>. Om de jouwe te genereren:\n<ul>\n<li>Log in op je <a href=\"https:\/\/my.kinsta.com\/login\/?lang=nl\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a> dashboard.<\/li>\n<li>Ga naar <strong>Je naam<\/strong> &gt; <strong>Bedrijfsinstellingen<\/strong> &gt; <strong>API-sleutels<\/strong>.<\/li>\n<li>Klik op <strong>API-sleutel aanmaken<\/strong> en sla deze veilig op.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>curl<\/code><\/strong><strong> en <\/strong><strong><code>jq<\/code><\/strong>: Essentieel voor het maken van API-verzoeken en het verwerken van JSON-gegevens. Controleer of ze ge\u00efnstalleerd zijn, of installeer ze.<\/li>\n<li><strong>Basiskennis van programmeren<\/strong>: Je hoeft geen expert te zijn, maar kennis van de basis van programmeren en shell scripting syntaxis kan helpen.<\/li>\n<\/ol>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Als de Kinsta API nieuw voor je is, zul je versteld staan van zijn veelzijdigheid. In de loop der jaren hebben we handleidingen gepubliceerd met een aantal geweldige gebruikssituaties, zoals <a href=\"https:\/\/kinsta.com\/nl\/blog\/maken-slackbot-sitebeheer\/\">het bouwen van een Slackbot<\/a> of <a href=\"https:\/\/kinsta.com\/nl\/blog\/plugins-in-bulk-bijwerken-wordpress\/\">het maken van een custom UI<\/a> om taken te automatiseren, zoals het bijwerken van plugins op meerdere sites. Hoewel de API zich momenteel in publieke b\u00e8ta bevindt, biedt hij al een breed scala aan endpoints. Zorg ervoor dat je de <a href=\"https:\/\/kinsta.com\/nl\/docs\/kinsta-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentatie<\/a> doorneemt om te zien wat er allemaal mogelijk is.<\/p>\n<\/aside>\n\n<h2>Je eerste script schrijven<\/h2>\n<p>Het maken van je eerste shellscript voor interactie met de Kinsta API is eenvoudiger dan je zou denken. Laten we beginnen met een eenvoudig script dat een lijst maakt van alle WordPress sites die worden beheerd onder je Kinsta account.<\/p>\n<h3>Stap 1: Stel je omgeving in<\/h3>\n<p>Begin met het maken van een map voor je project en een nieuw scriptbestand. De extensie <code>.sh<\/code> wordt gebruikt voor shellscripts. Je kunt bijvoorbeeld een map maken, ernaar navigeren en een scriptbestand maken en openen in VS Code met deze commando&#8217;s:<\/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>Stap 2: Definieer je omgevingsvariabelen<\/h3>\n<p>Om je API-sleutel veilig te houden, sla je hem op in een <code>.env<\/code> bestand in plaats van hem te hardcoden in het script. Hierdoor kun je het bestand <code>.env<\/code> toevoegen aan <code>.gitignore<\/code> en voorkomen dat het naar versiebeheer wordt gepushed.<\/p>\n<p>Voeg in je <code>.env<\/code> bestand toe:<\/p>\n<pre><code class=\"language-bash\">API_KEY=your_kinsta_api_key<\/code><\/pre>\n<p>Pull vervolgens de API-sleutel uit het <code>.env<\/code> bestand naar je script door het volgende toe te voegen bovenaan je script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsource .env<\/code><\/pre>\n<p>De <code>#!\/bin\/bash<\/code> shebang zorgt ervoor dat het script draait met Bash, terwijl <code>source .env<\/code> de omgevingsvariabelen importeert.<\/p>\n<h3>Stap 3: Schrijf het API-verzoek<\/h3>\n<p>Sla eerst je <strong>bedrijfs-ID<\/strong> (te vinden in MyKinsta onder <strong>Bedrijfsinstellingen <\/strong>&gt;<strong> Factureringsgegevens<\/strong>) op in een variabele:<\/p>\n<pre><code class=\"language-bash\">COMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Voeg vervolgens het curl commando toe om een GET verzoek te doen naar het <code>\/sites<\/code> endpoint, waarbij je de bedrijfs-ID doorgeeft als een query parameter. Gebruik <a href=\"https:\/\/www.baeldung.com\/linux\/jq-command-json\" target=\"_blank\" rel=\"noopener noreferrer\">jq<\/a> om de uitvoer leesbaar op te maken:<\/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>Met dit verzoek worden details opgehaald over alle sites die aan je bedrijf zijn gekoppeld, inclusief hun ID&#8217;s, namen en statussen.<\/p>\n<h3>Stap 4: Maak het script uitvoerbaar<\/h3>\n<p>Sla het script op en maak het uitvoerbaar door het volgende uit te voeren:<\/p>\n<pre><code class=\"language-bash\">chmod +x script.sh<\/code><\/pre>\n<h3>Stap 5: Voer het script uit<\/h3>\n<p>Voer het script uit om een opgemaakte lijst van je sites te zien:<\/p>\n<pre><code class=\"language-bash\">.\/list_sites.sh<\/code><\/pre>\n<p>Als je het script uitvoert, krijg je een antwoord dat hierop lijkt:<\/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>Dit werkt, maar laten we het verbeteren door een functie in te stellen om de sitegegevens op te halen en te formatteren voor een betere leesbaarheid.<\/p>\n<h3>Stap 6: Refactor met een functie<\/h3>\n<p>Vervang het <code>curl<\/code> verzoek door een herbruikbare functie voor het ophalen en opmaken van de sitelijst:<\/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>Als je het script opnieuw uitvoert, krijg je netjes opgemaakte uitvoer:<\/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>Met dit script heb je de eerste stap gezet naar het gebruik van shell scripts en de Kinsta API voor het automatiseren van WordPress sitebeheer. In de volgende secties verkennen we het maken van meer geavanceerde scripts om op krachtige manieren te communiceren met de API.<\/p>\n<h2>Geavanceerd gebruik 1: Backups maken<\/h2>\n<p>Het maken van backups is een cruciaal aspect van websitebeheer. Hiermee kun je je site herstellen in geval van onvoorziene problemen. Met de Kinsta API en shellscripts kan dit proces worden geautomatiseerd, wat tijd en moeite bespaart.<\/p>\n<p>In dit gedeelte maken we backups en gaan we in op Kinsta&#8217;s limiet van <strong>vijf handmatige backups per omgeving<\/strong>. Om dit aan te pakken, implementeren we een proces om:<\/p>\n<ul>\n<li>Het huidige aantal handmatige backups te controleren.<\/li>\n<li>De oudste backup identificeren en verwijderen (met bevestiging van de gebruiker) als de limiet is bereikt.<\/li>\n<li>Doorgaan met het maken van een nieuwe backup.<\/li>\n<\/ul>\n<p>Laten we de details bekijken.<\/p>\n<h3>De backup workflow<\/h3>\n<p>Om backups te maken met de Kinsta API gebruik je <a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">het volgende endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">POST \/sites\/environments\/{env_id}\/manual-backups<\/code><\/pre>\n<p>Dit vereist:<\/p>\n<ol start=\"1\">\n<li><strong>Omgeving ID<\/strong>: Identificeert de omgeving (zoals test of productie) waar de backup wordt gemaakt.<\/li>\n<li><strong>Backup label<\/strong>: Een label om de backup te identificeren (optioneel).<\/li>\n<\/ol>\n<p>Het handmatig achterhalen van de omgevings-ID en het uitvoeren van een commando als <code>backup &lt;environment ID&gt;<\/code> kan omslachtig zijn. In plaats daarvan maken we een gebruiksvriendelijk script waarbij je gewoon de <strong>sitenaam<\/strong> opgeeft en het script zal:<\/p>\n<ol start=\"1\">\n<li>De lijst met omgevingen voor de site ophalen.<\/li>\n<li>Je vragen om de omgeving te kiezen waarvan je een backup wilt maken.<\/li>\n<li>Het aanmaken van de backup afhandelen.<\/li>\n<\/ol>\n<h3>Herbruikbare functies voor schone code<\/h3>\n<p>Om ons script modulair en herbruikbaar te houden, defini\u00ebren we functies voor specifieke taken. Laten we de instellingen stap voor stap doorlopen.<\/p>\n<h4>1. Basisvariabelen instellen<\/h4>\n<p>Je kunt het eerste script dat je hebt gemaakt weglaten of hiervoor een nieuw scriptbestand maken. Begin met het declareren van de basis Kinsta API URL en je bedrijfs-ID in het 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>Met deze variabelen kun je API endpoints dynamisch door het script heen construeren.<\/p>\n<h4>2. Alle sites ophalen<\/h4>\n<p>Definieer een functie om de lijst van alle bedrijfslocaties op te halen. Zo kun je later details over elke site ophalen.<\/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>Je zult zien dat deze functie een ongeformatteerd antwoord van de API teruggeeft. Om een geformatteerd antwoord te krijgen. Je kunt een andere functie toevoegen om dat af te handelen (hoewel dat niet onze zorg is in deze sectie):<\/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>Als je de functie <code>list_sites<\/code> callt, worden je sites weergegeven zoals eerder getoond. Het belangrijkste doel is echter om toegang te krijgen tot elke site en zijn ID, zodat je gedetailleerde informatie over elke site kunt ophalen.<\/p>\n<h4>3. Sitegegevens ophalen<\/h4>\n<p>Om details over een specifieke site op te halen, gebruik je de volgende functie, die het ID van de site ophaalt op basis van de sitenaam en aanvullende details ophaalt, zoals omgevingen:<\/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>De bovenstaande functie filtert de site op basis van de sitenaam en haalt vervolgens aanvullende details over de site op met behulp van het <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> endpoint. Deze details omvatten de omgevingen van de site, die we nodig hebben om backups te maken.<\/p>\n<h3>Backups maken<\/h3>\n<p>Nu je herbruikbare functies hebt ingesteld om sitegegevens op te halen en omgevingen op te sommen, kun je je richten op het automatiseren van het maken van backups. Het doel is om een eenvoudig commando uit te voeren met alleen de sitenaam en dan interactief de omgeving te kiezen waarvan je een backup wilt maken.<\/p>\n<p>Begin met het maken van een functie (we noemen hem <code>trigger_manual_backup<\/code>). Binnen de functie definieer je twee variabelen: de eerste om de sitenaam als invoer te accepteren en de tweede om een standaard tag (<code>default-backup<\/code>) in te stellen voor de backup. Deze standaard tag wordt toegepast tenzij je later een aangepaste tag opgeeft.<\/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>Deze <code>SITE_NAME<\/code> is de identificatie voor de site die je wilt beheren. Je stelt ook een voorwaarde in zodat het script wordt afgesloten met een foutmelding als de identifier niet wordt opgegeven. Dit zorgt ervoor dat het script niet verder gaat zonder de benodigde invoer en voorkomt mogelijke API fouten.<\/p>\n<p>Vervolgens gebruik je de herbruikbare <code>get_site_details_by_name<\/code> functie om gedetailleerde informatie over de site op te halen, inclusief de omgevingen. Het antwoord wordt vervolgens opgeschoond om onverwachte opmaakproblemen te verwijderen die zich tijdens het verwerken kunnen voordoen.<\/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>Zodra we de gegevens van de site hebben, haalt het onderstaande script alle beschikbare omgevingen eruit en geeft ze weer in een leesbaar formaat. Dit helpt je te visualiseren welke omgevingen zijn gekoppeld aan de site.<\/p>\n<p>Het script vraagt je vervolgens om een omgeving te selecteren op naam. Deze interactieve stap maakt het proces gebruiksvriendelijk doordat je geen ID&#8217;s van omgevingen hoeft te onthouden of in te voeren.<\/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>De geselecteerde omgevingsnaam wordt vervolgens gebruikt om de bijbehorende <strong>omgevings-ID<\/strong> op te zoeken in de sitegegevens. Deze ID is nodig voor API-verzoeken om een backup te maken.<\/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>In de bovenstaande code wordt een voorwaarde gemaakt zodat het script wordt afgesloten met een foutmelding als de opgegeven omgevingsnaam niet overeenkomt.<\/p>\n<p>Nu je de omgevings-ID hebt, kun je doorgaan met het controleren van het huidige aantal handmatige backups voor de geselecteerde omgeving. Kinsta&#8217;s limiet van vijf handmatige backups per omgeving betekent dat deze stap cruciaal is om fouten te voorkomen.<\/p>\n<p>Laten we beginnen met het ophalen van de lijst met backups met behulp van het <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/getBackups\" target=\"_blank\" rel=\"noopener noreferrer\">\/backups<\/a><\/code> API endpoint.<\/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>Het script hierboven filtert vervolgens op handmatige backups en telt ze. Als het aantal de limiet bereikt, moeten we de bestaande backups beheren:<\/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>De bovenstaande voorwaarde identificeert de oudste backup door de lijst te sorteren op basis van het <code>created_at<\/code> tijdstempel. Vervolgens wordt gevraagd of je deze wilt verwijderen.<\/p>\n<p>Als je akkoord gaat, verwijdert het script de oudste backup met zijn ID, zodat er ruimte vrijkomt voor de nieuwe. Dit zorgt ervoor dat er altijd backups kunnen worden gemaakt zonder dat de limieten handmatig moeten worden beheerd.<\/p>\n<p>Nu er ruimte is, gaan we verder met de code om de backup voor de omgeving te activeren. Je kunt deze code gerust overslaan, maar voor een betere ervaring wordt je gevraagd om een custom tag op te geven, die standaard op &#8220;default-backup&#8221; wordt gezet als er geen is opgegeven.<\/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>Tenslotte is het script hieronder waar de backup actie plaatsvindt. Het stuurt een <code>POST<\/code> verzoek naar het <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">\/manual-backups<\/a><\/code> endpoint met de geselecteerde omgevings-ID en backup tag. Als het verzoek succesvol is, stuurt de API een antwoord terug waarin de aanmaak van de backup wordt bevestigd.<\/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>Dat is het! Het antwoord dat wordt verkregen uit het bovenstaande verzoek is geformatteerd om de ID van de bewerking, het bericht en de status voor de duidelijkheid weer te geven. Als je de functie callt en het script uitvoert, zie je een uitvoer die hierop lijkt:<\/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>Commando&#8217;s maken voor je script<\/h3>\n<p>Commando&#8217;s vereenvoudigen het gebruik van je script. In plaats van het script te bewerken of handmatig code te verwijderen, kunnen gebruikers het uitvoeren met een specifiek commando zoals:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh list-sites\n.\/script.sh backup <\/code><\/pre>\n<p>Neem aan het einde van je script (buiten alle functies) een voorwaardelijk blok op dat de argumenten controleert die aan het script zijn doorgegeven:<\/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>De variabele <code>$1<\/code> vertegenwoordigt het eerste argument dat aan het script wordt doorgegeven (bijvoorbeeld in <code>.\/script.sh list-sites<\/code>, <code>$1<\/code> is <code>list-sites<\/code>). Het script gebruikt voorwaardelijke controles om <code>$1<\/code> te matchen met specifieke commando&#8217;s zoals <code>list-sites<\/code> of <code>backup<\/code>. Als het commando <code>backup<\/code> is, verwacht het ook een tweede argument (<code>$2<\/code>), wat de sitenaam is. Als er geen geldig commando wordt gegeven, geeft het script standaard gebruiksinstructies weer.<\/p>\n<p>Je kunt nu een handmatige backup voor een specifieke site starten door het commando uit te voeren:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh backup<\/code><\/pre>\n<h2>Geavanceerd gebruik 2: Plugins bijwerken voor meerdere sites<\/h2>\n<p>Het beheren van WordPress plugins op meerdere sites kan vervelend zijn, vooral als er updates beschikbaar zijn. Kinsta regelt dit heel goed via het MyKinsta dashboard, door middel van de bulkactie-functie die we vorig jaar hebben ge\u00efntroduceerd.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/manage-plugins-mykinsta.png\" alt><\/p>\n<p>Maar als je niet graag met gebruikersinterfaces werkt, biedt de Kinsta API een andere mogelijkheid om een shellscript te maken om het proces van het identificeren van verouderde plugins en het bijwerken ervan op meerdere sites of specifieke omgevingen te automatiseren.<\/p>\n<h3>De workflow opsplitsen<\/h3>\n<p>1. <strong>Identificeer sites met verouderde plugins:<\/strong> Het script doorloopt alle sites en omgevingen en zoekt naar de opgegeven plugin waarvan een update beschikbaar is. Het <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/getPlugins\" target=\"_blank\" rel=\"noopener noreferrer\">volgende endpoint<\/a> wordt gebruikt om de lijst met plugins voor een specifieke siteomgeving op te halen:<\/p>\n<pre><code class=\"language-bash\">GET \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>Uit het antwoord filteren we op plugins met <code>\"update\": \"available\"<\/code>.<\/p>\n<p>2. <strong>De gebruiker wordt gevraagd om updateopties:<\/strong> Het toont de sites en omgevingen met de verouderde plugin, zodat de gebruiker specifieke instanties kan selecteren of ze allemaal kan bijwerken.<\/p>\n<p>3. <strong>Trigger plugin updates:<\/strong> Om de plugin in een specifieke omgeving bij te werken, gebruikt het script <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">dit endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">PUT \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>De naam van de plugin en de bijgewerkte versie worden doorgegeven in de request body.<\/p>\n<h3>Het script<\/h3>\n<p>Omdat het script lang is, wordt de volledige functie <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">gehost op GitHub<\/a> voor gemakkelijke toegang. Hier leggen we de kernlogica uit die wordt gebruikt om verouderde plugins op meerdere sites en omgevingen te identificeren.<\/p>\n<p>Het script begint met het accepteren van de plugin naam van het commando. Deze naam specificeert de plugin die je wilt bijwerken.<\/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>Het script gebruikt dan de herbruikbare <code>get_sites_list<\/code> functie (eerder uitgelegd) om alle sites in het bedrijf op te halen:<\/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>Vervolgens komt het hart van het script: door de lijst met sites lopen om te controleren op verouderde plugins. De <code>CLEAN_SITES_RESPONSE<\/code>, een JSON-object dat alle sites bevat, wordt doorgegeven aan een while-loop om de bewerkingen voor elke site een voor een uit te voeren.<\/p>\n<p>Het begint met het verzamelen van enkele belangrijke gegevens zoals de site-ID, naam en weergavenaam in variabelen:<\/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>De sitenaam wordt vervolgens samen met de eerder gedefinieerde functie <code>get_site_details_by_name<\/code> gebruikt om gedetailleerde informatie over de site op te halen, inclusief alle omgevingen.<\/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>De omgevingen worden vervolgens doorlopen om details van elke omgeving op te halen, zoals de ID, naam en weergavenaam:<\/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>Voor elke omgeving haalt het script nu de lijst met plugins op met behulp van de Kinsta API.<\/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>Vervolgens controleert het script of de opgegeven plugin in de omgeving bestaat en een update beschikbaar heeft:<\/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>Als er een verouderde plugin wordt gevonden, logt het script de details en voegt deze toe aan de <code>SITES_WITH_OUTDATED_PLUGIN<\/code> array:<\/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>Zo zien de gelogde details van verouderde plugins eruit:<\/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>Vanaf hier voeren we plugin-updates uit voor elke plugin met behulp van <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">zijn endpoint<\/a>. Het volledige script staat in deze <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub repository<\/a>.<\/p>\n<h2>Samenvatting<\/h2>\n<p>Dit artikel heeft je begeleid bij het maken van een shellscript voor interactie met de Kinsta API.<\/p>\n<p>Neem de tijd om de <a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Kinsta API<\/a> verder te verkennen &#8211; je zult extra functies ontdekken die je kunt automatiseren om taken uit te voeren die zijn afgestemd op jouw specifieke behoeften. Je zou kunnen overwegen om de API te integreren met andere API&#8217;s om de besluitvorming en effici\u00ebntie te verbeteren.<\/p>\n<p>Controleer tot slot regelmatig het <a href=\"https:\/\/kinsta.com\/nl\/mykinsta\/\">MyKinsta dashboard<\/a> voor nieuwe functies die zijn ontworpen om websitebeheer nog gebruiksvriendelijker te maken via de intu\u00eftieve interface.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als je veel WordPress sites beheert, ben je waarschijnlijk altijd op zoek naar manieren om je werkprocessen te vereenvoudigen en te versnellen. Stel je dit eens &#8230;<\/p>\n","protected":false},"author":287,"featured_media":62039,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[911],"class_list":["post-62038","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>Zo beheer je WordPress sites met shellscripts en Kinsta API<\/title>\n<meta name=\"description\" content=\"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.\" \/>\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\/nl\/blog\/shellscripts-kinsta-api\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zo beheer je WordPress sites met shellscripts en Kinsta API\" \/>\n<meta property=\"og:description\" content=\"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-05T07:43:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-06T07:43:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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=\"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Zo beheer je WordPress sites met shellscripts en Kinsta API\",\"datePublished\":\"2025-03-05T07:43:10+00:00\",\"dateModified\":\"2025-03-06T07:43:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\"},\"wordCount\":2467,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"inLanguage\":\"nl-NL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\",\"name\":\"Zo beheer je WordPress sites met shellscripts en Kinsta API\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"datePublished\":\"2025-03-05T07:43:10+00:00\",\"dateModified\":\"2025-03-06T07:43:26+00:00\",\"description\":\"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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\/nl\/blog\/shellscripts-kinsta-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Zo beheer je WordPress sites met shellscripts en Kinsta API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"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\/nl\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zo beheer je WordPress sites met shellscripts en Kinsta API","description":"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.","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\/nl\/blog\/shellscripts-kinsta-api\/","og_locale":"nl_NL","og_type":"article","og_title":"Zo beheer je WordPress sites met shellscripts en Kinsta API","og_description":"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.","og_url":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2025-03-05T07:43:10+00:00","article_modified_time":"2025-03-06T07:43:26+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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":"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Joel Olawanle","Geschatte leestijd":"20 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Zo beheer je WordPress sites met shellscripts en Kinsta API","datePublished":"2025-03-05T07:43:10+00:00","dateModified":"2025-03-06T07:43:26+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/"},"wordCount":2467,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","inLanguage":"nl-NL"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/","url":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/","name":"Zo beheer je WordPress sites met shellscripts en Kinsta API","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","datePublished":"2025-03-05T07:43:10+00:00","dateModified":"2025-03-06T07:43:26+00:00","description":"Beheer je WordPress sites effici\u00ebnt met shellscripts en de Kinsta API voor gestroomlijnde automatisering en prestaties.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/shellscripts-kinsta-api\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/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\/nl\/blog\/shellscripts-kinsta-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/api\/"},{"@type":"ListItem","position":3,"name":"Zo beheer je WordPress sites met shellscripts en Kinsta API"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","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\/nl\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/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\/nl\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/62038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=62038"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/62038\/revisions"}],"predecessor-version":[{"id":62057,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/62038\/revisions\/62057"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/translations\/es"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/62038\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/62039"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=62038"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=62038"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=62038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}