{"id":78395,"date":"2025-03-03T15:00:27","date_gmt":"2025-03-03T14:00:27","guid":{"rendered":"https:\/\/kinqsta.com\/es\/?p=78395&#038;preview=true&#038;preview_id=78395"},"modified":"2025-03-03T16:00:45","modified_gmt":"2025-03-03T15:00:45","slug":"shell-scripts-y-api-kinsta","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/","title":{"rendered":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta"},"content":{"rendered":"<p>Si administras muchos sitios de WordPress, probablemente siempre est\u00e9s buscando formas de simplificar y acelerar tus flujos de trabajo.<\/p>\n<p>Ahora, imagina esto: con un solo comando en tu <a href=\"https:\/\/kinqsta.com\/es\/blog\/wp-cli\/\">terminal<\/a>, puedes activar copias de seguridad manuales para todos tus sitios, incluso si gestionas docenas de ellos. Ese es el poder de combinar scripts de shell con la <a href=\"https:\/\/kinqsta.com\/es\/docs\/api-kinsta\/\">API de Kinsta<\/a>.<\/p>\n<p>Esta gu\u00eda te ense\u00f1a a utilizar scripts de shell para configurar comandos personalizados que hagan m\u00e1s eficiente la gesti\u00f3n de tus sitios.<\/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>Requisitos previos<\/h2>\n<p>Antes de empezar, esto es lo que necesitas:<\/p>\n<ol start=\"1\">\n<li><strong>Un terminal<\/strong>: Todos los sistemas operativos modernos vienen con software de terminal, por lo que puedes empezar a crear scripts desde el primer momento.<\/li>\n<li><strong>Un IDE o editor de texto<\/strong>: Utiliza una herramienta con la que te sientas c\u00f3modo, ya sea VS Code, Sublime Text o incluso un editor sencillo como Nano para ediciones r\u00e1pidas en el terminal.<\/li>\n<li><strong>Una clave API de Kinsta<\/strong>: Es esencial para interactuar con la <a href=\"https:\/\/api-docs.kinqsta.com\/?_gl=1*1bl8gw1*_gcl_au*MTM1MTcyMzgyOS4xNzMzNDc0Mjky*_ga*MjY2MTczNDMzLjE3MjU2MTE5ODM.*_ga_R8LLNPRZTN*MTc0MDcyMzEzNi4xMTkuMS4xNzQwNzIzMzc2LjYwLjAuMA..\">API de Kinsta<\/a>. Para generar la tuya:\n<ul>\n<li>Accede a tu panel <a href=\"https:\/\/my.kinqsta.com\/login\/?lang=es\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta<\/a>.<\/li>\n<li>Ve a <strong>Tu nombre<\/strong> &gt; <strong>Configuraci\u00f3n de la empresa<\/strong> &gt; <strong>Claves API<\/strong>.<\/li>\n<li>Haz clic en <strong>Crear Clave API<\/strong> y gu\u00e1rdala de forma segura.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>curl<\/code><\/strong><strong> y <\/strong><strong><code>jq<\/code><\/strong>: Imprescindibles para hacer peticiones a la API y manejar datos JSON. Comprueba que est\u00e1n instalados, o inst\u00e1lalos.<\/li>\n<li><strong>Familiaridad b\u00e1sica con la programaci\u00f3n<\/strong>: No necesitas ser un experto, pero te ser\u00e1 \u00fatil comprender los fundamentos de la programaci\u00f3n y la sintaxis de los scripts de shell.<\/li>\n<\/ol>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si eres nuevo con la API Kinsta, te sorprender\u00e1 su versatilidad. A lo largo de los a\u00f1os, hemos publicado gu\u00edas que muestran algunos casos de uso geniales, como la <a href=\"https:\/\/kinqsta.com\/es\/blog\/construir-slackbot-para-gestion-de-sitios\/\">creaci\u00f3n de un Slackbot<\/a> o la <a href=\"https:\/\/kinqsta.com\/es\/blog\/actualizacion-masiva-de-plugins-wordpress\/\">creaci\u00f3n de una interfaz de usuario personalizada<\/a> para automatizar tareas como la actualizaci\u00f3n de plugins en varios sitios. Aunque la API est\u00e1 actualmente en fase beta p\u00fablica, ya ofrece una amplia gama de endpoints. Aseg\u00farate de explorar la <a href=\"https:\/\/kinqsta.com\/es\/docs\/api-kinsta\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentaci\u00f3n<\/a> para ver sus posibilidades.<\/p>\n<\/aside>\n\n<h2>Escribir tu primer script<\/h2>\n<p>Crear tu primer script de shell para interactuar con la API de Kinsta es m\u00e1s sencillo de lo que imaginas. Empecemos con un sencillo script que enumere todos los sitios de WordPress administrados bajo tu cuenta de Kinsta.<\/p>\n<h3>Paso 1: Configura tu entorno<\/h3>\n<p>Empieza creando una carpeta para tu proyecto y un nuevo archivo de script. La extensi\u00f3n <code>.sh<\/code> se utiliza para los scripts de shell. Por ejemplo, puedes crear una carpeta, navegar hasta ella, y crear y abrir un archivo de script en VS Code utilizando estos comandos:<\/p>\n<pre><code class=\"language-bash\">mkdir my-first-shell-scripts\ncd my-first-shell-scripts\ntouch script.sh\ncode script.sh<\/code><\/pre>\n<h3>Paso 2: Define tus variables de entorno<\/h3>\n<p>Para mantener segura tu clave API, gu\u00e1rdala en un archivo <code>.env<\/code> en lugar de codificarla en el script. Esto te permite a\u00f1adir el archivo <code>.env<\/code> a <code>.gitignore<\/code>, evitando que se env\u00ede al control de versiones.<\/p>\n<p>En tu archivo <code>.env<\/code>, a\u00f1ade:<\/p>\n<pre><code class=\"language-bash\">API_KEY=your_kinsta_api_key<\/code><\/pre>\n<p>A continuaci\u00f3n, a\u00f1ade la clave API del archivo <code>.env<\/code> a tu script a\u00f1adiendo lo siguiente en la parte superior de tu script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsource .env<\/code><\/pre>\n<p>El comando<code>#!\/bin\/bash<\/code> garantiza que el script se ejecute utilizando Bash, mientras que <code>source .env<\/code> importa las variables de entorno.<\/p>\n<h3>Paso 3: Escribe la solicitud de API<\/h3>\n<p>En primer lugar, guarda el <strong>ID de tu empresa<\/strong> (que encontrar\u00e1s en MyKinsta en <strong>Configuraci\u00f3n de la empresa <\/strong>&gt;<strong> Detalles de facturaci\u00f3n<\/strong>) en una variable:<\/p>\n<pre><code class=\"language-bash\">COMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>A continuaci\u00f3n, a\u00f1ade el comando curl para realizar una solicitud GET al endpoint <code>\/sites<\/code>, pasando el ID de la empresa como par\u00e1metro de consulta. Utiliza <a href=\"https:\/\/www.baeldung.com\/linux\/jq-command-json\" target=\"_blank\" rel=\"noopener noreferrer\">jq<\/a> para dar formato a la salida para que sea legible:<\/p>\n<pre><code class=\"language-bash\">curl -s -X GET \n  \"https:\/\/api.kinqsta.com\/v2\/sites?company=$COMPANY_ID\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\" | jq<\/code><\/pre>\n<p>Esta petici\u00f3n recupera detalles sobre todos los sitios asociados a tu empresa, incluidos sus ID, nombres y estados.<\/p>\n<h3>Paso 4: Haz ejecutable el script<\/h3>\n<p>Guarda el script y hazlo ejecutable iniciando:<\/p>\n<pre><code class=\"language-bash\">chmod +x script.sh<\/code><\/pre>\n<h3>Paso 5: Ejecuta el script<\/h3>\n<p>Ejecuta el script para ver una lista formateada de tus sitios:<\/p>\n<pre><code class=\"language-bash\">.\/list_sites.sh<\/code><\/pre>\n<p>Cuando ejecutes el script, obtendr\u00e1s una respuesta similar a \u00e9sta:<\/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>Aunque esto funciona, vamos a mejorarlo configurando una funci\u00f3n para recuperar y formatear los detalles del sitio para facilitar la lectura.<\/p>\n<h3>Paso 6: Refactorizar con una funci\u00f3n<\/h3>\n<p>Sustituye la solicitud <code>curl<\/code> por una funci\u00f3n reutilizable que se encargue de obtener y formatear la lista de sitios:<\/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.kinqsta.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>Cuando vuelvas a ejecutar el script, obtendr\u00e1s una salida con un formato ordenado:<\/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 este script, habr\u00e1s dado tu primer paso hacia el uso de scripts de shell y la API de Kinsta para automatizar la gesti\u00f3n del sitio de WordPress. En las siguientes secciones, exploraremos la creaci\u00f3n de scripts m\u00e1s avanzados para interactuar con la API de forma potente.<\/p>\n<h2>Caso de uso avanzado 1: Crear copias de seguridad<\/h2>\n<p>Crear copias de seguridad es un aspecto crucial de la gesti\u00f3n de un sitio web. Te permiten restaurar tu sitio en caso de problemas imprevistos. Con la API de Kinsta y los scripts de shell, este proceso puede automatizarse, ahorrando tiempo y esfuerzo.<\/p>\n<p>En esta secci\u00f3n, creamos copias de seguridad y nos ocupamos del l\u00edmite de Kinsta de <strong>cinco copias de seguridad manuales por entorno<\/strong>. Para ello, implementaremos un proceso para:<\/p>\n<ul>\n<li>Comprobar el n\u00famero actual de copias de seguridad manuales.<\/li>\n<li>Identificar y eliminar la copia de seguridad m\u00e1s antigua (con confirmaci\u00f3n del usuario) si se alcanza el l\u00edmite.<\/li>\n<li>Proceder a crear una nueva copia de seguridad.<\/li>\n<\/ul>\n<p>Vamos a entrar en detalles.<\/p>\n<h3>El flujo de trabajo de las copias de seguridad<\/h3>\n<p>Para crear copias de seguridad utilizando la API de Kinsta, utilizar\u00e1s <a href=\"https:\/\/api-docs.kinqsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">el siguiente endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">POST \/sites\/environments\/{env_id}\/manual-backups<\/code><\/pre>\n<p>Esto requiere:<\/p>\n<ol start=\"1\">\n<li><strong>ID del entorno<\/strong>: Identifica el entorno (como staging o producci\u00f3n) donde se crear\u00e1 la copia de seguridad.<\/li>\n<li><strong>Etiqueta de copia de seguridad<\/strong>: Una etiqueta para identificar la copia de seguridad (opcional).<\/li>\n<\/ol>\n<p>Recuperar manualmente el ID del entorno y ejecutar un comando como <code>backup &lt;environment ID&gt;<\/code> puede ser engorroso. En su lugar, crearemos un script f\u00e1cil de usar en el que simplemente especifiques el <strong>nombre del sitio<\/strong>, y el script lo har\u00e1:<\/p>\n<ol start=\"1\">\n<li>Obtendr\u00e1 la lista de entornos del sitio.<\/li>\n<li>Te pedir\u00e1 que elijas el entorno del que quieres hacer una copia de seguridad.<\/li>\n<li>Se encargar\u00e1 del proceso de creaci\u00f3n de la copia de seguridad.<\/li>\n<\/ol>\n<h3>Funciones reutilizables para un c\u00f3digo limpio<\/h3>\n<p>Para mantener nuestro script modular y reutilizable, definiremos funciones para tareas espec\u00edficas. Repasemos la configuraci\u00f3n paso a paso.<\/p>\n<h4>1. Configurar variables base<\/h4>\n<p>Puedes prescindir del primer script que creaste o crear un nuevo archivo de script para esto. Empieza declarando la URL base de la API Kinsta y el ID de tu empresa en el script:<\/p>\n<pre><code class=\"language-bash\">BASE_URL=\"https:\/\/api.kinqsta.com\/v2\"\nCOMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Estas variables te permiten construir endpoints de la API de forma din\u00e1mica a lo largo del script.<\/p>\n<h4>2. Obtener todos los sitios<\/h4>\n<p>Define una funci\u00f3n para obtener la lista de todos los sitios de la empresa. Esto te permite recuperar detalles sobre cada sitio m\u00e1s adelante.<\/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>Ver\u00e1s que esta funci\u00f3n devuelve una respuesta sin formato de la API. Para obtener una respuesta formateada. Puedes a\u00f1adir otra funci\u00f3n que se encargue de ello (aunque no es lo que nos ocupa en esta secci\u00f3n):<\/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>Al llamar a la funci\u00f3n <code>list_sites<\/code> se muestran tus sitios como se ha mostrado anteriormente. El objetivo principal, sin embargo, es acceder a cada sitio y a su ID, lo que te permitir\u00e1 recuperar informaci\u00f3n detallada sobre cada sitio.<\/p>\n<h4>3. Obtener detalles de un sitio<\/h4>\n<p>Para obtener detalles sobre un sitio concreto, utiliza la siguiente funci\u00f3n, que recupera el ID del sitio bas\u00e1ndose en el nombre del sitio y obtiene detalles adicionales, como los entornos:<\/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 funci\u00f3n anterior filtra el sitio utilizando el nombre del sitio y luego recupera detalles adicionales sobre el sitio utilizando el endpoint <code><a href=\"https:\/\/api-docs.kinqsta.com\/tag\/WordPress-Sites#operation\/getSiteById\" target=\"_blank\" rel=\"noopener noreferrer\">\/sites\/&lt;site-id&gt;<\/a><\/code>. Estos detalles incluyen los entornos del sitio, que es lo que necesitamos para activar las copias de seguridad.<\/p>\n<h3>Crear copias de seguridad<\/h3>\n<p>Ahora que has configurado funciones reutilizables para obtener detalles del sitio y listar entornos, puedes centrarte en automatizar el proceso de creaci\u00f3n de copias de seguridad. El objetivo es ejecutar un comando sencillo con s\u00f3lo el nombre del sitio y luego elegir interactivamente el entorno del que hacer la copia de seguridad.<\/p>\n<p>Empieza creando una funci\u00f3n (la llamaremos <code>trigger_manual_backup<\/code>). Dentro de la funci\u00f3n, define dos variables: la primera para aceptar el nombre del sitio como entrada y la segunda para establecer una etiqueta por defecto (<code>default-backup<\/code>) para la copia de seguridad. Esta etiqueta por defecto se aplicar\u00e1 a menos que decidas especificar una etiqueta personalizada m\u00e1s adelante.<\/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>Este <code>SITE_NAME<\/code> es el identificador del sitio que quieres gestionar. Tambi\u00e9n estableces una condici\u00f3n para que el script salga con un mensaje de error si no se proporciona el identificador. Esto garantiza que el script no proceda sin la informaci\u00f3n necesaria, evitando posibles errores de la API.<\/p>\n<p>A continuaci\u00f3n, utiliza la funci\u00f3n reutilizable <code>get_site_details_by_name<\/code>\u00a0para obtener informaci\u00f3n detallada sobre el sitio, incluidos sus entornos. Acto seguido, se limpia la respuesta para eliminar cualquier problema de formato inesperado que pueda surgir durante el procesamiento.<\/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 vez que tenemos los detalles del sitio, el script que aparece a continuaci\u00f3n extrae todos los entornos disponibles y los muestra en un formato legible. Esto te ayuda a visualizar qu\u00e9 entornos est\u00e1n vinculados al sitio.<\/p>\n<p>A continuaci\u00f3n, el script te pide que selecciones un entorno por su nombre. Este paso interactivo facilita el proceso al eliminar la necesidad de recordar o introducir los ID de los entornos.<\/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>El nombre del entorno seleccionado se utiliza para buscar su <strong>ID de entorno<\/strong> correspondiente en los detalles del sitio. Este ID es necesario para las solicitudes de API para crear una copia de seguridad.<\/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>En el c\u00f3digo anterior, se crea una condici\u00f3n para que el script salga con un mensaje de error si no coincide el nombre de entorno proporcionado.<\/p>\n<p>Ahora que tienes el ID del entorno, puedes proceder a comprobar el n\u00famero actual de copias de seguridad manuales para el entorno seleccionado. El l\u00edmite de Kinsta de cinco copias de seguridad manuales por entorno significa que este paso es crucial para evitar errores.<\/p>\n<p>Empecemos por obtener la lista de copias de seguridad utilizando el endpoint <code><a href=\"https:\/\/api-docs.kinqsta.com\/tag\/Backups#operation\/getBackups\" target=\"_blank\" rel=\"noopener noreferrer\">\/backups<\/a><\/code> de la 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>A continuaci\u00f3n, el script anterior filtra las copias de seguridad manuales y las cuenta. Si el recuento alcanza el l\u00edmite, tenemos que gestionar las copias de seguridad existentes:<\/p>\n<pre><code class=\"language-bash\">  if [ \"$BACKUP_COUNT\" -ge 5 ]; then\n    echo \"Manual backup limit reached (5 backups).\"\n    \n    # Find the oldest backup\n    OLDEST_BACKUP=$(echo \"$MANUAL_BACKUPS\" | jq -r 'sort_by(.created_at) | .[0]')\n    OLDEST_BACKUP_NAME=$(echo \"$OLDEST_BACKUP\" | jq -r '.note')\n    OLDEST_BACKUP_ID=$(echo \"$OLDEST_BACKUP\" | jq -r '.id')\n\n    echo \"The oldest manual backup is \"$OLDEST_BACKUP_NAME\".\"\n    read -p \"Do you want to delete this backup to create a new one? (yes\/no): \" CONFIRM\n\n    if [ \"$CONFIRM\" != \"yes\" ]; then\n      echo \"Aborting backup creation.\"\n      return 1\n    fi\n\n    # Delete the oldest backup\n    DELETE_URL=\"$BASE_URL\/sites\/environments\/backups\/$OLDEST_BACKUP_ID\"\n    DELETE_RESPONSE=$(curl -s -X DELETE \"$DELETE_URL\" \n      -H \"Authorization: Bearer $API_KEY\" \n      -H \"Content-Type: application\/json\")\n\n    echo \"Delete Response:\"\n    echo \"$DELETE_RESPONSE\" | jq -r '[\n      \"Operation ID: (.operation_id)\",\n      \"Message: (.message)\",\n      \"Status: (.status)\"\n    ] | join(\"n\")'\n  fi<\/code><\/pre>\n<p>La condici\u00f3n anterior identifica la copia de seguridad m\u00e1s antigua ordenando la lista en funci\u00f3n de la marca de tiempo <code>created_at<\/code>. A continuaci\u00f3n, te pide que confirmes si deseas eliminarla.<\/p>\n<p>Si aceptas, el script elimina la copia de seguridad m\u00e1s antigua utilizando su ID, liberando espacio para la nueva. Esto garantiza que siempre se puedan crear copias de seguridad sin tener que gestionar manualmente los l\u00edmites.<\/p>\n<p>Ahora que hay espacio, procedamos con el c\u00f3digo para activar la copia de seguridad del entorno. Puedes omitir este c\u00f3digo, pero para una mejor experiencia, te pide que especifiques una etiqueta personalizada, que por defecto es \u00abdefault-backup\u00bb si no se proporciona ninguna.<\/p>\n<pre><code class=\"language-bash\">read -p \"Enter a backup tag (or press Enter to use \"$DEFAULT_TAG\"): \" BACKUP_TAG\n\nif [ -z \"$BACKUP_TAG\" ]; then\n  BACKUP_TAG=\"$DEFAULT_TAG\"\nfi\n\necho \"Using backup tag: $BACKUP_TAG\"<\/code><\/pre>\n<p>Por \u00faltimo, el script que aparece a continuaci\u00f3n es donde tiene lugar la acci\u00f3n de copia de seguridad. Env\u00eda una solicitud <code>POST<\/code> al endpoint <code><a href=\"https:\/\/api-docs.kinqsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">\/manual-backups<\/a><\/code> con el ID de entorno y la etiqueta de copia de seguridad seleccionados. Si la solicitud tiene \u00e9xito, la API devuelve una respuesta confirmando la creaci\u00f3n de la copia de seguridad.<\/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>Ya est\u00e1. La respuesta obtenida de la solicitud anterior est\u00e1 formateada para mostrar el ID de la operaci\u00f3n, el mensaje y el estado para mayor claridad. Si llamas a la funci\u00f3n y ejecutas el script, ver\u00e1s una salida similar a \u00e9sta:<\/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>Crear comandos para tu script<\/h3>\n<p>Los comandos simplifican el uso de tu script. En lugar de editar el script o comentar el c\u00f3digo manualmente, los usuarios pueden ejecutarlo con un comando espec\u00edfico como:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh list-sites\n.\/script.sh backup <\/code><\/pre>\n<p>Al final de tu script (aparte de todas las funciones), incluye un bloque condicional que compruebe los argumentos pasados al 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 variable <code>$1<\/code> representa el primer argumento pasado al script (por ejemplo, en <code>.\/script.sh list-sites<\/code>, <code>$1<\/code> es <code>list-sites<\/code>). El script utiliza comprobaciones condicionales para hacer coincidir <code>$1<\/code> con comandos espec\u00edficos como <code>list-sites<\/code> o <code>backup<\/code>. Si el comando es <code>backup<\/code>, tambi\u00e9n espera un segundo argumento (<code>$2<\/code>), que es el nombre del sitio. Si no se proporciona un comando v\u00e1lido, el script muestra por defecto las instrucciones de uso.<\/p>\n<p>Ahora puedes activar una copia de seguridad manual para un sitio concreto ejecutando el comando<\/p>\n<pre><code class=\"language-bash\">.\/script.sh backup<\/code><\/pre>\n<h2>Caso de uso avanzado 2: Actualizar plugins en varios sitios<\/h2>\n<p>Gestionar los plugins de WordPress en varios sitios puede ser tedioso, sobre todo cuando hay actualizaciones disponibles. Kinsta hace un gran trabajo gestionando esto a trav\u00e9s del panel de control MyKinsta, mediante la funcionalidad de acciones en lote que introdujimos el a\u00f1o pasado.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2025\/01\/manage-plugins-mykinsta.png\" alt><\/p>\n<p>Pero si no te gusta trabajar con interfaces de usuario, la API de Kinsta te ofrece otra oportunidad de crear un script shell para automatizar el proceso de identificar plugins obsoletos y actualizarlos en m\u00faltiples sitios o entornos espec\u00edficos.<\/p>\n<h3>Desglosando el flujo de trabajo<\/h3>\n<p>1. <strong>Identifica los sitios con plugins obsoletos:<\/strong> El script itera a trav\u00e9s de todos los sitios y entornos, buscando el plugin especificado con una actualizaci\u00f3n disponible. El <a href=\"https:\/\/api-docs.kinqsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/getPlugins\" target=\"_blank\" rel=\"noopener noreferrer\">siguiente endpoint<\/a> se utiliza para obtener la lista de plugins de un entorno de sitio espec\u00edfico:<\/p>\n<pre><code class=\"language-bash\">GET \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>A partir de la respuesta, filtramos los plugins donde <code>\"update\": \"available\"<\/code>.<\/p>\n<p>2. <strong>Pregunta al usuario las opciones de actualizaci\u00f3n:<\/strong> Muestra los sitios y entornos con el plugin desactualizado, permitiendo al usuario seleccionar instancias espec\u00edficas o actualizarlas todas.<\/p>\n<p>3. <strong>Activa la actualizaci\u00f3n del plugin:<\/strong> Para actualizar el plugin en un entorno espec\u00edfico, el script utiliza <a href=\"https:\/\/api-docs.kinqsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">este endpoint<\/a>:<\/p>\n<pre><code class=\"language-bash\">PUT \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>El nombre del plugin y su versi\u00f3n actualizada se pasan en el cuerpo de la petici\u00f3n.<\/p>\n<h3>El script<\/h3>\n<p>Como el script es largo, la funci\u00f3n completa est\u00e1 <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">alojada en GitHub<\/a> para facilitar el acceso. Aqu\u00ed explicaremos la l\u00f3gica central utilizada para identificar los plugins obsoletos en m\u00faltiples sitios y entornos.<\/p>\n<p>El script comienza aceptando el nombre del plugin desde el comando. Este nombre especifica el plugin que quieres actualizar.<\/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>A continuaci\u00f3n, el script utiliza la funci\u00f3n reutilizable <code>get_sites_list<\/code> (explicada anteriormente) para obtener todos los sitios de la empresa:<\/p>\n<pre><code class=\"language-bash\">echo \"Fetching all sites in the company...\"\n\n# Fetch all sites in the company\nSITES_RESPONSE=$(get_sites_list)\nif [ $? -ne 0 ]; then\n  echo \"Error: Failed to fetch sites.\"\n  return 1\nfi\n\n# Clean the response\nCLEAN_SITES_RESPONSE=$(echo \"$SITES_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>A continuaci\u00f3n viene la parte central del script: recorrer la lista de sitios para comprobar si hay plugins obsoletos. El <code>CLEAN_SITES_RESPONSE<\/code>, que es un objeto JSON que contiene todos los sitios, se pasa a un bucle while para realizar las operaciones de cada sitio uno por uno.<\/p>\n<p>Comienza extrayendo algunos datos importantes como el ID del sitio, el nombre y el nombre para mostrar en variables:<\/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>A continuaci\u00f3n, se utiliza el nombre del sitio junto con la funci\u00f3n <code>get_site_details_by_name<\/code> definida anteriormente para obtener informaci\u00f3n detallada sobre el sitio, incluidos todos sus entornos.<\/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>A continuaci\u00f3n, se realiza un bucle sobre los entornos para extraer detalles de cada uno de ellos, como el ID, el nombre y el nombre para mostrar:<\/p>\n<pre><code class=\"language-bash\">while IFS= read -r ENV; do\n  ENV_ID=$(echo \"$ENV\" | cut -d: -f1)\n  ENV_NAME=$(echo \"$ENV\" | cut -d: -f2)\n  ENV_DISPLAY_NAME=$(echo \"$ENV\" | cut -d: -f3)\n\n  echo \"Checking plugins for environment \"$ENV_DISPLAY_NAME\"...\"<\/code><\/pre>\n<p>Para cada entorno, el script obtiene ahora su lista de plugins utilizando la API de 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>A continuaci\u00f3n, el script comprueba si el plugin especificado existe en el entorno y tiene una actualizaci\u00f3n disponible:<\/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>Si se encuentra un plugin desactualizado, el script registra sus detalles y los a\u00f1ade al 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>Este es el aspecto que tendr\u00edan los detalles registrados de los plugins obsoletos:<\/p>\n<pre><code class=\"language-bash\">Outdated plugin \"example-plugin\" found in \"Site ABC\" (Environment: Production)\n  Current Version: 1.0.0\n  Update Version: 1.2.0\nOutdated plugin \"example-plugin\" found in \"Site XYZ\" (Environment: Staging)\n  Current Version: 1.3.0\n  Update Version: 1.4.0<\/code><\/pre>\n<p>A partir de aqu\u00ed, realizamos actualizaciones de plugins para cada plugin utilizando <a href=\"https:\/\/api-docs.kinqsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">su endpoint<\/a>. El script completo est\u00e1 en este <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">repositorio de GitHub<\/a>.<\/p>\n<h2>Resumen<\/h2>\n<p>Este art\u00edculo te ha guiado en la creaci\u00f3n de un script de shell para interactuar con la API de Kinsta.<\/p>\n<p>T\u00f3mate un tiempo para explorar m\u00e1s a fondo la <a href=\"https:\/\/api-docs.kinqsta.com\/?_gl=1*1t8zaxo*_gcl_au*MTM1MTcyMzgyOS4xNzMzNDc0Mjky*_ga*MjY2MTczNDMzLjE3MjU2MTE5ODM.*_ga_R8LLNPRZTN*MTc0MDcyMzEzNi4xMTkuMS4xNzQwNzMzNTQ0LjYwLjAuMA..\">API de Kinsta<\/a> \u2014 descubrir\u00e1s funcionalidades adicionales que puedes automatizar para gestionar tareas adaptadas a tus necesidades espec\u00edficas. Puedes plantearte integrar la API con otras APIs para mejorar la toma de decisiones y la eficacia.<\/p>\n<p>Por \u00faltimo, consulta regularmente el <a href=\"https:\/\/kinqsta.com\/es\/mykinsta\/\">panel de control de MyKinsta<\/a> para conocer las nuevas funcionalidades dise\u00f1adas para que la gesti\u00f3n del sitio web sea a\u00fan m\u00e1s sencilla gracias a su intuitiva interfaz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si administras muchos sitios de WordPress, probablemente siempre est\u00e9s buscando formas de simplificar y acelerar tus flujos de trabajo. Ahora, imagina esto: con un solo comando &#8230;<\/p>\n","protected":false},"author":287,"featured_media":78396,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1270],"class_list":["post-78395","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>Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta<\/title>\n<meta name=\"description\" content=\"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta\" \/>\n<meta property=\"og:description\" content=\"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-03T14:00:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-03T15:00:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/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=\"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/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_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta\",\"datePublished\":\"2025-03-03T14:00:27+00:00\",\"dateModified\":\"2025-03-03T15:00:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\"},\"wordCount\":2696,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\",\"url\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\",\"name\":\"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"datePublished\":\"2025-03-03T14:00:27+00:00\",\"dateModified\":\"2025-03-03T15:00:45+00:00\",\"description\":\"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinqsta.com\/es\/secciones\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/es\/#website\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"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:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/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:\/\/kinqsta.com\/es\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta","description":"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.","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:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/","og_locale":"es_ES","og_type":"article","og_title":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta","og_description":"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.","og_url":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2025-03-03T14:00:27+00:00","article_modified_time":"2025-03-03T15:00:45+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/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":"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.","twitter_image":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Joel Olawanle","Tiempo de lectura":"21 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta","datePublished":"2025-03-03T14:00:27+00:00","dateModified":"2025-03-03T15:00:45+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/"},"wordCount":2696,"publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/","url":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/","name":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","datePublished":"2025-03-03T14:00:27+00:00","dateModified":"2025-03-03T15:00:45+00:00","description":"Gestiona eficazmente tus sitios de WordPress utilizando scripts de shell y la API de Kinsta para una automatizaci\u00f3n y un rendimiento optimizados.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#primaryimage","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/es\/blog\/shell-scripts-y-api-kinsta\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinqsta.com\/es\/secciones\/api\/"},{"@type":"ListItem","position":3,"name":"Gesti\u00f3n de sitios de WordPress con shell scripts y la API de Kinsta"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/es\/#website","url":"https:\/\/kinqsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","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:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/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:\/\/kinqsta.com\/es\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/78395","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/comments?post=78395"}],"version-history":[{"count":10,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/78395\/revisions"}],"predecessor-version":[{"id":78421,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/78395\/revisions\/78421"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/translations\/es"},{"href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/78395\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media\/78396"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media?parent=78395"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/tags?post=78395"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/topic?post=78395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}