[{"id":1677,"date":"2026-04-10T08:08:18","date_gmt":"2026-04-10T08:08:18","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1677"},"modified":"2026-04-10T08:21:11","modified_gmt":"2026-04-10T08:21:11","slug":"accion-rapida-csv-a-xls-en-macos","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2026\/04\/10\/accion-rapida-csv-a-xls-en-macos\/","title":{"rendered":"Acci\u00f3n r\u00e1pida CSV a XLS en macOS"},"content":{"rendered":"\n<p>Convierte r\u00e1pidamente archivos CSV a formato XLS (Excel 97-2003) desde el men\u00fa contextual del Finder en macOS usando LibreOffice. Automatiza el proceso con una Acci\u00f3n r\u00e1pida que funciona tanto para archivos individuales como carpetas completas.<\/p>\n\n\n\n<p>Pasos a seguir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Abrimos Automator con Cmd + Espacio<\/li>\n\n\n\n<li>Pulsamos en Nuevo documento, tipo Acci\u00f3n r\u00e1pida<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image.png\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1024x478.png\" alt=\"\" class=\"wp-image-1668\" style=\"width:343px;height:auto\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1024x478.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-300x140.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-768x359.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image.png 1032w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La configuramos de la siguiente forma. Flujo: archivos o carpetas, En: Finder, A\u00f1adir acci\u00f3n: Ejecutar script de shell, Shell: bin\/bash, Pasar datos: como argumentos<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1.png\"><img decoding=\"async\" width=\"1024\" height=\"248\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-1024x248.png\" alt=\"\" class=\"wp-image-1669\" style=\"width:554px;height:auto\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-1024x248.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-300x73.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-768x186.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1.png 1322w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00f1adimos este c\u00f3digo en el apartado script, luego pulsamos en Archivo, Guardar, lo nombramos &#8216;CSV a XLS&#8217; y listo.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>for f in \"$@\"\ndo\n  if &#091; -d \"$f\" ]; then\n    find \"$f\" -type f -name \"*.csv\" -print0 | while IFS= read -r -d '' file; do\n      \/Applications\/LibreOffice.app\/Contents\/MacOS\/soffice \\\n      --headless --convert-to xls:\"MS Excel 97\" \"$file\" \\\n      --outdir \"$(dirname \"$file\")\"\n    done\n  else\n    \/Applications\/LibreOffice.app\/Contents\/MacOS\/soffice \\\n    --headless --convert-to xls:\"MS Excel 97\" \"$f\" \\\n    --outdir \"$(dirname \"$f\")\"\n  fi\ndone<\/code><\/pre>\n\n\n\n<p>Con esto ya tenemos funcionando nuestro men\u00fa contextual<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Convierte r\u00e1pidamente archivos CSV a formato XLS (Excel 97-2003) desde el men\u00fa contextual del Finder en macOS usando LibreOffice. Automatiza el proceso con una Acci\u00f3n r\u00e1pida que funciona tanto para archivos individuales como carpetas completas. Pasos a seguir: Con esto ya tenemos funcionando nuestro men\u00fa contextual<\/p>\n","protected":false},"author":15,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1677","post","type-post","status-publish","format-standard","hentry","category-general"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Jose Antonio Tejada","author_link":"https:\/\/developer.si2soluciones.es\/author\/jatejada\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1677"}],"version-history":[{"count":3,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1677\/revisions"}],"predecessor-version":[{"id":1680,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1677\/revisions\/1680"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1677"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1667,"date":"2026-04-09T09:38:27","date_gmt":"2026-04-09T09:38:27","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1667"},"modified":"2026-04-09T09:51:13","modified_gmt":"2026-04-09T09:51:13","slug":"comprimir-sin-ocultos-en-macos","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2026\/04\/09\/comprimir-sin-ocultos-en-macos\/","title":{"rendered":"Comprimir sin ocultos en macOS"},"content":{"rendered":"\n<p>Durante los despliegues en entornos de desarrollo o producci\u00f3n, es com\u00fan que al generar archivos ZIP de carpetas en macOS se incluyan autom\u00e1ticamente archivos y directorios ocultos (<code>.git<\/code>, <code>.DS_Store<\/code>, etc.), lo que puede causar problemas de consistencia o aumentar innecesariamente el tama\u00f1o del paquete. Para evitar esto, se puede implementar una acci\u00f3n de compresi\u00f3n personalizada en el men\u00fa contextual del Finder que excluya selectivamente estos elementos.<\/p>\n\n\n\n<p>Pasos a seguir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Abrimos Automator con Cmd + Espacio<\/li>\n\n\n\n<li>Pulsamos en Nuevo documento, tipo Acci\u00f3n r\u00e1pida<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image.png\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1024x478.png\" alt=\"\" class=\"wp-image-1668\" style=\"width:343px;height:auto\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1024x478.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-300x140.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-768x359.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image.png 1032w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La configuramos de la siguiente forma. Flujo: archivos o carpetas, En: Finder, A\u00f1adir acci\u00f3n: Ejecutar script de shell, Shell: bin\/bash, Pasar datos: como argumentos<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1.png\"><img decoding=\"async\" width=\"1024\" height=\"248\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-1024x248.png\" alt=\"\" class=\"wp-image-1669\" style=\"width:554px;height:auto\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-1024x248.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-300x73.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1-768x186.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-1.png 1322w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00f1adimos este c\u00f3digo en el apartado script, luego pulsamos en Archivo, Guardar, lo nombramos &#8216;Comprimir sin ocultos&#8217; y listo.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>for item in \"$@\"; do\n  dir=\"$(dirname \"$item\")\"\n  base=\"$(basename \"$item\")\"\n  zipfile=\"${dir}\/${base}.zip\"\n\n  cd \"$dir\" || exit 1\n\n  \/usr\/bin\/zip -r \"$zipfile\" \"$base\" \\\n    -x \\\n      \"*\/.DS_Store\" \\\n      \"*\/__MACOSX\/*\" \\\n      \"*\/.git\/*\" \\\n      \"*\/.svn\/*\" \\\n      \"*\/.hg\/*\" \\\n      \"*\/node_modules\/*\" \\\n      \"*\/.vscode\/*\" \\\n      \"*\/codesniffer.ruleset.xml\" \\\n      \"*\/phpcs.xml\" \\\n      \"*\/phpunit.xml.dist\" \\\n      \"*\/composer.json\" \\\n      \"*\/package.json\" \\\n      \"*\/package-lock.json\" \\\n      \"*webpack*\" \\\n      \"*\/config*.yml\" \\\n      \"*gulpfile*\" \\\n      \"*\/yarn.lock\" \\\n      \"*\/composer.lock\" \\\n      \"*\/gulpconfig.json\" \\\n      \"*.log\" \\\n      \"*\/CHANGELOG.md\" \\\n      \"*\/Thumbs.db\" \\\n      \"*\/desktop.ini\" \\\n      \"*\/ehthumbs.db\" \\\n      \"*~\" \\\n      \"*.bak\"\ndone<\/code><\/pre>\n\n\n\n<p>Con esto ya tenemos funcionando nuestro men\u00fa contextual<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2.png\"><img decoding=\"async\" width=\"1024\" height=\"912\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2-1024x912.png\" alt=\"\" class=\"wp-image-1670\" style=\"width:372px;height:auto\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2-1024x912.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2-300x267.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2-768x684.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2026\/04\/image-2.png 1026w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durante los despliegues en entornos de desarrollo o producci\u00f3n, es com\u00fan que al generar archivos ZIP de carpetas en macOS se incluyan autom\u00e1ticamente archivos y directorios ocultos (.git, .DS_Store, etc.), lo que puede causar problemas de consistencia o aumentar innecesariamente el tama\u00f1o del paquete. Para evitar esto, se puede implementar una acci\u00f3n de compresi\u00f3n personalizada [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1667","post","type-post","status-publish","format-standard","hentry","category-general"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Jose Antonio Tejada","author_link":"https:\/\/developer.si2soluciones.es\/author\/jatejada\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1667"}],"version-history":[{"count":5,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1667\/revisions"}],"predecessor-version":[{"id":1676,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1667\/revisions\/1676"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1410,"date":"2025-02-12T19:34:51","date_gmt":"2025-02-12T19:34:51","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1410"},"modified":"2025-02-12T19:34:51","modified_gmt":"2025-02-12T19:34:51","slug":"gotmls-anti-malware","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2025\/02\/12\/gotmls-anti-malware\/","title":{"rendered":"GOTMLS Anti-Malware"},"content":{"rendered":"\n<p>GOTMLS Anti-Malware Security and Brute-Force Firewall es un plugin gratuito para WordPress dise\u00f1ado para ayudar a los administradores a detectar y eliminar malware, scripts maliciosos, inyecciones en la base de datos y vulnerabilidades en temas o plugins. Adem\u00e1s, protege contra ataques de fuerza bruta en el \u00e1rea de wp\u2011login y bloquea intentos de explotaci\u00f3n de vulnerabilidades conocidas, como las de Revolution Slider.<\/p>\n\n\n\n<p>La ventaja principal de GOTMLS es que permite, mediante una donaci\u00f3n \u00fanica (alrededor de 29\u202f$ por sitio), desbloquear funciones premium como la descarga autom\u00e1tica de definiciones actualizadas de amenazas y parches espec\u00edficos, lo que lo hace una opci\u00f3n econ\u00f3mica y eficaz para sitios peque\u00f1os o medianos.<\/p>\n\n\n\n<p>Para m\u00e1s detalles y para descargar el plugin, puedes consultar su repositorio oficial en WordPress:<br><a href=\"https:\/\/es.wordpress.org\/plugins\/gotmls\/\">Anti-Malware Security and Brute-Force Firewall \u2013 WP.org<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GOTMLS Anti-Malware Security and Brute-Force Firewall es un plugin gratuito para WordPress dise\u00f1ado para ayudar a los administradores a detectar y eliminar malware, scripts maliciosos, inyecciones en la base de datos y vulnerabilidades en temas o plugins. Adem\u00e1s, protege contra ataques de fuerza bruta en el \u00e1rea de wp\u2011login y bloquea intentos de explotaci\u00f3n de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1411,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general"],"featured_image_src":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2025\/02\/05e8a418-9ca8-449b-a8ec-3b5a037f8e96-600x400.webp","featured_image_src_square":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2025\/02\/05e8a418-9ca8-449b-a8ec-3b5a037f8e96-600x600.webp","author_info":{"display_name":"\u00c1ngel Moreno","author_link":"https:\/\/developer.si2soluciones.es\/author\/admin\/"},"jetpack_featured_media_url":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2025\/02\/05e8a418-9ca8-449b-a8ec-3b5a037f8e96.webp","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1410"}],"version-history":[{"count":1,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1410\/revisions"}],"predecessor-version":[{"id":1412,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1410\/revisions\/1412"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media\/1411"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1393,"date":"2024-09-13T10:16:20","date_gmt":"2024-09-13T10:16:20","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1393"},"modified":"2024-09-13T10:18:45","modified_gmt":"2024-09-13T10:18:45","slug":"detectar-resize-de-un-elemento","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2024\/09\/13\/detectar-resize-de-un-elemento\/","title":{"rendered":"Detectar resize de un elemento"},"content":{"rendered":"\n<p>Caso de ejemplo, un widget dentro de otro widget de tipo tab. Al inicializarse, el tama\u00f1o del widget interno es 0, por lo que algunos scripts que afecten a los desplazamientos de posicionamiento no funcionar\u00edan correctamente. Para detectar y poder interactuar en casos en los que no tengamos un evento definido podemos utilizar lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ObservadorDeRedimension {\n  constructor() {\n    this.resizeObserver = new ResizeObserver(entries =&gt; {\n      for (let entry of entries) {\n        console.log(`El tama\u00f1o ha cambiado: Ancho = ${entry.contentRect.width}, Alto = ${entry.contentRect.height}`);\n      }\n    });\n  }\n\n  observarElemento(elemento) {\n    if (elemento) {\n      this.resizeObserver.observe(elemento);\n      console.log('Observando el redimensionamiento del elemento');\n    } else {\n      console.error('Elemento no v\u00e1lido');\n    }\n  }\n\n  dejarDeObservar(elemento) {\n    if (elemento) {\n      this.resizeObserver.unobserve(elemento);\n      console.log('Se ha dejado de observar el redimensionamiento del elemento');\n    } else {\n      console.error('Elemento no v\u00e1lido');\n    }\n  }\n}\n\n\/\/ Uso de la clase\nconst observador = new ObservadorDeRedimension();\nconst div = document.querySelector('#miDiv');\n\n\/\/ Iniciar observaci\u00f3n\nobservador.observarElemento(div);\n\n\/\/ Para detener la observaci\u00f3n (cuando sea necesario)\n\/\/ observador.dejarDeObservar(div);<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Caso de ejemplo, un widget dentro de otro widget de tipo tab. Al inicializarse, el tama\u00f1o del widget interno es 0, por lo que algunos scripts que afecten a los desplazamientos de posicionamiento no funcionar\u00edan correctamente. Para detectar y poder interactuar en casos en los que no tengamos un evento definido podemos utilizar lo siguiente:<\/p>\n","protected":false},"author":15,"featured_media":1395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[234,8,13],"class_list":["post-1393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general","tag-elementor","tag-javascript","tag-wordpress-2"],"featured_image_src":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2024\/09\/detectar-resize.png","featured_image_src_square":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2024\/09\/detectar-resize.png","author_info":{"display_name":"Jose Antonio Tejada","author_link":"https:\/\/developer.si2soluciones.es\/author\/jatejada\/"},"jetpack_featured_media_url":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2024\/09\/detectar-resize.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1393"}],"version-history":[{"count":2,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1393\/revisions"}],"predecessor-version":[{"id":1396,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1393\/revisions\/1396"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media\/1395"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1386,"date":"2023-11-13T10:54:15","date_gmt":"2023-11-13T10:54:15","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1386"},"modified":"2023-11-13T10:56:47","modified_gmt":"2023-11-13T10:56:47","slug":"ejecutar-accion-recurrente-en-react-js-react-native","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2023\/11\/13\/ejecutar-accion-recurrente-en-react-js-react-native\/","title":{"rendered":"Ejecutar acci\u00f3n recurrente en React JS \/ React Native"},"content":{"rendered":"\n<p>A veces es necesario tener una acci\u00f3n en background que est\u00e9 realizando alguna funcionalidad recurrente con un intervalo de tiempo definido, como podr\u00eda ser sincronizar informaci\u00f3n v\u00eda Rest API.<br><\/p>\n\n\n\n<p>Para ello se puede incluir una llamada a setInterval() dentro del hook useEffects() de cualquier componente funcional, como por ejemplo los Navigators de React Native, para que se ejecute cada X segundos.<\/p>\n\n\n\n<p>Para cortar la ejecuci\u00f3n del intervalo al eliminar el componente, se retorna una funci\u00f3n dentro del useEffect() que contenta el clearInterval(), como ilustra la siguiente figura:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"989\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-1024x989.png\" alt=\"\" class=\"wp-image-1389\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-1024x989.png 1024w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-300x290.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-768x742.png 768w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1.png 1164w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption><em>Imagen que ilustra visualmente el c\u00f3digo que se muestra a continuaci\u00f3n.<\/em><\/figcaption><\/figure>\n\n\n\n<p>C\u00f3digo de ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import myRecurringAction from 'actions';\n\n\/**\n * Componente funcional que ejecuta una acci\u00f3n cada  \n * 60 segundos\n *\/\nconst MyComponent = function(){\n \n  useEffect( () =&gt;{\n\t  \/\/ Crear intervalo de ejecuci\u00f3n\n      const interval = setInterval(()=&gt;{\n       myRecurringAction();\n      }, 60 * 1000 );\n\t  \/\/ Retornar funci\u00f3n para limpiar el intervalo\n      return () =&gt; clearInterval(interval);\n  }, &#091;] );\n  \n  \/\/ Render\n  return (...);\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A veces es necesario tener una acci\u00f3n en background que est\u00e9 realizando alguna funcionalidad recurrente con un intervalo de tiempo definido, como podr\u00eda ser sincronizar informaci\u00f3n v\u00eda Rest API. Para ello se puede incluir una llamada a setInterval() dentro del hook useEffects() de cualquier componente funcional, como por ejemplo los Navigators de React Native, para [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":1389,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[290,273],"tags":[],"class_list":["post-1386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile","category-react-native"],"featured_image_src":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-600x400.png","featured_image_src_square":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1-600x600.png","author_info":{"display_name":"Guillermo Garc\u00eda","author_link":"https:\/\/developer.si2soluciones.es\/author\/ggarcia\/"},"jetpack_featured_media_url":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2023\/11\/carbon-1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1386"}],"version-history":[{"count":3,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1386\/revisions"}],"predecessor-version":[{"id":1391,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1386\/revisions\/1391"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media\/1389"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1375,"date":"2023-02-02T12:25:06","date_gmt":"2023-02-02T12:25:06","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1375"},"modified":"2023-02-02T12:25:06","modified_gmt":"2023-02-02T12:25:06","slug":"algunos-comandos-linux","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2023\/02\/02\/algunos-comandos-linux\/","title":{"rendered":"Algunos comandos linux"},"content":{"rendered":"\n<p>\u00datiles para diversas situaciones, como inyecciones de c\u00f3digo y esas cosas:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Busca un texto en el contenido de ficheros:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>grep -Ril \"texto\" *<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00datiles para diversas situaciones, como inyecciones de c\u00f3digo y esas cosas: Busca un texto en el contenido de ficheros:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1375","post","type-post","status-publish","format-standard","hentry","category-general"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"\u00c1ngel Moreno","author_link":"https:\/\/developer.si2soluciones.es\/author\/admin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1375"}],"version-history":[{"count":2,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1375\/revisions"}],"predecessor-version":[{"id":1377,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1375\/revisions\/1377"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1368,"date":"2022-08-03T08:22:11","date_gmt":"2022-08-03T08:22:11","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1368"},"modified":"2022-08-03T09:13:07","modified_gmt":"2022-08-03T09:13:07","slug":"mobile-design-ui-patterns-guides","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2022\/08\/03\/mobile-design-ui-patterns-guides\/","title":{"rendered":"Mobile design UI pattern libraries &#038; guides"},"content":{"rendered":"\n<p>Recap of mobile design resources:<br><a href=\"https:\/\/learnmobile.design\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/learnmobile.design\/<\/a><br><\/p>\n\n\n\n<p>Mobile design patterns libraries:<br><a href=\"https:\/\/mobbin.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/mobbin.com\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.uisources.com\/home\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.uisources.com\/home<\/a><\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/www.pttrns.com\/\" data-type=\"URL\" data-id=\"https:\/\/www.pttrns.com\/\" target=\"_blank\">Pttrns.com<\/a> (paid service with 3-days-free-trial)<\/p>\n\n\n\n<p>iOS icon gallery: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.iosicongallery.com\/\" target=\"_blank\">https:\/\/www.iosicongallery.com\/<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>More patterns recopilations:<\/p>\n\n\n\n<p><a href=\"https:\/\/uxarchive.com\/\">https:\/\/uxarchive.com\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/uxarchive.com\/\">https:\/\/uxarchive.com\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recap of mobile design resources:https:\/\/learnmobile.design\/ Mobile design patterns libraries:https:\/\/mobbin.com\/ https:\/\/www.uisources.com\/home Pttrns.com (paid service with 3-days-free-trial) iOS icon gallery: https:\/\/www.iosicongallery.com\/ More patterns recopilations: https:\/\/uxarchive.com\/ https:\/\/uxarchive.com\/<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[290,41],"tags":[142,321,320,141],"class_list":["post-1368","post","type-post","status-publish","format-standard","hentry","category-mobile","category-ux","tag-design","tag-guidelines","tag-patterns","tag-ui"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Daniel Jim\u00e9nez","author_link":"https:\/\/developer.si2soluciones.es\/author\/djimenez\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1368"}],"version-history":[{"count":5,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1368\/revisions"}],"predecessor-version":[{"id":1373,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1368\/revisions\/1373"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1366,"date":"2022-08-03T07:46:22","date_gmt":"2022-08-03T07:46:22","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1366"},"modified":"2022-08-03T07:46:22","modified_gmt":"2022-08-03T07:46:22","slug":"npm-trends-html-css-frameworks","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2022\/08\/03\/npm-trends-html-css-frameworks\/","title":{"rendered":"NPM trends HTML CSS frameworks"},"content":{"rendered":"\n<p><a href=\"https:\/\/npmtrends.com\/bootstrap-vs-bulma-vs-foundation-sites-vs-semantic-ui-vs-tailwindcss-vs-uikit\">https:\/\/npmtrends.com\/bootstrap-vs-bulma-vs-foundation-sites-vs-semantic-ui-vs-tailwindcss-vs-uikit<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/npmtrends.com\/bootstrap-vs-bulma-vs-foundation-sites-vs-semantic-ui-vs-tailwindcss-vs-uikit<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[318],"tags":[22,240,25,319],"class_list":["post-1366","post","type-post","status-publish","format-standard","hentry","category-bookmark","tag-css","tag-frameworks","tag-html","tag-npmtrends"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Daniel Jim\u00e9nez","author_link":"https:\/\/developer.si2soluciones.es\/author\/djimenez\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1366"}],"version-history":[{"count":1,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1366\/revisions"}],"predecessor-version":[{"id":1367,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1366\/revisions\/1367"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1360,"date":"2022-07-19T08:11:09","date_gmt":"2022-07-19T08:11:09","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1360"},"modified":"2022-07-19T10:40:44","modified_gmt":"2022-07-19T10:40:44","slug":"leaflet-providers","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2022\/07\/19\/leaflet-providers\/","title":{"rendered":"Leaflet providers"},"content":{"rendered":"\n<p>Leaflet es una biblioteca de mapas ligera y f\u00e1cil de usar. <\/p>\n\n\n\n<p>Los estilos en <a href=\"https:\/\/leafletjs.com\/\">Leaflet<\/a> se establecen a traves de \u00abtiles\u00bb que van por encima de la geolocalizaci\u00f3n del mapa.<\/p>\n\n\n\n<p>Estos pueden establecerse a trav\u00e9s de <a href=\"https:\/\/leaflet-extras.github.io\/leaflet-providers\/preview\/\">proveedores externos<\/a> o con los <a href=\"https:\/\/github.com\/leaflet-extras\/leaflet-providers\">builts-in<\/a> del propio Leaflet.<\/p>\n\n\n\n<p>La empresa <a href=\"http:\/\/maps.stamen.com\/\">stamen<\/a> lo explica y lo hace bastante bien ofreciendo varios mapas cc by 3.0.<\/p>\n\n\n\n<p>Enlaces:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/leaflet-extras\/leaflet-providers\">Leaflet providers<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/leaflet-extras.github.io\/leaflet-providers\/preview\/\">Leaflet external providers and attributions base list<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/maps.stamen.com\/#watercolor\/12\/37.7706\/-122.3782\">Stamen.com maps<\/a><\/p>\n\n\n\n<p>Para aprender m\u00e1s sobre <a href=\"https:\/\/mappinggis.com\/2017\/12\/como-utilizar-vector-tiles-en-leaflet\/\">vector tiles<\/a> en lugar de raster:<br><a href=\"https:\/\/mappinggis.com\/2017\/12\/como-utilizar-vector-tiles-en-leaflet\/\">https:\/\/mappinggis.com\/2017\/12\/como-utilizar-vector-tiles-en-leaflet\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/smallmultiples.com.au\/articles\/building-large-maps-with-a-node.js-tile-server\/\">https:\/\/smallmultiples.com.au\/articles\/building-large-maps-with-a-node.js-tile-server\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Leaflet es una biblioteca de mapas ligera y f\u00e1cil de usar. Los estilos en Leaflet se establecen a traves de \u00abtiles\u00bb que van por encima de la geolocalizaci\u00f3n del mapa. Estos pueden establecerse a trav\u00e9s de proveedores externos o con los builts-in del propio Leaflet. La empresa stamen lo explica y lo hace bastante bien [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1361,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[317,232],"class_list":["post-1360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general","tag-leaflet","tag-maps"],"featured_image_src":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/Captura-de-pantalla-2022-07-19-a-las-10.02.41-600x400.png","featured_image_src_square":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/Captura-de-pantalla-2022-07-19-a-las-10.02.41-600x544.png","author_info":{"display_name":"Daniel Jim\u00e9nez","author_link":"https:\/\/developer.si2soluciones.es\/author\/djimenez\/"},"jetpack_featured_media_url":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/Captura-de-pantalla-2022-07-19-a-las-10.02.41.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1360"}],"version-history":[{"count":3,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1360\/revisions"}],"predecessor-version":[{"id":1364,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1360\/revisions\/1364"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media\/1361"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":1353,"date":"2022-07-18T10:26:35","date_gmt":"2022-07-18T10:26:35","guid":{"rendered":"https:\/\/developer.si2soluciones.es\/?p=1353"},"modified":"2022-07-18T10:26:35","modified_gmt":"2022-07-18T10:26:35","slug":"post-geolocalizados-con-elementor-leaflet-maps-y-clustering","status":"publish","type":"post","link":"https:\/\/developer.si2soluciones.es\/2022\/07\/18\/post-geolocalizados-con-elementor-leaflet-maps-y-clustering\/","title":{"rendered":"Post geolocalizados con Elementor, Leaflet Maps y Clustering"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-esteban-romero-frias wp-block-embed-esteban-romero-frias\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"X8dDVwBngS\"><a href=\"https:\/\/estebanromero.com\/mapa\/\">Mapa<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u00abMapa\u00bb \u2014 Esteban Romero Fr\u00edas\" src=\"https:\/\/estebanromero.com\/mapa\/embed\/#?secret=87TeH080NF#?secret=X8dDVwBngS\" data-secret=\"X8dDVwBngS\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption>Mapa que muestra proyectos geolizalizados<\/figcaption><\/figure>\n\n\n\n<p>Para construir un mapa con leaflet con clustering y elementor como el que hay en el enlace superior<\/p>\n\n\n\n<p>Necesitamos:<\/p>\n\n\n\n<p>Elementor<\/p>\n\n\n\n<p>Elementor Custom Skin<\/p>\n\n\n\n<p>Instalar <a rel=\"noreferrer noopener\" href=\"https:\/\/wordpress.org\/plugins\/leaflet-map\/\" data-type=\"URL\" data-id=\"https:\/\/wordpress.org\/plugins\/leaflet-map\/\" target=\"_blank\">Leaflet Map<\/a><\/p>\n\n\n\n<p>Instalar <a href=\"https:\/\/wordpress.org\/plugins\/extensions-leaflet-map\/\" data-type=\"URL\" data-id=\"https:\/\/wordpress.org\/plugins\/extensions-leaflet-map\/\">Extensions for Leaflet Map<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"361\" height=\"346\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image.png\" alt=\"\" class=\"wp-image-1354\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image.png 361w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-300x288.png 300w\" sizes=\"(max-width: 361px) 100vw, 361px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-1.png\" alt=\"\" class=\"wp-image-1355\" width=\"363\" height=\"410\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-1.png 322w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-1-265x300.png 265w\" sizes=\"(max-width: 363px) 100vw, 363px\" \/><\/a><\/figure>\n\n\n\n<p>Obtenemos la latitud y longitud guardada en sendos campos personalizados. Previamente los hemos guardado con la ayuda del <a href=\"https:\/\/wordpress.org\/plugins\/meta-box\/\" target=\"_blank\" rel=\"noreferrer noopener\">Plugin Meta Box<\/a><\/p>\n\n\n\n<p>Este es el c\u00f3digo de nuestro shortcode <strong>[project_marker]<\/strong> que en realidad utiliza el shortcode <\/p>\n\n\n\n<p><code><strong>[leaflet-map lat=\"44.67\"<code> lng=\"-63.61\"]<\/code><\/strong><\/code><\/p>\n\n\n\n<p>Sustituyendo los valores num\u00e9ricos del shortcode por los obtenidos de los campos personalizados.<\/p>\n\n\n\n<pre class=\"wp-block-code has-extra-small-font-size\"><code>function get_latlong() {\n\t$post = get_queried_object();\n\t$lat=get_post_meta($post->ID,'lat',true);\n\t$lng=get_post_meta($post->ID,'lng',true);\n\t$title = get_the_title();\n\t$link = get_permalink();\n\t$url = get_post_meta($post->ID,'url_proyecto',true);\n\tif((!empty($lat)||!empty($lng)) &amp;&amp; !empty($url)){\n\t\techo do_shortcode(\"&#91;leaflet-marker lat=\".$lat.\" lng=\".$lng.\"]&lt;strong>\".$title.\"&lt;\/strong>&lt;br\/>\".get_the_excerpt().\"&lt;br\/>\n\t\t\t&lt;a href='\".$url.\"' target='_blank'>Abrir web proyecto&lt;\/a>&#91;\/leaflet-marker]\");\n\t}else if((!empty($lat)||!empty($lng)) &amp;&amp; empty($url)){\n\t\techo do_shortcode(\"&#91;leaflet-marker lat=\".$lat.\" lng=\".$lng.\"]&lt;strong>\".$title.\"&lt;\/strong>&lt;br\/>\".get_the_excerpt().\"&#91;\/leaflet-marker]\");\t\t\t\t\t\t\t\t\t\t\n\t}\n}\t\nadd_shortcode( 'project_marker', 'get_latlong' );<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Estructura final<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"502\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2.png\" alt=\"\" class=\"wp-image-1356\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2.png 770w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2-300x196.png 300w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2-768x501.png 768w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/a><\/figure>\n\n\n\n<p>Primer shortcode usado en la estructura, el que general el mapa: [leaflet-map lat=27.37 lng=14.94 zoom=3 height=\u00bb90vh\u00bb]<\/p>\n\n\n\n<p>Segundo Loop con card personalizada, la que arriba sacaba nuestro shortcode [marker_project]<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"511\" height=\"349\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-3.png\" alt=\"\" class=\"wp-image-1357\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-3.png 511w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-3-300x205.png 300w\" sizes=\"(max-width: 511px) 100vw, 511px\" \/><\/a><\/figure>\n\n\n\n<p>Por \u00faltimo el shortcode de leaflet que hace funcionar el clustering<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"371\" src=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-4.png\" alt=\"\" class=\"wp-image-1358\" srcset=\"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-4.png 441w, https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-4-300x252.png 300w\" sizes=\"(max-width: 441px) 100vw, 441px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Se puede ver en funcionamiento en <strong><a href=\"https:\/\/estebanromero.com\/mapa\/\">estebanromero.com<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para construir un mapa con leaflet con clustering y elementor como el que hay en el enlace superior Necesitamos: Elementor Elementor Custom Skin Instalar Leaflet Map Instalar Extensions for Leaflet Map Obtenemos la latitud y longitud guardada en sendos campos personalizados. Previamente los hemos guardado con la ayuda del Plugin Meta Box Este es el [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1356,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[316,234,315],"class_list":["post-1353","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress","tag-clustering","tag-elementor","tag-leaflet-map"],"featured_image_src":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2-600x400.png","featured_image_src_square":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2-600x502.png","author_info":{"display_name":"Daniel Jim\u00e9nez","author_link":"https:\/\/developer.si2soluciones.es\/author\/djimenez\/"},"jetpack_featured_media_url":"https:\/\/developer.si2soluciones.es\/wp-content\/uploads\/2022\/07\/image-2.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/comments?post=1353"}],"version-history":[{"count":1,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1353\/revisions"}],"predecessor-version":[{"id":1359,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/posts\/1353\/revisions\/1359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media\/1356"}],"wp:attachment":[{"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/media?parent=1353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/categories?post=1353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developer.si2soluciones.es\/wp-json\/wp\/v2\/tags?post=1353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}]