feat: initial ACRIB WordPress deployment

- WordPress 6.9.4 (es_ES) with Kadence theme
- Homepage: Hero, La Asociación, Pilares, Beneficios, Eventos, Miembros, Hazte Miembro, Contacto
- Brand identity: #13294b navy, #a12932 burgundy, #c69c48 gold
- Fonts: Raleway (headings) + Source Sans 3 (body) + Lato (UI)
- Plugins: Kadence Blocks, Polylang, Contact Form 7
- Custom CSS with full brand styling and responsive layout
- HTTPS enforced via wp-config.php proxy detection
This commit is contained in:
Malin
2026-05-19 19:25:59 +02:00
commit f3ff7b7186
6119 changed files with 1984255 additions and 0 deletions

2
wp-content/index.php Normal file
View File

@@ -0,0 +1,2 @@
<?php
// Silence is golden.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"The suggested policy text has been copied to your clipboard.":["El texto sugerido de la pol\u00edtica ha sido copiado a tu portapapeles."],"This user&#8217;s personal data export file was downloaded.":["Se ha descargado el archivo de exportaci\u00f3n de datos personales de este usuario."],"This user&#8217;s personal data export link was sent.":["Se ha enviado el enlace de exportaci\u00f3n de datos personales de este usuario."],"An error occurred while attempting to find and erase personal data.":["Ha ocurrido un error al intentar encontrar y borrar los datos personales."],"Personal data was found for this user but some of the personal data found was not erased.":["Se han encontrado datos personales de este usuario, pero algunos de los datos personales encontrados no se han borrado."],"All of the personal data found for this user was erased.":["Se han borrado todos los datos personales encontrados de este usuario."],"Personal data was found for this user but was not erased.":["Se han encontrado datos personales de este usuario, pero no se han borrado."],"No personal data was found for this user.":["No se han encontrado datos personales de este usuario."],"An error occurred while attempting to export personal data.":["Ha ocurrido un error al intentar exportar los datos personales."],"No personal data export file was generated.":["No se ha generado ning\u00fan archivo de exportaci\u00f3n de datos personales."]}},"comment":{"reference":"wp-admin\/js\/privacy-tools.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Editor tips":["Consejos del editor"],"Disable tips":["Desactivar los consejos"],"Got it":["Entendido"],"See next tip":["Ver el siguiente consejo"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code.":["\u00a1%1$s est\u00e1 obsoleto desde la versi\u00f3n %2$s! Usa %3$s en su lugar. Por favor, plant\u00e9ate escribir un c\u00f3digo m\u00e1s inclusivo."]}},"comment":{"reference":"wp-admin\/js\/password-strength-meter.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"%s applied.":["%s aplicado."],"%s removed.":["%s eliminado."]}},"comment":{"reference":"wp-includes\/js\/dist\/rich-text.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"pattern (singular)\u0004Synced":["Sincronizado"],"Sync this pattern across multiple locations.":["Sincroniza este patr\u00f3n en varias ubicaciones."],"Unsynced pattern created: %s":["Patr\u00f3n no sincronizado creado: %s"],"Synced pattern created: %s":["Patr\u00f3n sincronizado creado: %s"],"Untitled pattern block":["Patr\u00f3n de bloque sin t\u00edtulo"],"My pattern":["Mi patr\u00f3n"],"Create pattern":["Crear patr\u00f3n"],"Manage patterns":["Gestionar patrones"],"Create":["Crear"],"Detach":["Desvincular"],"Cancel":["Cancelar"],"Name":["Nombre"]}},"comment":{"reference":"wp-includes\/js\/dist\/reusable-blocks.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"%1$s Block. Row %2$d":["Bloque %1$s. Fila %2$d"],"Design":["Dise\u00f1o"],"%s Block":["Bloque %s"],"%1$s Block. %2$s":["Bloque %1$s. %2$s"],"%1$s Block. Column %2$d":["Bloque %1$s. Columna %2$d"],"%1$s Block. Column %2$d. %3$s":["Bloque %1$s. Columna %2$d. %3$s"],"%1$s Block. Row %2$d. %3$s":["Bloque %1$s. Fila %2$d. %3$s"],"Reusable blocks":["Bloques reutilizables"],"Embeds":["Incrustados"],"Text":["Texto"],"Widgets":["Widgets"],"Theme":["Temas"],"Media":["Medios"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Could not get a valid response from the server.":["No se pudo obtener una respuesta v\u00e1lida del servidor."],"Unable to connect. Please check your Internet connection.":["No se puede conectar. Revisa tu conexi\u00f3n a Internet."],"Media upload failed. If this is a photo or a large image, please scale it down and try again.":["La subida de medios ha fallado. Si esto es una foto o una imagen grande, por favor, reduce su tama\u00f1o e int\u00e9ntalo de nuevo."],"The response is not a valid JSON response.":["Las respuesta no es una respuesta JSON v\u00e1lida."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Submitted on:":["Enviado el:"],"%1$s %2$s, %3$s at %4$s:%5$s":["%2$s de %1$s de %3$s a las %4$s:%5$s"]}},"comment":{"reference":"wp-admin\/js\/comment.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Selected crop ratio exceeds the boundaries of the image. Try a different ratio.":["La proporci\u00f3n de recorte seleccionada excede los l\u00edmites de la imagen. Pruebe con otra proporci\u00f3n."],"Could not load the preview image.":["No se ha podido cargar la vista previa de la imagen."],"Could not load the preview image. Please reload the page and try again.":["No se puede cargar la vista previa de la imagen. Por favor, recarga la p\u00e1gina e int\u00e9ntalo de nuevo."],"Image updated.":["Imagen actualizada."]}},"comment":{"reference":"wp-admin\/js\/image-edit.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Overrides currently don't support image links. Remove the link first before enabling overrides.":["Las anulaciones actualmente no admiten enlaces de im\u00e1genes. Elimina primero el enlace antes de activar las anulaciones."],"pattern\u0004\"%s\" duplicated.":["\u00ab%s\u00bb duplicado."],"pattern\u0004%s (Copy)":["%s (copia)"],"These blocks are editable using overrides.":["Estos bloques son editables mediante anulaciones."],"This %1$s is editable using the \"%2$s\" override.":["Este %1$s es editable utilizando la anulaci\u00f3n \u00ab%2$s\u00bb."],"Allow changes to this block throughout instances of this pattern.":["Permite cambios en este bloque en todas las instancias de este patr\u00f3n."],"Disable":["Desactivar"],"Are you sure you want to disable overrides? Disabling overrides will revert all applied overrides for this block throughout instances of this pattern.":["\u00bfSeguro que quieres desactivar las modificaciones? Desactivar las modificaciones revertir\u00e1 todas las modificaciones aplicadas a este bloque en todas las instancias de este patr\u00f3n."],"Disable overrides":["Desactivar modificaciones"],"For example, if you are creating a recipe pattern, you use \"Recipe Title\", \"Recipe Description\", etc.":["Por ejemplo, si est\u00e1s creando un patr\u00f3n de recetas, utiliza \u00abT\u00edtulo de la receta\u00bb, \u00abDescripci\u00f3n de la receta\u00bb, etc."],"Overrides are changes you make to a block within a synced pattern instance. Use overrides to customize a synced pattern instance to suit its new context. Name this block to specify an override.":["Las modificaciones son cambios que haces en un bloque dentro de una instancia de patr\u00f3n sincronizada. Utiliza las modificaciones para adaptar una instancia de patr\u00f3n sincronizado a su nuevo contexto. Nombra este bloque para especificar su nueva modificaci\u00f3n."],"Enable overrides":["Activar modificaciones"],"Overrides":["Modificaciones"],"pattern (singular)\u0004Synced":["Sincronizado"],"Pattern category renamed.":["Categor\u00eda de patrones renombrada."],"This category already exists. Please use a different name.":["Esta categor\u00eda ya existe. Por favor, usa un nombre diferente."],"Please enter a new name for this category.":["Por favor, introduce un nombre nuevo para esta categor\u00eda."],"Pattern renamed":["Patr\u00f3n renombrado"],"Sync this pattern across multiple locations.":["Sincroniza este patr\u00f3n en varias ubicaciones."],"Duplicate pattern":["Duplicar patr\u00f3n"],"Block name changed to: \"%s\".":["El nombre del bloque ha cambiado a \u00ab%s\u00bb."],"Unsynced pattern created: %s":["Patr\u00f3n no sincronizado creado: %s"],"Synced pattern created: %s":["Patr\u00f3n sincronizado creado: %s"],"My pattern":["Mi patr\u00f3n"],"Create pattern":["Crear patr\u00f3n"],"An error occurred while renaming the pattern.":["Se ha producido un error al renombrar el patr\u00f3n."],"Manage patterns":["Gestionar patrones"],"Rename":["Renombrar"],"Duplicate":["Duplicar"],"Reset":["Restablecer"],"Detach":["Desvincular"],"Enable":["Activar"],"Add":["A\u00f1adir"],"Cancel":["Cancelar"],"Name":["Nombre"],"Categories":["Categor\u00edas"],"Save":["Guardar"]}},"comment":{"reference":"wp-includes\/js\/dist\/patterns.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Search commands and settings":["Busca comandos y ajustes"],"Command suggestions":["Sugerencias de comandos"],"Command palette":["Paleta de comandos"],"Open the command palette.":["Abrir la paleta de comandos"],"No results found.":["No se han encontrado resultados."]}},"comment":{"reference":"wp-includes\/js\/dist\/commands.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Pattern imported successfully!":["\u00a1Patr\u00f3n importado correctamente!"],"Invalid pattern JSON file":["Archivo JSON de patr\u00f3n no v\u00e1lido"],"button label\u0004Import":["Importar"],"Unknown error":["Error desconocido"],"Invalid JSON file":["Archivo JSON no v\u00e1lido"],"Import from JSON":["Importar de JSON"],"File":["Archivo"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Annotation":["Notas"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Notifications":["Avisos"]}},"comment":{"reference":"wp-includes\/js\/dist\/a11y.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Add non breaking space.":["A\u00f1ade espacios sin salto."],"https:\/\/wordpress.org\/documentation\/article\/wordpress-block-editor\/":["https:\/\/wordpress.org\/documentation\/article\/wordpress-block-editor\/"],"Convert the current paragraph or heading to a heading of level 1 to 6.":["Convierte el p\u00e1rrafo o encabezado actual a un encabezado de nivel 1 a 6."],"Convert the current heading to a paragraph.":["Convierte el encabezado actual en un p\u00e1rrafo."],"Make the selected text inline code.":["Hacer que el texto seleccionado sea c\u00f3digo integrado."],"Strikethrough the selected text.":["Tachar el texto seleccionado."],"Insert a link to a post or page.":["Insertar un enlace a una entrada o p\u00e1gina"],"https:\/\/wordpress.org\/documentation\/article\/block-based-widgets-editor\/":["https:\/\/wordpress.org\/documentation\/article\/block-based-widgets-editor\/"],"New to the block editor?":["\u00bfEres nuevo en el editor de bloques?"],"Get the Classic Widgets plugin.":["Obt\u00e9n el plugin Classic Widgets."],"https:\/\/wordpress.org\/plugins\/classic-widgets\/":["https:\/\/es.wordpress.org\/plugins\/classic-widgets\/"],"Want to stick with the old widgets?":["\u00bfQuieres seguir con los widgets antiguos?"],"You can now add any block to your site\u2019s widget areas. Don\u2019t worry, all of your favorite widgets still work flawlessly.":["Ahora puedes a\u00f1adir cualquier bloque a las \u00e1reas de widgets de tu sitio. No te preocupes, todos tus widgets favoritos siguen funcionando sin problemas."],"Your theme provides different \u201cblock\u201d areas for you to add and edit content.\u00a0Try adding a search bar, social icons, or other types of blocks here and see how they\u2019ll look on your site.":["Tu tema proporciona diferentes \u00e1reas de \u00abbloques\u00bb para que a\u00f1adas y edites el contenido. Prueba a a\u00f1adir aqu\u00ed una barra de b\u00fasqueda, iconos sociales u otros tipos de bloques y mira c\u00f3mo quedar\u00e1n en tu sitio."],"Welcome to block Widgets":["Te damos la bienvenida al bloque de widgets"],"Contain text cursor inside block deactivated":["Contener el cursor de texto dentro del bloque desactivado"],"Contain text cursor inside block activated":["Contener el cursor de texto dentro del bloque activado"],"Close inserter":["Cerrar insertador"],"Aids screen readers by stopping text caret from leaving blocks.":["Ayuda a los lectores de pantalla impidiendo que el texto escrito salga de los bloques."],"Preferences":["Preferencias"],"Show more settings":["Mostrar m\u00e1s ajustes"],"Contain text cursor inside block":["Contener el cursor de texto dentro del bloque"],"Here's a detailed guide.":["Aqu\u00ed hay una gu\u00eda detallada."],"Welcome Guide":["Gu\u00eda de bienvenida"],"Keyboard shortcuts":["Atajos del teclado"],"Generic label for block inserter button\u0004Add block":["A\u00f1adir un bloque"],"Display these keyboard shortcuts.":["Mostrar estos atajos del teclado."],"Add a block":["A\u00f1ade un bloque"],"Top toolbar deactivated":["Barra superior desactivada"],"Top toolbar activated":["Barra superior activada"],"Top toolbar":["Barra de herramientas superior"],"Got it":["Entendido"],"Block Settings":["Ajustes del bloque"],"Remove a link.":["Elimina un enlace."],"Convert the selected text into a link.":["Convierte el texto seleccionado en un enlace."],"Underline the selected text.":["Subraya el texto seleccionado."],"Make the selected text italic.":["Cambia el texto seleccionado a cursiva."],"Make the selected text bold.":["Cambia el texto seleccionado a negrita."],"Text formatting":["Formatos de texto"],"Forward-slash":["Barra ( \/ )"],"Change the block type after adding a new paragraph.":["Cambia el tipo de bloque despu\u00e9s de a\u00f1adir un nuevo p\u00e1rrafo."],"Block shortcuts":["Atajos de bloques"],"Selection shortcuts":["Atajos de selecci\u00f3n"],"Redo your last undo.":["Rehace tu \u00faltimo deshacer."],"Undo your last changes.":["Deshace tus \u00faltimos cambios."],"Save your changes.":["Guarda tus cambios."],"Global shortcuts":["Atajos globales"],"Access all block and document tools in a single place":["Accede a todas las herramientas de bloques y documentos desde un solo lugar"],"noun\u0004View":["Ver"],"Options":["Opciones"],"Document tools":["Herramientas del documento"],"The editor has encountered an unexpected error.":["El editor ha encontrado un error inesperado."],"Copy Error":["Copiar el error"],"(opens in a new tab)":["(abre en una nueva pesta\u00f1a)"],"Customizing":["Personalizaci\u00f3n"],"Tools":["Herramientas"],"Widgets":["Widgets"],"Help":["Ayuda"],"Redo":["Rehacer"],"Undo":["Deshacer"]}},"comment":{"reference":"wp-includes\/js\/dist\/customize-widgets.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Custom Styles":["Estilos personalizados"],"Global Styles":["Estilos globales"],"Widget types":["Tipos de widgets"],"Menu Item":["Elemento del men\u00fa"],"Comment":["Comentario"],"Widget areas":["\u00c1reas de widgets"],"Site":["Sitio"],"Post Type":["Tipo de entrada"],"Taxonomy":["Taxonom\u00eda"],"Menu Location":["Ubicaci\u00f3n de men\u00fa"],"Status":["Estado"],"Menu":["Men\u00fa"],"User":["Usuario"],"Base":["Base"],"Widgets":["Widgets"],"Themes":["Temas"],"(no title)":["(sin t\u00edtulo)"],"Media":["Medios"],"Plugins":["Plugins"]}},"comment":{"reference":"wp-includes\/js\/dist\/core-data.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Running additional tests... please wait.":["Ejecutando pruebas adicionales\u2026 por favor, espera."],"All site health tests have finished running. There are items that should be addressed.":["Todas las pruebas de salud del sitio han terminado de ejecutarse. Hay elementos que deben solucionarse."],"All site health tests have finished running. Your site is looking good.":["Todas las pruebas de salud del sitio han terminado de ejecutarse. Tu sitio tiene buen aspecto."],"Unavailable":["No disponible"],"No details available":["No hay detalles disponibles"],"A test is unavailable":["No est\u00e1 disponible una prueba"],"Should be improved":["Necesita mejoras"],"Good":["Bueno"],"%s critical issue":["%s error cr\u00edtico","%s errores cr\u00edticos"],"%s item with no issues detected":["Detectado %s elemento sin problemas","Detectados %s elementos sin problemas"],"%s recommended improvement":["%s mejora recomendada","%s mejoras recomendadas"],"Site information has been copied to your clipboard.":["La informaci\u00f3n del sitio ha sido copiada a tu portapapeles."]}},"comment":{"reference":"wp-admin\/js\/site-health.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Use as featured image":["Usar como imagen destacada"],"Saving\u2026":["Guardando\u2026"],"Could not set that as the thumbnail image. Try a different attachment.":["No se ha podido establecer como imagen de miniatura. Prueba con otro adjunto."],"Done":["Hecho"]}},"comment":{"reference":"wp-admin\/js\/set-post-thumbnail.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Screen Options updated.":["Opciones de pantalla actualizadas."],"Drag boxes here":["Arrastra aqu\u00ed las cajas"],"Add boxes from the Screen Options menu":["A\u00f1adir cajas desde el men\u00fa de opciones de pantalla"],"The boxes order has been saved.":["Ha sido guardado el orden de las cajas."],"The box is on the last position":["La caja est\u00e1 en la \u00faltima posici\u00f3n"],"The box is on the first position":["La caja est\u00e1 en la primera posici\u00f3n"]}},"comment":{"reference":"wp-admin\/js\/postbox.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Widget has been added to the selected sidebar":["El widget ha sido a\u00f1adido a la barra lateral seleccionada"],"Saved":["Guardado"],"The changes you made will be lost if you navigate away from this page.":["Los cambios realizados se perder\u00e1n si sales de esta p\u00e1gina."],"Save":["Guardar"]}},"comment":{"reference":"wp-admin\/js\/widgets.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"All application passwords revoked.":["Se han anulado todas las contrase\u00f1as de aplicaci\u00f3n."],"Are you sure you want to revoke all passwords? This action cannot be undone.":["\u00bfSeguro que quieres anular todas las contrase\u00f1as? Esta acci\u00f3n no se puede deshacer."],"Application password revoked.":["Se ha anulado la contrase\u00f1a de la aplicaci\u00f3n."],"Are you sure you want to revoke this password? This action cannot be undone.":["\u00bfSeguro que quieres anular esta contrase\u00f1a? Esta acci\u00f3n no se puede deshacer."],"Dismiss this notice.":["Descartar este aviso."]}},"comment":{"reference":"wp-admin\/js\/application-passwords.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"URL Slug":["Slug de la URL"],"Permalink saved":["Enlace permanente guardado"],"Published on:":["Publicada el:"],"Publish on:":["Publicar el:"],"Schedule for:":["Programar para:"],"Saving Draft\u2026":["Guardando el borrador..."],"No more comments found.":["No se han encontrado m\u00e1s comentarios."],"Show more comments":["Mostrar m\u00e1s comentarios"],"post action\/button label\u0004Schedule":["Programar"],"%1$s %2$s, %3$s at %4$s:%5$s":["%2$s de %1$s de %3$s a las %4$s:%5$s"],"Public, Sticky":["P\u00fablica, fija"],"Privately Published":["Publicada como privada"],"Save as Pending":["Guardar como pendiente"],"Password Protected":["Protegida con contrase\u00f1a"],"The file URL has been copied to your clipboard":["La URL del archivo ha sido copiada a tu portapapeles"],"Could not set that as the thumbnail image. Try a different attachment.":["No se ha podido establecer como imagen de miniatura. Prueba con otro adjunto."],"The changes you made will be lost if you navigate away from this page.":["Los cambios realizados se perder\u00e1n si sales de esta p\u00e1gina."],"Update":["Actualizar"],"Public":["P\u00fablica"],"Private":["Privada"],"OK":["Aceptar"],"Save Draft":["Guardar borrador"],"Cancel":["Cancelar"],"Publish":["Publicar"],"Published":["Publicada"]}},"comment":{"reference":"wp-admin\/js\/post.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Are you sure you want to do this?\nThe comment changes you made will be lost.":["\u00bfSeguro que quieres hacer esto?\nSe perder\u00e1n los cambios que has hecho en el comentario."],"Are you sure you want to edit this comment?\nThe changes you made will be lost.":["\u00bfSeguro que quieres editar este comentario?\nSe perder\u00e1n los cambios que hayas hecho."],"Approve and Reply":["Aprobar y responder"],"Comments (%s)":["Comentarios (%s)"],"Reply":["Responder"],"Comments":["Comentarios"]}},"comment":{"reference":"wp-admin\/js\/edit-comments.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Preference activated - %s":["Preferencia activada - %s"],"Preference deactivated - %s":["Preferencia desactivada - %s"],"Preferences":["Preferencias"],"Back":["Volver"]}},"comment":{"reference":"wp-includes\/js\/dist\/preferences.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Math":["Matem\u00e1ticas"],"CSS classes":["Clases CSS"],"e.g., x^2, \\frac{a}{b}":["p.ej.: x^2, \\frac{a}{b}"],"LaTeX math syntax":["Sintaxis matem\u00e1tica de LaTeX"],"Non breaking space":["Espacio sin salto"],"https:\/\/www.w3.org\/WAI\/tutorials\/images\/decision-tree\/":["https:\/\/www.w3.org\/WAI\/tutorials\/images\/decision-tree\/"],"Mark as nofollow":["Marcar como nofollow"],"Text direction":["Direcci\u00f3n de escritura"],"A valid language attribute, like \"en\" or \"fr\".":["Un atributo de idioma v\u00e1lido, como \u00aben\u00bb o \u00abfr\u00bb."],"Leave empty if decorative.":["D\u00e9jalo vac\u00edo si es decorativo."],"Clear Unknown Formatting":["Vaciar formatos desconocidos"],"Create page: <mark>%s<\/mark>":["Crear p\u00e1gina: <mark>%s<\/mark>"],"Highlight":["Resaltado"],"Keyboard input":["Entrada de teclado"],"Inline code":["C\u00f3digo integrado"],"Describe the purpose of the image.":["Describe el prop\u00f3sito de la imagen."],"Separate multiple classes with spaces.":["Separa m\u00faltiples clases con espacios."],"Link edited.":["Enlace editado."],"Link removed.":["Enlace eliminado."],"Inline image":["Imagen integrada"],"media":["medios"],"photo":["foto"],"Additional CSS class(es)":["Clase(s) CSS adicional(es)"],"Replace image":["Reemplazar la imagen"],"Warning: the link has been inserted but may have errors. Please test it.":["Advertencia: el enlace ha sido insertado, pero puede tener errores. Por favor, compru\u00e9balo."],"Link inserted.":["Enlace insertado."],"Left to right":["De izquierda a derecha"],"Right to left":["De derecha a izquierda"],"Link":["Enlace"],"Background":["Fondo"],"Superscript":["Super\u00edndice"],"Subscript":["Sub\u00edndice"],"Strikethrough":["Tachado"],"Underline":["Subrayado"],"Italic":["Cursiva"],"Bold":["Negrita"],"Language":["Idioma"],"Text":["Texto"],"Width":["Anchura"],"Alternative text":["Texto alternativo"],"Apply":["Aplicar"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Legacy widget":["Widget heredado"],"Create a classic widget layout with a title that\u2019s styled by your theme for your widget areas.":["Crea un dise\u00f1o de widget cl\u00e1sico con un t\u00edtulo con el estilo de tu tema para tus \u00e1reas de widgets."],"Widget Group":["Grupo de widgets"],"The \"%s\" block was affected by errors and may not function properly. Check the developer tools for more details.":["El bloque \u00ab%s\u00bb ha sido afectado por errores y puede que no funcione correctamente. Compru\u00e9balo con las herramientas para desarrolladores para m\u00e1s detalles."],"Move to widget area":["Mover al \u00e1rea de widgets"],"Widget is missing.":["Falta el widget."],"No preview available.":["Vista previa no disponible."],"Legacy Widget Preview":["Vista previa de widget heredado"],"Select widget":["Selecciona un widget"],"Convert to blocks":["Convertir en bloques"],"Move to":["Mover a"],"Legacy Widget":["Widget heredado"],"There are no widgets available.":["No hay ning\u00fan widget disponible."],"Save":["Guardar"],"Title":["T\u00edtulo"]}},"comment":{"reference":"wp-includes\/js\/dist\/widgets.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"The file URL has been copied to your clipboard":["La URL del archivo ha sido copiada a tu portapapeles"],"An error has occurred. Please reload the page and try again.":["Ha ocurrido un error. Por favor, recarga la p\u00e1gina e int\u00e9ntalo de nuevo"]}},"comment":{"reference":"wp-admin\/js\/media.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Plugin details":["Detalles del plugin"],"Plugin: %s":["Plugin: %s"]}},"comment":{"reference":"wp-admin\/js\/plugin-install.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Screen Options updated.":["Opciones de pantalla actualizadas."],"%1$s is deprecated since version %2$s with no alternative available.":["%1$s est\u00e1 obsoleta desde la versi\u00f3n %2$s sin una alternativa disponible."],"%1$s is deprecated since version %2$s! Use %3$s instead.":["\u00a1%1$s est\u00e1 obsoleta desde la versi\u00f3n %2$s! Usa %3$s en su lugar."],"Please select at least one item to perform this action on.":["Por favor, selecciona al menos un elemento en el que realizar esta acci\u00f3n."],"Expand Main menu":["Desplegar el men\u00fa principal"],"Dismiss this notice.":["Descartar este aviso."],"You are about to permanently delete these items from your site.\nThis action cannot be undone.\n'Cancel' to stop, 'OK' to delete.":["Est\u00e1s a punto de borrar permanentemente estos elementos de tu sitio.\nEsta acci\u00f3n no se puede deshacer.\n\u00abCancelar\u00bb para parar, \u00abAceptar\u00bb para borrar."],"Collapse Main menu":["Contraer el men\u00fa principal"]}},"comment":{"reference":"wp-admin\/js\/common.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"The selected tag has been deleted.":["La etiqueta seleccionada se ha borrado."],"An error occurred while processing your request. Please try again later.":["Ha ocurrido un error al procesar tu solicitud. Int\u00e9ntalo de nuevo m\u00e1s tarde."],"Sorry, you are not allowed to do that.":["Lo siento, no tienes permisos para hacer eso."]}},"comment":{"reference":"wp-admin\/js\/tags.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Hide password":["Ocultar la contrase\u00f1a"],"Show password":["Mostrar la contrase\u00f1a"],"Hide":["Ocultar"],"Show":["Mostrar"]}},"comment":{"reference":"wp-admin\/js\/password-toggle.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"%d result found. Use up and down arrow keys to navigate.":["%d resultado encontrado. Utiliza las teclas de flecha arriba y abajo para navegar.","%d resultados encontrados. Utiliza las teclas de flecha arriba y abajo para navegar."],"Term selected.":["T\u00e9rmino seleccionado."],"tag delimiter\u0004,":[","],"No results found.":["No se han encontrado resultados."]}},"comment":{"reference":"wp-admin\/js\/tags-suggest.js"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Error dismissed.":["Error descartado."],"Showing %1$s of %2$s media items":["Mostrando %1$s de %2$s elementos de medios"],"Jump to first loaded item":["Saltar al primer elemento cargado"],"Load more":["Cargar m\u00e1s"],"Number of media items displayed: %d. Click load more for more results.":["N\u00famero de elementos de medios mostrados: %d. Haz clic para cargar m\u00e1s resultados."],"The file URL has been copied to your clipboard":["La URL del archivo ha sido copiada a tu portapapeles"],"%s item selected":["%s elemento seleccionado","%s elementos seleccionados"],"Number of media items displayed: %d. Scroll the page for more results.":["N\u00famero de elementos de medios mostrados: %d. Haz scroll en la p\u00e1gina para ver m\u00e1s resultados."]}},"comment":{"reference":"wp-includes\/js\/media-views.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Caps lock is on.":["El bloqueo de may\u00fasculas est\u00e1 activado."],"Application password has been copied to your clipboard.":["Se ha copiado la contrase\u00f1a de aplicaci\u00f3n al portapapeles."],"Your new password has not been saved.":["No ha sido guardada tu nueva contrase\u00f1a."],"Confirm use of weak password":["Confirma el uso de una contrase\u00f1a d\u00e9bil."],"Hide password":["Ocultar la contrase\u00f1a"],"Show password":["Mostrar la contrase\u00f1a"],"Hide":["Ocultar"],"Show":["Mostrar"],"The changes you made will be lost if you navigate away from this page.":["Los cambios realizados se perder\u00e1n si sales de esta p\u00e1gina."]}},"comment":{"reference":"wp-admin\/js\/user-profile.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"An error occurred while saving your changes. Please try again. If the problem persists, you may need to manually update the file via FTP.":["Ha ocurrido un error al guardar los cambios. Int\u00e9ntalo de nuevo. Si el problema persiste, es posible que tengas que actualizar manualmente el archivo a trav\u00e9s de FTP."],"There is %s error which must be fixed before you can update this file.":["Hay %s error que debe ser corregido antes de que puedas actualizar este archivo.","Hay %s errores que deben ser corregidos antes de que puedas actualizar este archivo."],"The changes you made will be lost if you navigate away from this page.":["Los cambios realizados se perder\u00e1n si sales de esta p\u00e1gina."]}},"comment":{"reference":"wp-admin\/js\/theme-plugin-editor.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Explore all blocks":["Explora todos los bloques"],"Customize each block":["Personaliza cada bloque"],"Welcome to the editor":["Te damos la bienvenida al editor"],"Enable or disable fullscreen mode.":["Activa o desactiva el modo de pantalla completa."],"Use up and down arrow keys to resize the meta box panel.":["Utiliza las teclas de flecha arriba y abajo para cambiar el tama\u00f1o del panel de la caja meta."],"Meta Boxes":["Cajas meta"],"New to the block editor? Want to learn more about using it? <a>Here's a detailed guide.<\/a>":["\u00bfEres nuevo en el editor de bloques? \u00bfQuieres saber m\u00e1s sobre su uso? <a>Aqu\u00ed tienes una gu\u00eda detallada.<\/a>"],"pattern (singular)\u0004Synced":["Sincronizado"],"Sync this pattern across multiple locations.":["Sincroniza este patr\u00f3n en varias ubicaciones."],"Fullscreen on.":["Pantalla completa activa."],"Fullscreen off.":["Pantalla completa desactivada."],"Show and hide the admin user interface":["Mostrar y ocultar la interfaz de usuario del administrador"],"Enter fullscreen":["Abrir pantalla completa"],"My pattern":["Mi patr\u00f3n"],"Create pattern":["Crear patr\u00f3n"],"Hide & Reload Page":["Ocultar y recargar p\u00e1gina"],"Show & Reload Page":["Mostrar y recargar p\u00e1gina"],"Manage patterns":["Gestionar patrones"],"https:\/\/wordpress.org\/documentation\/article\/wordpress-block-editor\/":["https:\/\/wordpress.org\/documentation\/article\/wordpress-block-editor\/"],"\"%s\" successfully created.":["\u00ab%s\u00bb creada correctamente."],"The \"%s\" plugin has encountered an error and cannot be rendered.":["El plugin \u00ab%s\u00bb ha encontrado un error y no se puede mostrar."],"Drag to resize":["Arrastra para cambiar el tama\u00f1o"],"Templates help define the layout of the site. You can customize all aspects of your posts and pages using blocks and patterns in this editor.":["Las plantillas te ayudan a definir el dise\u00f1o del sitio. Puedes personalizar todos los aspectos de tus entradas y p\u00e1ginas usando bloques y patrones en este editor."],"Welcome to the template editor":["Te damos la bienvenida al editor de plantillas"],"Use theme styles":["Usar los estilos del tema"],"Make the editor look like your theme.":["Hacer que el editor se vea como tu tema."],"All of the blocks available to you live in the block library. You\u2019ll find it wherever you see the <InserterIconImage \/> icon.":["Tienes disponibles todos los bloques en la biblioteca de bloques. Los encontrar\u00e1s en cualquier lugar en el que veas el icono <InserterIconImage \/>"],"Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected.":["Cada bloque viene con su propio conjunto de controles para cambiar cosas como el color, la anchura y la alineaci\u00f3n. Estos se mostrar\u00e1n y ocultar\u00e1n autom\u00e1ticamente cuando hayas seleccionado un bloque."],"In the WordPress editor, each paragraph, image, or video is presented as a distinct \u201cblock\u201d of content.":["En el editor de WordPress, cada p\u00e1rrafo, imagen o v\u00eddeo se presenta como un \u00abbloque\u00bb de diferente de contenido."],"Get started":["Comenzar"],"inserter":["insertador"],"Welcome Guide":["Gu\u00eda de bienvenida"],"A page reload is required for this change. Make sure your content is saved before reloading.":["Se necesita recargar la p\u00e1gina para este cambio. Antes de recargar, aseg\u00farate de que tu contenido est\u00e1 guardado."],"Fullscreen mode deactivated.":["Modo a pantalla completa desactivado."],"Fullscreen mode activated.":["Modo a pantalla completa activado."],"Custom fields":["Campos personalizados"],"Create":["Crear"],"Fullscreen mode":["Modo a pantalla completa"],"Site Icon":["Icono del sitio"],"Back":["Volver"],"Exit fullscreen":["Salir de pantalla completa"],"Learn more":["Aprender m\u00e1s"],"(no title)":["(sin t\u00edtulo)"],"Name":["Nombre"],"Advanced":["Avanzado"],"Undo":["Deshacer"],"Edit":["Editar"]}},"comment":{"reference":"wp-includes\/js\/dist\/edit-post.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Your session has expired. You can log in again from this page or go to the login page.":["Tu sesi\u00f3n ha caducado. Puedes acceder de nuevo desde esta p\u00e1gina o ir a la p\u00e1gina de acceso."]}},"comment":{"reference":"wp-includes\/js\/wp-auth-check.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Get started here":["Empieza aqu\u00ed"],"Interested in creating your own block?":["\u00bfEst\u00e1s interesado en crear tu propio bloque?"],"Select a block to install and add it to your post.":["Selecciona un bloque para instalar y a\u00f1\u00e1delo a tu entrada."],"Available to install":["Disponible para instalar"],"No results available from your installed blocks.":["No hay resultados disponibles de tus bloques instalados."],"%d additional block is available to install.":["%d bloque adicional est\u00e1 disponible para instalar.","%d bloques adicionales est\u00e1n disponibles para instalar."],"Blocks available for install":["Bloques disponibles para instalar"],"Install block":["Instalar el bloque"],"%1$s <span>by %2$s<\/span>":["%1$s <span>de %2$s<\/span>"],"Installing\u2026":["Instalando\u2026"],"Install %1$s. %2$s stars with %3$s review.":["Instalar %1$s. %2$s estrellas con %3$s rese\u00f1a.","Instalar %1$s. %2$s estrellas con %3$s rese\u00f1as."],"Try reloading the page.":["Intenta recargar la p\u00e1gina."],"Block %s installed and added.":["El bloque %s se ha instalado y a\u00f1adido."],"Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely.":["Tu sitio no incluye compatibilidad para el bloque \u00ab%s\u00bb. Puedes intentar instalar el bloque, convertirlo en un bloque HTML personalizado o eliminarlo del todo."],"Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely.":["Tu sitio no incluye compatibilidad para el bloque %s. Puedes intentar instalar el bloque o eliminarlo por completo."],"The following block has been added to your site.":["El siguiente bloque se ha a\u00f1adido a tu sitio.","Los siguientes bloques se han a\u00f1adido a tu sitio."],"Added: %d block":["A\u00f1adido: %d bloque","A\u00f1adidos: %d bloques"],"Error installing block. You can reload the page and try again.":["Error al instalar el bloque. Puedes recargar la p\u00e1gina e intentarlo de nuevo."],"This block is already installed. Try reloading the page.":["Este bloque ya est\u00e1 instalado. Intenta recargar la p\u00e1gina."],"An error occurred.":["Ha ocurrido un error."],"Error registering block. Try reloading the page.":["Error al registrar el bloque. Intenta recargar la p\u00e1gina."],"%s out of 5 stars":["%s de 5 estrellas"],"Keep as HTML":["Mantener como HTML"],"Install %s":["Instalar %s"],"Installed!":["\u00a1Instalado!"],"No results found.":["No se han encontrado resultados."],"By %s":["Por %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-directory.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Some selected posts have this category":["Algunas entradas seleccionadas tienen esta categor\u00eda"],"All selected items have been removed. Select new items to use Bulk Actions.":["Todos los elementos seleccionados han sido eliminados. Selecciona nuevos elementos para usar las acciones en lote."],"Remove &#8220;%s&#8221; from Bulk Edit":["Eliminar \u00ab%s\u00bb de la edici\u00f3n en lote"],"Error while saving the changes.":["Error al guardar los cambios."],"Changes saved.":["Cambios guardados."],"Item removed.":["Elemento eliminado."],"tag delimiter\u0004,":[","],"(no title)":["(sin t\u00edtulo)"]}},"comment":{"reference":"wp-admin\/js\/inline-edit-post.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Clear color":["Vaciar el color"],"Select default color":["Seleccionar el color por defecto"],"Color value":["Valor del color"],"Select Color":["Seleccionar un color"],"Clear":["Borrar"],"Default":["Por defecto"]}},"comment":{"reference":"wp-admin\/js\/color-picker.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Term added.":["T\u00e9rmino a\u00f1adido."],"Term removed.":["T\u00e9rmino eliminado."],"Remove term:":["Eliminar el t\u00e9rmino:"],"tag delimiter\u0004,":[","]}},"comment":{"reference":"wp-admin\/js\/tags-box.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Tilde":["Virgulilla"],"Backtick":["Acento grave"],"Period":["Punto"],"Comma":["Coma"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"App icon preview: The current image has no alternative text. The file name is: %s":["Vista previa del icono de la aplicaci\u00f3n: La imagen actual no tiene texto alternativo. El nombre del archivo es: %s"],"App icon preview: Current image: %s":["Vista previa del icono de la aplicaci\u00f3n: Imagen actual: %s"],"Browser icon preview: The current image has no alternative text. The file name is: %s":["Vista previa del icono del navegador: La imagen actual no tiene texto alternativo. El nombre del archivo es: %s"],"Browser icon preview: Current image: %s":["Vista previa del icono del navegador: Imagen actual: %s"]}},"comment":{"reference":"wp-admin\/js\/site-icon.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"%d Search Results Found":["%d resultados de b\u00fasqueda encontrados"],"Search results cleared":["Resultados de b\u00fasqueda vaciados"],"part of a total number of menu items\u0004%1$s of %2$s":["%1$s de %2$s"],"menu item without a parent in navigation menu\u0004No Parent":["Sin principal"],"You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete.":["Est\u00e1s a punto de borrar permanentemente este men\u00fa.\n\u00abCancelar\u00bb para parar, \u00abAceptar\u00bb para borrar."],"missing menu item navigation label\u0004(no label)":["(sin etiqueta)"],"The changes you made will be lost if you navigate away from this page.":["Los cambios realizados se perder\u00e1n si sales de esta p\u00e1gina."],"No results found.":["No se han encontrado resultados."]}},"comment":{"reference":"wp-admin\/js\/nav-menu.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Your new password for %s is:":["Tu nueva contrase\u00f1a para %s es:"],"Be sure to save this in a safe location. You will not be able to retrieve it.":["Aseg\u00farate de guardarla en un lugar seguro. No podr\u00e1s recuperarla."]}},"comment":{"reference":"wp-admin\/js\/auth-app.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"text direction\u0004ltr":["ltr"]}},"comment":{"reference":"wp-includes\/js\/dist\/i18n.js"}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Dismiss":["Descartar"]}},"comment":{"reference":"wp-includes\/js\/wp-pointer.js"}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Error while saving the changes.":["Error al guardar los cambios."],"Changes saved.":["Cambios guardados."]}},"comment":{"reference":"wp-admin\/js\/inline-edit-tax.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Error while sideloading file %s to the server.":["Error al enviar el archivo %s al servidor."],"Only one file can be used here.":["Aqu\u00ed solo se puede usar un archivo."],"%s: Sorry, you are not allowed to upload this file type.":["%s: Lo siento, no tienes permisos para subir este tipo de archivo."],"Select or Upload Media":["Selecciona o sube medios"],"Error while uploading file %s to the media library.":["Error al subir el archivo %s a la biblioteca de medios."],"%s: This file is empty.":["%s: Este archivo est\u00e1 vac\u00edo."],"%s: Sorry, this file type is not supported here.":["%s: Lo siento, este tipo de archivo no es compatible aqu\u00ed."],"%s: This file exceeds the maximum upload size for this site.":["%s: Este archivo supera el tama\u00f1o m\u00e1ximo de subida para este sitio."]}},"comment":{"reference":"wp-includes\/js\/dist\/media-utils.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Block rendered as empty.":["Bloque procesado como vac\u00edo."],"Error loading block: %s":["Error al cargar el bloque: %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/server-side-render.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-02-22 20:34:00+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Screen Options updated.":["Opciones de pantalla actualizadas."],"Attend an upcoming event near you.":["Asiste a un pr\u00f3ximo evento cerca de ti."],"Events widget offset prefix\u0004GMT":["UTC"],"%1$s %2$d \u2013 %3$s %4$d, %5$d":["%1$s %2$d \u2013 %3$s %4$d, %5$d"],"upcoming events year format\u0004Y":["Y"],"upcoming events day format\u0004j":["j"],"%1$s %2$d\u2013%3$d, %4$d":["%2$d\u2013%3$d de %1$s de %4$d"],"upcoming events month format\u0004F":["F"],"City updated. Listing events near %s.":["Ciudad actualizada. Listado de eventos cerca de %s."],"We couldn\u2019t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.":["No hemos podido localizar %s. Por favor, intenta otra ciudad cercana. Por ejemplo: Madrid; Valencia; Zaragoza."],"An error occurred. Please try again.":["Ha ocurrido un error. Por favor, int\u00e9ntalo de nuevo."],"Enter your closest city to find nearby events.":["Introduce la ciudad m\u00e1s cercana a ti para encontrar futuros eventos."],"l, M j, Y":["l, j M Y"]}},"comment":{"reference":"wp-admin\/js\/dashboard.js"}}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Could not set that as the thumbnail image. Try a different attachment.":["No se ha podido establecer como imagen de miniatura. Prueba con otro adjunto."]}},"comment":{"reference":"wp-includes\/js\/media-editor.js"}}

View File

@@ -0,0 +1 @@
{"translation-revision-date":"2026-03-28 00:00:14+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"es"},"Open custom CSS":["Abrir el CSS personalizado"],"Go to: Patterns":["Ir a: Patrones"],"Go to: Templates":["Ir a: Plantillas"],"Go to: Navigation":["Ir a: Navegaci\u00f3n"],"Go to: Styles":["Ir a: Estilos"],"Go to: Template parts":["Ir a: Partes de plantilla"],"Go to: %s":["Ir a: %s"],"View site":["Ver sitio"],"(no title)":["(sin t\u00edtulo)"]}},"comment":{"reference":"wp-includes\/js\/dist\/core-commands.js"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

22964
wp-content/languages/es_ES.po Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,462 @@
# Translation of Themes - Twenty Twenty-Three in Spanish (Spain)
# This file is distributed under the same license as the Themes - Twenty Twenty-Three package.
msgid ""
msgstr ""
"PO-Revision-Date: 2024-11-13 18:22:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: GlotPress/4.0.3\n"
"Language: es\n"
"Project-Id-Version: Themes - Twenty Twenty-Three\n"
#. Description of the theme
#: style.css
#, gp-priority: high
msgid "Twenty Twenty-Three is designed to take advantage of the new design tools introduced in WordPress 6.1. With a clean, blank base as a starting point, this default theme includes ten diverse style variations created by members of the WordPress community. Whether you want to build a complex or incredibly simple website, you can do it quickly and intuitively through the bundled styles or dive into creation and full customization yourself."
msgstr "Twenty Twenty-Three está diseñado para aprovechar las nuevas herramientas de diseño introducidas en WordPress 6.1. Con una base limpia y en blanco como punto de partida, este tema por defecto incluye diez variaciones de estilo diversas creadas por miembros de la comunidad WordPress. Ya sea que desees crear una web compleja o increíblemente simple, puedes hacerlo de forma rápida e intuitiva a través de los estilos incluidos o sumergirte en la creación y personalización completa tú mismo."
#. Theme Name of the theme
#: style.css
#, gp-priority: high
msgid "Twenty Twenty-Three"
msgstr "Twenty Twenty-Three"
#: patterns/hidden-heading.php:9
msgctxt "Main heading for homepage"
msgid "Mindblown: a blog about philosophy."
msgstr "Mente despierta: un blog sobre filosofía."
#: patterns/hidden-heading.php
msgctxt "Pattern title"
msgid "Hidden Heading for Homepage"
msgstr "Encabezado oculto para la página de inicio."
#: patterns/post-meta.php
msgctxt "Pattern description"
msgid "Post meta information with separator on the top."
msgstr "Información de metadatos de la entrada con separador en la parte superior."
#: patterns/footer-default.php
msgctxt "Pattern description"
msgid "Footer with site title and powered by WordPress."
msgstr "Pie de página con el título del sitio y el texto «funciona con WordPress»."
#: patterns/call-to-action.php
msgctxt "Pattern description"
msgid "Left-aligned text with a CTA button and a separator."
msgstr "Texto alineado a la izquierda con un botón CTA y un separador."
#: theme.json
msgctxt "Template part name"
msgid "Comments Template Part"
msgstr "Parte de plantilla de comentarios"
#: theme.json
msgctxt "Template part name"
msgid "Post Meta"
msgstr "Metadatos de la entrada"
#: theme.json
msgctxt "Template part name"
msgid "Footer"
msgstr "Pie de página"
#: theme.json
msgctxt "Template part name"
msgid "Header"
msgstr "Cabecera"
#: theme.json
msgctxt "Font family name"
msgid "Source Serif Pro"
msgstr "Source Serif Pro"
#: theme.json
msgctxt "Font family name"
msgid "System Font"
msgstr "Fuente del sistema"
#: theme.json
msgctxt "Font family name"
msgid "Inter"
msgstr "Inter"
#: theme.json
msgctxt "Font family name"
msgid "IBM Plex Mono"
msgstr "IBM Plex Mono"
#: theme.json
msgctxt "Font family name"
msgid "DM Sans"
msgstr "DM Sans"
#: theme.json
msgctxt "Custom template name"
msgid "404"
msgstr "404"
#: theme.json
msgctxt "Custom template name"
msgid "Blog (Alternative)"
msgstr "Blog (Alternativo)"
#: theme.json
msgctxt "Custom template name"
msgid "Blank"
msgstr "En blanco"
#: styles/whisper.json
msgctxt "Style variation name"
msgid "Whisper"
msgstr "Susurro"
#: styles/sherbet.json
msgctxt "Gradient name"
msgid "Tertiary to Secondary to Primary Fixed"
msgstr "Terciario a secundario a principal fijo"
#: styles/sherbet.json
msgctxt "Gradient name"
msgid "Primary to Secondary to Tertiary Fixed"
msgstr "Principal a secundario a terciario fijo"
#: styles/sherbet.json
msgctxt "Gradient name"
msgid "Primary to Secondary to Tertiary"
msgstr "Principal a secundario a terciario"
#: styles/sherbet.json
msgctxt "Style variation name"
msgid "Sherbet"
msgstr "Sorbete"
#: styles/pitch.json
msgctxt "Font size name"
msgid "2X Large"
msgstr "Grande 2X"
#: styles/pitch.json
msgctxt "Font size name"
msgid "Extra Large"
msgstr "Extra grande"
#: styles/pitch.json
msgctxt "Font size name"
msgid "Large"
msgstr "Grande"
#: styles/pitch.json
msgctxt "Font size name"
msgid "Medium"
msgstr "Medio"
#: styles/pitch.json
msgctxt "Font size name"
msgid "small"
msgstr "pequeño"
#: styles/pitch.json
msgctxt "Space size name"
msgid "7"
msgstr "7"
#: styles/pitch.json
msgctxt "Style variation name"
msgid "Pitch"
msgstr "Tono"
#: styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Dots"
msgstr "Puntos"
#: styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Base to Primary"
msgstr "Base a principal"
#: styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Tertiary to Secondary"
msgstr "Terciario a secundario"
#: styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Secondary to Primary"
msgstr "Secundario a principal"
#: styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Primary to Secondary"
msgstr "Principal a secundario"
#: styles/pilgrimage.json
msgctxt "Style variation name"
msgid "Pilgrimage"
msgstr "Peregrinación"
#: styles/marigold.json
msgctxt "Font size name"
msgid "Gigantic"
msgstr "Gigantesco"
#: styles/marigold.json
msgctxt "Font size name"
msgid "Huge"
msgstr "Enorme"
#: styles/marigold.json
msgctxt "Font size name"
msgid "Normal"
msgstr "Normal"
#: styles/marigold.json
msgctxt "Font size name"
msgid "Tiny"
msgstr "Diminuto"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "6"
msgstr "6"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "5"
msgstr "5"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "4"
msgstr "4"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "3"
msgstr "3"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "2"
msgstr "2"
#: styles/marigold.json styles/pitch.json theme.json
msgctxt "Space size name"
msgid "1"
msgstr "1"
#: styles/marigold.json
msgctxt "Style variation name"
msgid "Marigold"
msgstr "Caléndula"
#: styles/grapes.json
msgctxt "Style variation name"
msgid "Grapes"
msgstr "Uvas"
#: styles/electric.json
msgctxt "Style variation name"
msgid "Electric"
msgstr "Eléctrico"
#: styles/canary.json
msgctxt "Style variation name"
msgid "Canary"
msgstr "Canarias"
#: styles/block-out.json styles/canary.json styles/pilgrimage.json
#: styles/sherbet.json
msgctxt "Duotone name"
msgid "Default filter"
msgstr "Filtro por defecto"
#: styles/block-out.json
msgctxt "Style variation name"
msgid "Block out"
msgstr "Bloqueo"
#: styles/aubergine.json styles/block-out.json styles/canary.json
#: styles/electric.json styles/grapes.json styles/marigold.json
#: styles/pilgrimage.json styles/pitch.json styles/sherbet.json
#: styles/whisper.json theme.json
msgctxt "Color name"
msgid "Tertiary"
msgstr "Terciario"
#: styles/aubergine.json styles/block-out.json styles/canary.json
#: styles/electric.json styles/grapes.json styles/marigold.json
#: styles/pilgrimage.json styles/pitch.json styles/sherbet.json
#: styles/whisper.json theme.json
msgctxt "Color name"
msgid "Secondary"
msgstr "Secundario"
#: styles/aubergine.json styles/block-out.json styles/canary.json
#: styles/electric.json styles/grapes.json styles/marigold.json
#: styles/pilgrimage.json styles/pitch.json styles/sherbet.json
#: styles/whisper.json theme.json
msgctxt "Color name"
msgid "Primary"
msgstr "Principal"
#: styles/aubergine.json styles/block-out.json styles/canary.json
#: styles/electric.json styles/grapes.json styles/marigold.json
#: styles/pilgrimage.json styles/pitch.json styles/sherbet.json
#: styles/whisper.json theme.json
msgctxt "Color name"
msgid "Contrast"
msgstr "Contraste"
#: styles/aubergine.json styles/block-out.json styles/canary.json
#: styles/electric.json styles/grapes.json styles/marigold.json
#: styles/pilgrimage.json styles/pitch.json styles/sherbet.json
#: styles/whisper.json theme.json
msgctxt "Color name"
msgid "Base"
msgstr "Base"
#: styles/aubergine.json
msgctxt "Gradient name"
msgid "Primary to Tertiary"
msgstr "Principal a terciario"
#: styles/aubergine.json styles/pilgrimage.json
msgctxt "Gradient name"
msgid "Tertiary to Primary"
msgstr "Terciario a principal"
#: styles/aubergine.json
msgctxt "Gradient name"
msgid "Base to Secondary to Base"
msgstr "Base a secundario a base"
#: styles/aubergine.json
msgctxt "Gradient name"
msgid "Secondary to Base"
msgstr "Secundario a base"
#: styles/aubergine.json
msgctxt "Style variation name"
msgid "Aubergine"
msgstr "Berenjena"
#: patterns/post-meta.php:65
msgctxt "Label for a list of post tags"
msgid "Tags:"
msgstr "Etiquetas:"
#: patterns/post-meta.php:49
msgctxt "Preposition to show the relationship between the post and its author"
msgid "by"
msgstr "por"
#: patterns/post-meta.php:37
msgctxt "Preposition to show the relationship between the post and its categories"
msgid "in"
msgstr "en"
#: patterns/post-meta.php:29
msgctxt "Verb to explain the publication status of a post"
msgid "Posted"
msgstr "Publicado"
#: patterns/post-meta.php
msgctxt "Pattern title"
msgid "Post Meta"
msgstr "Metadatos de la entrada"
#: patterns/hidden-no-results.php:10
msgctxt "Message explaining that there are no results returned from a search"
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
msgstr "Lo siento, pero no hay nada que coincida con tus términos de búsqueda. Por favor, inténtalo de nuevo con algunas palabras clave diferentes."
#: patterns/hidden-no-results.php
msgctxt "Pattern title"
msgid "Hidden No Results Content"
msgstr "Contenido sin resultados oculto"
#: patterns/hidden-comments.php:13
msgctxt "Title of comments section"
msgid "Comments"
msgstr "Comentarios"
#: patterns/hidden-comments.php
msgctxt "Pattern title"
msgid "Hidden Comments"
msgstr "Comentarios ocultos"
#: patterns/hidden-404.php:22 patterns/hidden-no-results.php:14
msgid "Search"
msgstr "Buscar"
#: patterns/hidden-404.php:22 patterns/hidden-no-results.php:14
msgctxt "placeholder for search field"
msgid "Search..."
msgstr "Buscar…"
#: patterns/hidden-404.php:22 patterns/hidden-no-results.php:14
msgctxt "label"
msgid "Search"
msgstr "Buscar"
#: patterns/hidden-404.php:19
msgctxt "Message to convey that a webpage could not be found"
msgid "This page could not be found."
msgstr "No se ha podido encontrar esta página."
#: patterns/hidden-404.php:13
msgctxt "Error code for a webpage that is not found."
msgid "404"
msgstr "404"
#: patterns/hidden-404.php
msgctxt "Pattern title"
msgid "Hidden 404"
msgstr "404 oculta"
#. Translators: WordPress link.
#: patterns/footer-default.php:20
msgid "Proudly powered by %s"
msgstr "Funciona gracias a %s"
#: patterns/footer-default.php
msgctxt "Pattern title"
msgid "Default Footer"
msgstr "Pie de página por defecto"
#: patterns/call-to-action.php:25
msgctxt "sample content for call to action button"
msgid "Get In Touch"
msgstr "Contáctanos"
#: patterns/call-to-action.php:16
msgctxt "sample content for call to action"
msgid "Got any book recommendations?"
msgstr "¿Quieres recomendar algún libro?"
#: patterns/call-to-action.php
msgctxt "Pattern title"
msgid "Call to action"
msgstr "Llamada a la acción"
#. Author URI of the theme
#: style.css patterns/footer-default.php:21
#, gp-priority: low
msgid "https://wordpress.org"
msgstr "https://es.wordpress.org"
#. Author of the theme
#: style.css
#, gp-priority: low
msgid "the WordPress team"
msgstr "el equipo de WordPress"
#. Theme URI of the theme
#: style.css
#, gp-priority: low
msgid "https://wordpress.org/themes/twentytwentythree"
msgstr "https://es.wordpress.org/themes/twentytwentythree"

View File

@@ -0,0 +1,759 @@
<?php
require_once WPCF7_PLUGIN_DIR . '/admin/includes/admin-functions.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/help-tabs.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/tag-generator.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/welcome-panel.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/config-validator.php';
add_action(
'admin_init',
static function () {
do_action( 'wpcf7_admin_init' );
},
10, 0
);
add_action(
'admin_menu',
'wpcf7_admin_menu',
9, 0
);
function wpcf7_admin_menu() {
do_action( 'wpcf7_admin_menu' );
add_menu_page(
__( 'Contact Form 7', 'contact-form-7' ),
__( 'Contact', 'contact-form-7' )
. wpcf7_admin_menu_change_notice(),
'wpcf7_read_contact_forms',
'wpcf7',
'wpcf7_admin_management_page',
'dashicons-email',
30
);
$edit = add_submenu_page( 'wpcf7',
__( 'Edit Contact Form', 'contact-form-7' ),
__( 'Contact Forms', 'contact-form-7' )
. wpcf7_admin_menu_change_notice( 'wpcf7' ),
'wpcf7_read_contact_forms',
'wpcf7',
'wpcf7_admin_management_page'
);
add_action( 'load-' . $edit, 'wpcf7_load_contact_form_admin', 10, 0 );
$addnew = add_submenu_page( 'wpcf7',
__( 'Add Contact Form', 'contact-form-7' ),
__( 'Add Contact Form', 'contact-form-7' )
. wpcf7_admin_menu_change_notice( 'wpcf7-new' ),
'wpcf7_edit_contact_forms',
'wpcf7-new',
'wpcf7_admin_add_new_page'
);
add_action( 'load-' . $addnew, 'wpcf7_load_contact_form_admin', 10, 0 );
$integration = WPCF7_Integration::get_instance();
if ( $integration->service_exists() ) {
$integration = add_submenu_page( 'wpcf7',
__( 'Integration with External API', 'contact-form-7' ),
__( 'Integration', 'contact-form-7' )
. wpcf7_admin_menu_change_notice( 'wpcf7-integration' ),
'wpcf7_manage_integration',
'wpcf7-integration',
'wpcf7_admin_integration_page'
);
add_action( 'load-' . $integration, 'wpcf7_load_integration_page', 10, 0 );
}
}
function wpcf7_admin_menu_change_notice( $menu_slug = '' ) {
$counts = apply_filters( 'wpcf7_admin_menu_change_notice',
array(
'wpcf7' => 0,
'wpcf7-new' => 0,
'wpcf7-integration' => 0,
)
);
if ( empty( $menu_slug ) ) {
$count = absint( array_sum( $counts ) );
} elseif ( isset( $counts[$menu_slug] ) ) {
$count = absint( $counts[$menu_slug] );
} else {
$count = 0;
}
if ( $count ) {
return sprintf(
' <span class="update-plugins %1$d"><span class="plugin-count">%2$s</span></span>',
$count,
esc_html( number_format_i18n( $count ) )
);
}
return '';
}
add_action(
'admin_enqueue_scripts',
'wpcf7_admin_enqueue_scripts',
10, 1
);
function wpcf7_admin_enqueue_scripts( $hook_suffix ) {
if ( false === strpos( $hook_suffix, 'wpcf7' ) ) {
return;
}
wp_enqueue_style( 'contact-form-7-admin',
wpcf7_plugin_url( 'admin/includes/css/styles.css' ),
array(), WPCF7_VERSION, 'all'
);
if ( wpcf7_is_rtl() ) {
wp_enqueue_style( 'contact-form-7-admin-rtl',
wpcf7_plugin_url( 'admin/includes/css/styles-rtl.css' ),
array(), WPCF7_VERSION, 'all'
);
}
$assets = include wpcf7_plugin_path( 'admin/includes/js/index.asset.php' );
$assets = wp_parse_args( $assets, array(
'dependencies' => array(),
'version' => WPCF7_VERSION,
) );
wp_enqueue_script( 'wpcf7-admin',
wpcf7_plugin_url( 'admin/includes/js/index.js' ),
$assets['dependencies'],
$assets['version'],
array( 'in_footer' => true )
);
wp_set_script_translations( 'wpcf7-admin', 'contact-form-7' );
$wpcf7_obj = array(
'apiSettings' => array(
'root' => sanitize_url( rest_url( 'contact-form-7/v1' ) ),
'namespace' => 'contact-form-7/v1',
),
);
$post = wpcf7_get_current_contact_form();
if ( $post ) {
$wpcf7_obj = array_merge( $wpcf7_obj, array(
'nonce' => array(
'save' => wp_create_nonce(
sprintf(
'wpcf7-save-contact-form_%s',
$post->initial() ? -1 : $post->id()
)
),
'copy' => wp_create_nonce(
sprintf(
'wpcf7-copy-contact-form_%s',
$post->initial() ? -1 : $post->id()
)
),
'delete' => wp_create_nonce(
sprintf(
'wpcf7-delete-contact-form_%s',
$post->initial() ? -1 : $post->id()
)
),
),
'configValidator' => array(
'errors' => array(),
'docUrl' => WPCF7_ConfigValidator::get_doc_link(),
),
) );
if (
current_user_can( 'wpcf7_edit_contact_form', $post->id() ) and
wpcf7_validate_configuration()
) {
$config_validator = new WPCF7_ConfigValidator( $post );
$config_validator->restore();
$wpcf7_obj['configValidator'] = array_merge(
$wpcf7_obj['configValidator'],
array(
'errors' => $config_validator->collect_error_messages(
array( 'decodes_html_entities' => true )
),
)
);
}
}
wp_add_inline_script( 'wpcf7-admin',
sprintf(
'var wpcf7 = %s;',
wp_json_encode( $wpcf7_obj, JSON_PRETTY_PRINT )
),
'before'
);
}
add_filter(
'set_screen_option_wpcf7_contact_forms_per_page',
static function ( $result, $option, $value ) {
$wpcf7_screens = array(
'wpcf7_contact_forms_per_page',
);
if ( in_array( $option, $wpcf7_screens, true ) ) {
$result = $value;
}
return $result;
},
10, 3
);
function wpcf7_load_contact_form_admin() {
global $plugin_page;
$action = wpcf7_current_action();
do_action( 'wpcf7_admin_load',
wpcf7_superglobal_get( 'page' ),
$action
);
if ( 'save' === $action ) {
$id = wpcf7_superglobal_post( 'post_ID', '-1' );
check_admin_referer( 'wpcf7-save-contact-form_' . $id );
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
wp_die(
esc_html( __( 'You are not allowed to edit this item.', 'contact-form-7' ) )
);
}
$contact_form = wpcf7_save_contact_form(
array_merge(
wp_unslash( $_REQUEST ),
array(
'id' => $id,
'title' => wpcf7_superglobal_post( 'post_title', null ),
'locale' => wpcf7_superglobal_post( 'wpcf7-locale', null ),
'form' => wpcf7_superglobal_post( 'wpcf7-form', '' ),
'mail' => wpcf7_superglobal_post( 'wpcf7-mail', array() ),
'mail_2' => wpcf7_superglobal_post( 'wpcf7-mail-2', array() ),
'messages' => wpcf7_superglobal_post( 'wpcf7-messages', array() ),
'additional_settings' => wpcf7_superglobal_post( 'wpcf7-additional-settings', '' ),
)
)
);
if ( $contact_form and wpcf7_validate_configuration() ) {
$config_validator = new WPCF7_ConfigValidator( $contact_form );
$config_validator->validate();
$config_validator->save();
}
$query = array(
'post' => $contact_form ? $contact_form->id() : 0,
'active-tab' => wpcf7_canonicalize_name(
wpcf7_superglobal_post( 'active-tab' )
),
);
if ( ! $contact_form ) {
$query['message'] = 'failed';
} elseif ( -1 === (int) $id ) {
$query['message'] = 'created';
} else {
$query['message'] = 'saved';
}
$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );
wp_safe_redirect( $redirect_to );
exit();
}
if ( 'copy' === $action ) {
$id = absint( $_POST['post_ID'] ?? $_REQUEST['post'] ?? '' );
check_admin_referer( 'wpcf7-copy-contact-form_' . $id );
if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
wp_die(
esc_html( __( 'You are not allowed to edit this item.', 'contact-form-7' ) )
);
}
$query = array();
if ( $contact_form = wpcf7_contact_form( $id ) ) {
$new_contact_form = $contact_form->copy();
$new_contact_form->save();
$query['post'] = $new_contact_form->id();
$query['message'] = 'created';
}
$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );
wp_safe_redirect( $redirect_to );
exit();
}
if ( 'delete' === $action ) {
$nonce_action = 'bulk-posts';
if (
$post_id = wpcf7_superglobal_post( 'post_ID' ) or
! is_array( $post_id = wpcf7_superglobal_request( 'post', array() ) )
) {
$nonce_action = sprintf( 'wpcf7-delete-contact-form_%s', $post_id );
}
check_admin_referer( $nonce_action );
$posts = array_filter( (array) $post_id );
$deleted = 0;
foreach ( $posts as $post ) {
$post = WPCF7_ContactForm::get_instance( $post );
if ( empty( $post ) ) {
continue;
}
if ( ! current_user_can( 'wpcf7_delete_contact_form', $post->id() ) ) {
wp_die(
esc_html( __( 'You are not allowed to delete this item.', 'contact-form-7' ) )
);
}
if ( ! $post->delete() ) {
wp_die(
esc_html( __( 'Error in deleting.', 'contact-form-7' ) )
);
}
$deleted += 1;
}
$query = array();
if ( ! empty( $deleted ) ) {
$query['message'] = 'deleted';
}
$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );
wp_safe_redirect( $redirect_to );
exit();
}
$post = null;
if ( 'wpcf7-new' === $plugin_page ) {
$post = WPCF7_ContactForm::get_template( array(
'locale' => wpcf7_superglobal_get( 'locale', null ),
) );
} elseif ( $post_id = wpcf7_superglobal_get( 'post' ) ) {
$post = WPCF7_ContactForm::get_instance( $post_id );
}
$current_screen = get_current_screen();
$help_tabs = new WPCF7_Help_Tabs( $current_screen );
if ( $post and current_user_can( 'wpcf7_edit_contact_form', $post->id() ) ) {
$help_tabs->set_help_tabs( 'edit' );
} else {
$help_tabs->set_help_tabs( 'list' );
if ( ! class_exists( 'WPCF7_Contact_Form_List_Table' ) ) {
require_once WPCF7_PLUGIN_DIR . '/admin/includes/class-contact-forms-list-table.php';
}
add_filter(
'manage_' . $current_screen->id . '_columns',
array( 'WPCF7_Contact_Form_List_Table', 'define_columns' ),
10, 0
);
add_screen_option( 'per_page', array(
'default' => 20,
'option' => 'wpcf7_contact_forms_per_page',
) );
}
}
function wpcf7_admin_management_page() {
if ( $post = wpcf7_get_current_contact_form() ) {
$post_id = $post->initial() ? -1 : $post->id();
require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
return;
}
if (
'validate' === wpcf7_current_action() and
wpcf7_validate_configuration() and
current_user_can( 'wpcf7_edit_contact_forms' )
) {
wpcf7_admin_bulk_validate_page();
return;
}
$list_table = new WPCF7_Contact_Form_List_Table();
$list_table->prepare_items();
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-contact-form-list-table',
) );
$formatter->append_start_tag( 'h1', array(
'class' => 'wp-heading-inline',
) );
$formatter->append_preformatted(
esc_html( __( 'Contact Forms', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) {
$formatter->append_preformatted(
wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add Contact Form', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
)
);
}
if ( $search_keyword = wpcf7_superglobal_request( 's' ) ) {
$formatter->append_start_tag( 'span', array(
'class' => 'subtitle',
) );
$formatter->append_preformatted(
sprintf(
/* translators: %s: Search query. */
__( 'Search results for: <strong>%s</strong>', 'contact-form-7' ),
esc_html( $search_keyword )
)
);
$formatter->end_tag( 'span' );
}
$formatter->append_start_tag( 'hr', array(
'class' => 'wp-header-end',
) );
$formatter->call_user_func( static function () {
do_action( 'wpcf7_admin_warnings',
'wpcf7', wpcf7_current_action(), null
);
wpcf7_welcome_panel();
do_action( 'wpcf7_admin_notices',
'wpcf7', wpcf7_current_action(), null
);
} );
$formatter->append_start_tag( 'form', array(
'method' => 'get',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'name' => 'page',
'value' => wpcf7_superglobal_request( 'page' ),
) );
$formatter->call_user_func( static function () use ( $list_table ) {
$list_table->search_box(
__( 'Search Contact Forms', 'contact-form-7' ),
'wpcf7-contact'
);
$list_table->display();
} );
$formatter->print();
}
function wpcf7_admin_add_new_page() {
$post = wpcf7_get_current_contact_form();
if ( ! $post ) {
$post = WPCF7_ContactForm::get_template();
}
$post_id = -1;
require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
}
function wpcf7_load_integration_page() {
do_action( 'wpcf7_admin_load',
wpcf7_superglobal_get( 'page' ),
wpcf7_current_action()
);
$integration = WPCF7_Integration::get_instance();
if (
$service_name = wpcf7_superglobal_request( 'service' ) and
$integration->service_exists( $service_name )
) {
$service = $integration->get_service( $service_name );
$service->load( wpcf7_current_action() );
}
$help_tabs = new WPCF7_Help_Tabs( get_current_screen() );
$help_tabs->set_help_tabs( 'integration' );
}
function wpcf7_admin_integration_page() {
$integration = WPCF7_Integration::get_instance();
$service_name = wpcf7_superglobal_request( 'service' );
$service = null;
if ( $service_name and $integration->service_exists( $service_name ) ) {
$service = $integration->get_service( $service_name );
}
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'action' => true,
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-integration',
) );
$formatter->append_start_tag( 'h1' );
$formatter->append_preformatted(
esc_html( __( 'Integration with External API', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
$formatter->append_start_tag( 'p' );
$formatter->append_preformatted(
sprintf(
/* translators: %s: URL to support page about integration with external APIs */
__( 'You can expand the possibilities of your contact forms by integrating them with external services. For details, see <a href="%s">Integration with external APIs</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/integration-with-external-apis/', 'contact-form-7' )
)
);
$formatter->end_tag( 'p' );
$formatter->call_user_func(
static function () use ( $integration, $service, $service_name ) {
do_action( 'wpcf7_admin_warnings',
'wpcf7-integration', wpcf7_current_action(), $service
);
do_action( 'wpcf7_admin_notices',
'wpcf7-integration', wpcf7_current_action(), $service
);
if ( $service ) {
$message = wpcf7_superglobal_request( 'message' );
$service->admin_notice( $message );
$integration->list_services( array(
'include' => $service_name,
) );
} else {
$integration->list_services();
}
}
);
$formatter->print();
}
add_action( 'wpcf7_admin_notices', 'wpcf7_admin_updated_message', 10, 3 );
function wpcf7_admin_updated_message( $page, $action, $object ) {
if ( ! in_array( $page, array( 'wpcf7', 'wpcf7-new' ), true ) ) {
return;
}
$message_type = wpcf7_superglobal_request( 'message' );
if ( ! $message_type ) {
return;
}
$notice_type = 'success';
if ( 'created' === $message_type ) {
$message = __( 'Contact form created.', 'contact-form-7' );
} elseif ( 'saved' === $message_type ) {
$message = __( 'Contact form saved.', 'contact-form-7' );
} elseif ( 'deleted' === $message_type ) {
$message = __( 'Contact form deleted.', 'contact-form-7' );
} elseif ( 'failed' === $message_type ) {
$notice_type = 'error';
$message = __( 'There was an error saving the contact form.', 'contact-form-7' );
} elseif ( 'validated' === $message_type ) {
$bulk_validate = WPCF7::get_option( 'bulk_validate', array() );
$count_invalid = absint( $bulk_validate['count_invalid'] ?? 0 );
if ( $count_invalid ) {
$notice_type = 'warning';
$message = sprintf(
/* translators: %s: number of contact forms */
_n(
'Configuration validation completed. %s invalid contact form was found.',
'Configuration validation completed. %s invalid contact forms were found.',
$count_invalid, 'contact-form-7'
),
number_format_i18n( $count_invalid )
);
} else {
$message = __( 'Configuration validation completed. No invalid contact form was found.', 'contact-form-7' );
}
}
if ( ! empty( $message ) ) {
wp_admin_notice(
$message,
array( 'type' => $notice_type )
);
}
}
add_filter( 'plugin_action_links', 'wpcf7_plugin_action_links', 10, 2 );
function wpcf7_plugin_action_links( $links, $file ) {
if ( WPCF7_PLUGIN_BASENAME !== $file ) {
return $links;
}
if ( ! current_user_can( 'wpcf7_read_contact_forms' ) ) {
return $links;
}
$settings_link = wpcf7_link(
menu_page_url( 'wpcf7', false ),
__( 'Settings', 'contact-form-7' )
);
array_unshift( $links, $settings_link );
return $links;
}
add_action( 'wpcf7_admin_warnings', 'wpcf7_old_wp_version_error', 10, 3 );
function wpcf7_old_wp_version_error( $page, $action, $object ) {
$wp_version = get_bloginfo( 'version' );
if ( version_compare( $wp_version, WPCF7_REQUIRED_WP_VERSION, '<' ) ) {
wp_admin_notice(
sprintf(
/* translators: 1: version of Contact Form 7, 2: version of WordPress, 3: URL */
__( '<strong>Contact Form 7 %1$s requires WordPress %2$s or higher.</strong> Please <a href="%3$s">update WordPress</a> first.', 'contact-form-7' ),
WPCF7_VERSION,
WPCF7_REQUIRED_WP_VERSION,
admin_url( 'update-core.php' )
),
array( 'type' => 'warning' )
);
}
}
add_action( 'wpcf7_admin_warnings', 'wpcf7_not_allowed_to_edit', 10, 3 );
function wpcf7_not_allowed_to_edit( $page, $action, $object ) {
if ( $object instanceof WPCF7_ContactForm ) {
$contact_form = $object;
} else {
return;
}
if ( ! current_user_can( 'wpcf7_edit_contact_form', $contact_form->id() ) ) {
wp_admin_notice(
__( 'You are not allowed to edit this contact form.', 'contact-form-7' ),
array( 'type' => 'warning' )
);
}
}
add_action( 'wpcf7_admin_warnings', 'wpcf7_ctct_deprecated_warning', 10, 3 );
function wpcf7_ctct_deprecated_warning( $page, $action, $object ) {
$service = WPCF7_ConstantContact::get_instance();
if ( $service->is_active() ) {
wp_admin_notice(
__( 'Contact Form 7 has completed the <a href="https://contactform7.com/2025/01/08/complete-removal-of-constant-contact-integration/">removal of the Constant Contact integration</a>. We recommend <a href="https://contactform7.com/sendinblue-integration/">Brevo</a> as an alternative.', 'contact-form-7' ),
array( 'type' => 'warning' )
);
}
}
add_action( 'wpcf7_admin_warnings', 'wpcf7_captcha_future_warning', 10, 3 );
function wpcf7_captcha_future_warning( $page, $action, $object ) {
$service = WPCF7_RECAPTCHA::get_instance();
if ( $service->is_active() ) {
wp_admin_notice(
__( '<strong>Attention reCAPTCHA users:</strong> Google attempts to make all reCAPTCHA users migrate to reCAPTCHA Enterprise, meaning Google charges you for API calls exceeding the free tier. Contact Form 7 supports <a href="https://contactform7.com/turnstile-integration/">Cloudflare Turnstile</a>, and we recommend it unless you have reasons to use reCAPTCHA.', 'contact-form-7' ),
array( 'type' => 'warning' )
);
}
}

View File

@@ -0,0 +1,484 @@
<?php
// don't load directly
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
$save_button = sprintf(
'<input %s />',
wpcf7_format_atts( array(
'type' => 'submit',
'class' => 'button-primary',
'name' => 'wpcf7-save',
'value' => __( 'Save', 'contact-form-7' ),
) )
);
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'method' => true,
'action' => true,
'id' => true,
'class' => true,
'disabled' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
'id' => 'wpcf7-contact-form-editor',
) );
$formatter->append_start_tag( 'h1', array(
'class' => 'wp-heading-inline',
) );
$formatter->append_preformatted(
esc_html( $post->initial()
? __( 'Add Contact Form', 'contact-form-7' )
: __( 'Edit Contact Form', 'contact-form-7' )
)
);
$formatter->end_tag( 'h1' );
if ( ! $post->initial() and current_user_can( 'wpcf7_edit_contact_forms' ) ) {
$formatter->append_whitespace();
$formatter->append_preformatted(
wpcf7_link(
menu_page_url( 'wpcf7-new', false ),
__( 'Add Contact Form', 'contact-form-7' ),
array( 'class' => 'page-title-action' )
)
);
}
$formatter->append_start_tag( 'hr', array(
'class' => 'wp-header-end',
) );
$formatter->call_user_func( static function () use ( $post ) {
do_action( 'wpcf7_admin_warnings',
$post->initial() ? 'wpcf7-new' : 'wpcf7',
wpcf7_current_action(),
$post
);
do_action( 'wpcf7_admin_notices',
$post->initial() ? 'wpcf7-new' : 'wpcf7',
wpcf7_current_action(),
$post
);
} );
if ( $post ) {
$formatter->append_start_tag( 'form', array(
'method' => 'post',
'action' => esc_url( add_query_arg(
array( 'post' => $post_id ),
menu_page_url( 'wpcf7', false )
) ),
'id' => 'wpcf7-admin-form-element',
'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
) );
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->call_user_func( static function () use ( $post_id ) {
wp_nonce_field( 'wpcf7-save-contact-form_' . $post_id );
} );
}
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'post_ID',
'name' => 'post_ID',
'value' => (int) $post_id,
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'wpcf7-locale',
'name' => 'wpcf7-locale',
'value' => $post->locale(),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'hiddenaction',
'name' => 'action',
'value' => 'save',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'id' => 'active-tab',
'name' => 'active-tab',
'value' => wpcf7_superglobal_get( 'active-tab' ),
) );
$formatter->append_start_tag( 'div', array(
'id' => 'poststuff',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'post-body',
'class' => 'metabox-holder columns-2 wp-clearfix',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'post-body-content',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'titlediv',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'titlewrap',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'name' => 'post_title',
'value' => $post->initial() ? '' : $post->title(),
'id' => 'title',
'spellcheck' => 'true',
'autocomplete' => 'off',
'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
'placeholder' => __( 'Enter title here', 'contact-form-7' ),
'aria-label' => __( 'Enter title here', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // #titlewrap
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
if ( ! $post->initial() ) {
if ( $shortcode = $post->shortcode() ) {
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => 'wpcf7-shortcode',
) );
$formatter->append_preformatted(
esc_html( __( 'Copy this shortcode and paste it into your post, page, or text widget content:', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
$formatter->append_whitespace();
$formatter->append_start_tag( 'span', array(
'class' => 'shortcode wp-ui-highlight',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => 'wpcf7-shortcode',
'readonly' => true,
'class' => 'large-text code selectable',
'value' => $shortcode,
) );
$formatter->end_tag( 'p' );
}
if ( $shortcode = $post->shortcode( array( 'use_old_format' => true ) ) ) {
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => 'wpcf7-shortcode-old',
) );
$formatter->append_preformatted(
esc_html( __( 'You can also use this old-style shortcode:', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
$formatter->append_whitespace();
$formatter->append_start_tag( 'span', array(
'class' => 'shortcode old',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => 'wpcf7-shortcode-old',
'readonly' => true,
'class' => 'large-text code selectable',
'value' => $shortcode,
) );
$formatter->end_tag( 'p' );
}
}
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'div' ); // #titlediv
$formatter->end_tag( 'div' ); // #post-body-content
$formatter->append_start_tag( 'div', array(
'id' => 'postbox-container-1',
'class' => 'postbox-container',
) );
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->append_start_tag( 'section', array(
'id' => 'submitdiv',
'class' => 'postbox',
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Status', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
$formatter->append_start_tag( 'div', array(
'class' => 'submitbox',
'id' => 'submitpost',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'minor-publishing-actions',
) );
$formatter->append_start_tag( 'div', array(
'class' => 'hidden',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'class' => 'button-primary',
'name' => 'wpcf7-save',
'value' => __( 'Save', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // .hidden
if ( ! $post->initial() ) {
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'name' => 'wpcf7-copy',
'class' => 'copy button',
'value' => __( 'Duplicate', 'contact-form-7' ),
) );
}
$formatter->end_tag( 'div' ); // #minor-publishing-actions
$formatter->append_start_tag( 'div', array(
'id' => 'misc-publishing-actions',
) );
$formatter->call_user_func( static function () use ( $post_id ) {
do_action( 'wpcf7_admin_misc_pub_section', $post_id );
} );
$formatter->end_tag( 'div' ); // #misc-publishing-actions
$formatter->append_start_tag( 'div', array(
'id' => 'major-publishing-actions',
) );
if ( ! $post->initial() ) {
$formatter->append_start_tag( 'div', array(
'id' => 'delete-action',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'name' => 'wpcf7-delete',
'class' => 'delete submitdelete',
'value' => __( 'Delete', 'contact-form-7' ),
) );
$formatter->end_tag( 'div' ); // #delete-action
}
$formatter->append_start_tag( 'div', array(
'id' => 'publishing-action',
) );
$formatter->append_preformatted( '<span class="spinner"></span>' );
$formatter->append_preformatted( $save_button );
$formatter->end_tag( 'div' ); // #publishing-action
$formatter->append_preformatted( '<div class="clear"></div>' );
$formatter->end_tag( 'div' ); // #major-publishing-actions
$formatter->end_tag( 'div' ); // #submitpost
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'section' ); // #submitdiv
}
$formatter->append_start_tag( 'section', array(
'id' => 'informationdiv',
'class' => 'postbox',
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Do you need help?', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'div', array(
'class' => 'inside',
) );
$formatter->append_start_tag( 'p' );
$formatter->append_preformatted(
esc_html( __( 'Here are some available options to help solve your problems.', 'contact-form-7' ) )
);
$formatter->end_tag( 'p' );
$formatter->append_start_tag( 'ol' );
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
sprintf(
/* translators: 1: URL to FAQ, 2: URL to docs */
'<a href="%1$s">FAQ</a> and <a href="%2$s">docs</a>',
__( 'https://contactform7.com/faq/', 'contact-form-7' ),
__( 'https://contactform7.com/docs/', 'contact-form-7' )
)
);
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://wordpress.org/support/plugin/contact-form-7/', 'contact-form-7' ),
__( 'Support forums', 'contact-form-7' )
)
);
$formatter->append_start_tag( 'li' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://contactform7.com/custom-development/', 'contact-form-7' ),
__( 'Professional services', 'contact-form-7' )
)
);
$formatter->end_tag( 'ol' );
$formatter->end_tag( 'div' ); // .inside
$formatter->end_tag( 'section' ); // #informationdiv
$formatter->end_tag( 'div' ); // #postbox-container-1
$formatter->append_start_tag( 'div', array(
'id' => 'postbox-container-2',
'class' => 'postbox-container',
) );
$formatter->append_start_tag( 'div', array(
'id' => 'contact-form-editor',
) );
$formatter->call_user_func( static function () use ( $post, $post_id ) {
$editor = new WPCF7_Editor( $post );
$panels = array();
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$panels = array(
'form-panel' => array(
'title' => __( 'Form', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_form',
),
'mail-panel' => array(
'title' => __( 'Mail', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_mail',
),
'messages-panel' => array(
'title' => __( 'Messages', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_messages',
),
);
$additional_settings = $post->prop( 'additional_settings' );
if ( ! is_scalar( $additional_settings ) ) {
$additional_settings = '';
}
$additional_settings = trim( $additional_settings );
$additional_settings = explode( "\n", $additional_settings );
$additional_settings = array_filter( $additional_settings );
$additional_settings = count( $additional_settings );
$panels['additional-settings-panel'] = array(
'title' => $additional_settings
? sprintf(
/* translators: %d: number of additional settings */
__( 'Additional Settings (%d)', 'contact-form-7' ),
$additional_settings
)
: __( 'Additional Settings', 'contact-form-7' ),
'callback' => 'wpcf7_editor_panel_additional_settings',
);
}
$panels = apply_filters( 'wpcf7_editor_panels', $panels );
foreach ( $panels as $id => $panel ) {
$editor->add_panel( $id, $panel['title'], $panel['callback'] );
}
$editor->display();
} );
$formatter->end_tag( 'div' ); // #contact-form-editor
if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
$formatter->append_start_tag( 'p', array(
'class' => 'submit',
) );
$formatter->append_preformatted( $save_button );
$formatter->end_tag( 'p' );
}
$formatter->end_tag( 'div' ); // #postbox-container-2
$formatter->end_tag( 'div' ); // #post-body
$formatter->append_preformatted( '<br class="clear" />' );
$formatter->end_tag( 'div' ); // #poststuff
$formatter->end_tag( 'form' );
}
$formatter->end_tag( 'div' ); // .wrap
$formatter->print();
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_panels( $post );
do_action( 'wpcf7_admin_footer', $post );

View File

@@ -0,0 +1,22 @@
<?php
function wpcf7_current_action() {
foreach ( array( 'action', 'action2' ) as $var ) {
$action = wpcf7_superglobal_request( $var, null );
if ( isset( $action ) and -1 !== $action ) {
return $action;
}
}
return false;
}
function wpcf7_admin_has_edit_cap() {
return current_user_can( 'wpcf7_edit_contact_forms' );
}
function wpcf7_add_tag_generator( $name, $title, $elm_id, $callback, $options = array() ) {
$tag_generator = WPCF7_TagGenerator::get_instance();
return $tag_generator->add( $name, $title, $callback, $options );
}

View File

@@ -0,0 +1,241 @@
<?php
if ( ! class_exists( 'WP_List_Table' ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
}
class WPCF7_Contact_Form_List_Table extends WP_List_Table {
public static function define_columns() {
$columns = array(
'cb' => '<input type="checkbox" />',
'title' => __( 'Title', 'contact-form-7' ),
'shortcode' => __( 'Shortcode', 'contact-form-7' ),
'author' => __( 'Author', 'contact-form-7' ),
'date' => __( 'Date', 'contact-form-7' ),
);
return $columns;
}
public function __construct() {
parent::__construct( array(
'singular' => 'post',
'plural' => 'posts',
'ajax' => false,
) );
}
public function prepare_items() {
$current_screen = get_current_screen();
$per_page = $this->get_items_per_page( 'wpcf7_contact_forms_per_page' );
$args = array(
'posts_per_page' => $per_page,
'orderby' => 'title',
'order' => 'ASC',
'offset' => ( $this->get_pagenum() - 1 ) * $per_page,
);
if ( $search_keyword = wpcf7_superglobal_request( 's' ) ) {
$args['s'] = $search_keyword;
}
if ( $order_by = wpcf7_superglobal_request( 'orderby' ) ) {
$args['orderby'] = $order_by;
}
if (
$order = wpcf7_superglobal_request( 'order' ) and
'desc' === strtolower( $order )
) {
$args['order'] = 'DESC';
}
$this->items = WPCF7_ContactForm::find( $args );
$total_items = WPCF7_ContactForm::count();
$total_pages = ceil( $total_items / $per_page );
$this->set_pagination_args( array(
'total_items' => $total_items,
'total_pages' => $total_pages,
'per_page' => $per_page,
) );
}
public function get_columns() {
return get_column_headers( get_current_screen() );
}
protected function get_sortable_columns() {
$columns = array(
'title' => array( 'title', true ),
'author' => array( 'author', false ),
'date' => array( 'date', false ),
);
return $columns;
}
protected function get_bulk_actions() {
$actions = array(
'delete' => __( 'Delete', 'contact-form-7' ),
);
return $actions;
}
protected function column_default( $item, $column_name ) {
return '';
}
public function column_cb( $item ) {
return sprintf(
'<input type="checkbox" name="%1$s[]" value="%2$s" />',
$this->_args['singular'],
$item->id()
);
}
public function column_title( $item ) {
$edit_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'edit',
),
menu_page_url( 'wpcf7', false )
);
$output = sprintf(
'<a class="row-title" href="%1$s" aria-label="%2$s">%3$s</a>',
esc_url( $edit_link ),
esc_attr( sprintf(
/* translators: %s: title of contact form */
__( 'Edit &#8220;%s&#8221;', 'contact-form-7' ),
$item->title()
) ),
esc_html( $item->title() )
);
$output = sprintf( '<strong>%s</strong>', $output );
if ( wpcf7_validate_configuration()
and current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
$config_validator = new WPCF7_ConfigValidator( $item );
$config_validator->restore();
if ( $count_errors = $config_validator->count_errors() ) {
$error_notice = sprintf(
/* translators: %s: number of errors detected */
_n(
'%s configuration error detected',
'%s configuration errors detected',
$count_errors, 'contact-form-7' ),
number_format_i18n( $count_errors )
);
$output .= sprintf(
'<div class="config-error"><span class="icon-in-circle" aria-hidden="true">!</span> %s</div>',
$error_notice
);
}
}
return $output;
}
protected function handle_row_actions( $item, $column_name, $primary ) {
if ( $column_name !== $primary ) {
return '';
}
$edit_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'edit',
),
menu_page_url( 'wpcf7', false )
);
$actions = array(
'edit' => wpcf7_link( $edit_link, __( 'Edit', 'contact-form-7' ) ),
);
if ( current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
$copy_link = add_query_arg(
array(
'post' => absint( $item->id() ),
'action' => 'copy',
),
menu_page_url( 'wpcf7', false )
);
$copy_link = wp_nonce_url(
$copy_link,
'wpcf7-copy-contact-form_' . absint( $item->id() )
);
$actions = array_merge( $actions, array(
'copy' => wpcf7_link( $copy_link, __( 'Duplicate', 'contact-form-7' ) ),
) );
}
return $this->row_actions( $actions );
}
public function column_author( $item ) {
$post = get_post( $item->id() );
if ( ! $post ) {
return;
}
$author = get_userdata( $post->post_author );
if ( false === $author ) {
return;
}
return esc_html( $author->display_name );
}
public function column_shortcode( $item ) {
$shortcodes = array( $item->shortcode() );
$output = '';
foreach ( $shortcodes as $shortcode ) {
$output .= "\n" . sprintf(
'<span class="shortcode"><input %s /></span>',
wpcf7_format_atts( array(
'type' => 'text',
'readonly' => true,
'value' => $shortcode,
'class' => 'large-text code selectable',
) )
);
}
return trim( $output );
}
public function column_date( $item ) {
$datetime = get_post_datetime( $item->id() );
if ( false === $datetime ) {
return '';
}
$t_time = sprintf(
/* translators: 1: date, 2: time */
__( '%1$s at %2$s', 'contact-form-7' ),
/* translators: date format, see https://www.php.net/date */
$datetime->format( __( 'Y/m/d', 'contact-form-7' ) ),
/* translators: time format, see https://www.php.net/date */
$datetime->format( __( 'g:i a', 'contact-form-7' ) )
);
return $t_time;
}
}

View File

@@ -0,0 +1,180 @@
<?php
add_action( 'wpcf7_admin_menu', 'wpcf7_admin_init_bulk_cv', 10, 0 );
function wpcf7_admin_init_bulk_cv() {
if (
! wpcf7_validate_configuration() or
! current_user_can( 'wpcf7_edit_contact_forms' )
) {
return;
}
$result = WPCF7::get_option( 'bulk_validate' );
$last_important_update = WPCF7_ConfigValidator::last_important_update;
if (
! empty( $result['version'] ) and
version_compare( $last_important_update, $result['version'], '<=' )
) {
return;
}
add_filter( 'wpcf7_admin_menu_change_notice',
'wpcf7_admin_menu_change_notice_bulk_cv',
10, 1
);
add_action( 'wpcf7_admin_warnings',
'wpcf7_admin_warnings_bulk_cv',
5, 3
);
}
function wpcf7_admin_menu_change_notice_bulk_cv( $counts ) {
$counts['wpcf7'] += 1;
return $counts;
}
function wpcf7_admin_warnings_bulk_cv( $page, $action, $object ) {
if ( 'wpcf7' === $page and 'validate' === $action ) {
return;
}
wp_admin_notice(
sprintf(
'%1$s &raquo; %2$s',
__( 'Misconfiguration leads to mail delivery failure or other troubles. Validate your contact forms now.', 'contact-form-7' ),
wpcf7_link(
add_query_arg(
array( 'action' => 'validate' ),
menu_page_url( 'wpcf7', false )
),
__( 'Validate Contact Form 7 Configuration', 'contact-form-7' )
)
),
array( 'type' => 'warning' )
);
}
add_action( 'wpcf7_admin_load', 'wpcf7_load_bulk_validate_page', 10, 2 );
function wpcf7_load_bulk_validate_page( $page, $action ) {
if (
'wpcf7' !== $page or
'validate' !== $action or
! wpcf7_validate_configuration() or
'POST' !== wpcf7_superglobal_server( 'REQUEST_METHOD' )
) {
return;
}
check_admin_referer( 'wpcf7-bulk-validate' );
if ( ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
wp_die( wp_kses_data( __( 'You are not allowed to validate configuration.', 'contact-form-7' ) ) );
}
$contact_forms = WPCF7_ContactForm::find();
$result = array(
'timestamp' => time(),
'version' => WPCF7_VERSION,
'count_valid' => 0,
'count_invalid' => 0,
);
foreach ( $contact_forms as $contact_form ) {
$config_validator = new WPCF7_ConfigValidator( $contact_form );
$config_validator->validate();
$config_validator->save();
if ( $config_validator->is_valid() ) {
$result['count_valid'] += 1;
} else {
$result['count_invalid'] += 1;
}
}
WPCF7::update_option( 'bulk_validate', $result );
$redirect_to = add_query_arg(
array(
'message' => 'validated',
),
menu_page_url( 'wpcf7', false )
);
wp_safe_redirect( $redirect_to );
exit();
}
function wpcf7_admin_bulk_validate_page() {
$contact_forms = WPCF7_ContactForm::find();
$count = WPCF7_ContactForm::count();
$submit_text = sprintf(
/* translators: %s: number of contact forms */
_n(
'Validate %s contact form now',
'Validate %s contact forms now',
$count, 'contact-form-7'
),
number_format_i18n( $count )
);
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'form' => array(
'action' => true,
'method' => true,
),
) ),
) );
$formatter->append_start_tag( 'div', array(
'class' => 'wrap',
) );
$formatter->append_start_tag( 'h1' );
$formatter->append_preformatted(
esc_html( __( 'Validate Configuration', 'contact-form-7' ) )
);
$formatter->end_tag( 'h1' );
$formatter->append_start_tag( 'form', array(
'method' => 'post',
'action' => '',
) );
$formatter->append_start_tag( 'p' );
$formatter->call_user_func( static function () {
wp_nonce_field( 'wpcf7-bulk-validate' );
} );
$formatter->append_start_tag( 'input', array(
'type' => 'hidden',
'name' => 'action',
'value' => 'validate',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'submit',
'class' => 'button',
'value' => $submit_text,
) );
$formatter->end_tag( 'form' );
$formatter->append_preformatted(
wpcf7_link(
__( 'https://contactform7.com/configuration-validator-faq/', 'contact-form-7' ),
__( 'FAQ about Configuration Validator', 'contact-form-7' )
)
);
$formatter->print();
}

View File

@@ -0,0 +1,77 @@
/*
* Form Tab
*/
.tag-generator-panel {
text-align: right;
}
.tag-generator-dialog > .close-button {
right: auto;
left: 8px;
}
form.tag-generator-panel[data-version="1"] {
.control-box > fieldset > legend {
border: 1px solid #dfdfdf;
border-right: 4px solid #00a0d2;
}
.insert-box input.tag {
float: right;
}
.insert-box .submitbox input[type="button"] {
float: left;
}
}
/*
* Mail Tab
*/
.contact-form-editor-box-mail span.mailtag {
margin: 0 4px 0 0;
}
/*
* Welcome Panel
*/
.wpcf7-welcome-panel .welcome-panel-close {
left: 10px;
right: auto;
padding: 10px 21px 10px 15px;
}
.wpcf7-welcome-panel .welcome-panel-close::before {
right: 0;
left: auto;
}
.wpcf7-welcome-panel .welcome-panel-content {
margin-right: 13px;
}
.wpcf7-welcome-panel .welcome-panel-column {
float: right;
padding: 0 0 0 2%;
}
/*
* Integration
*/
.card {
border-left: 1px solid #e5e5e5;
border-right: 4px solid #e5e5e5;
}
.card img.icon {
float: right;
margin: 8px -8px 8px 8px;
}
.card h2.title {
float: right;
}
.card .infobox {
float: left;
}

View File

@@ -0,0 +1,614 @@
#titlediv .inside p.description {
margin: 8px 2px 0;
}
#titlediv .inside p.description label {
cursor: pointer;
}
span.shortcode {
display: block;
margin: 2px 0;
}
span.shortcode.old {
background: #777;
color: #fff;
}
span.shortcode input {
font-size: 12px;
border: none;
box-shadow: none;
padding: 4px 8px;
margin: 0;
}
#wpcf7-contact-form-list-table span.shortcode input,
#wpcf7-contact-form-editor span.shortcode input {
background: transparent;
}
#wpcf7-contact-form-list-table span.shortcode input {
color: #444;
}
#wpcf7-contact-form-editor span.shortcode input {
color: #fff;
width: 100%;
}
#submitpost input.copy {
margin-bottom: 10px;
}
#submitpost input.delete {
padding: 0;
margin: 0;
border: none;
cursor: pointer;
background: inherit;
color: #a00;
}
#submitpost input.delete:hover {
color: #dc3232; /* Red */
}
#submitpost input.delete:focus {
outline: thin dotted;
}
.postbox-container .postbox h3 {
border-bottom: 1px solid transparent;
}
div.config-error, span.config-error, ul.config-error {
color: #444;
font-style: normal;
font-size: 13px;
}
ul.config-error {
margin: 2px 0;
}
ul.config-error li {
list-style: none;
padding: 2px 2px;
margin: 0;
}
#misc-publishing-actions .config-error {
line-height: 2;
}
[data-config-field][aria-invalid="true"] {
border-color: #dc3232;
}
#contact-form-editor-tabs .icon-in-circle,
#contact-form-editor .config-error .icon-in-circle,
.wp-list-table .config-error .icon-in-circle,
.icon-in-circle {
display: inline-block;
vertical-align: baseline;
margin: 1px 6px 0;
padding: 0 5px;
min-width: 7px;
height: 17px;
border-radius: 11px;
background-color: #ca4a1f;
color: #fff;
font-size: 12px;
font-weight: bold;
line-height: 17px;
text-align: center;
z-index: 26;
}
/*
* Tabs
*/
#contact-form-editor-tabs {
border-bottom: 1px solid #aaa;
padding: 9px 10px 0;
margin: 0;
}
#contact-form-editor-tabs button {
display: inline-block;
border: 1px solid #ccc;
border-bottom: 1px solid #aaa;
padding: 6px 10px;
margin: 0 4px -1px;
color: #333;
background-color: #e4e4e4;
font-size: 14px;
font-weight: normal;
line-height: 20px;
}
#contact-form-editor-tabs button[aria-selected="true"] {
border-top: 1px solid #aaa;
border-right: 1px solid #aaa;
border-left: 1px solid #aaa;
border-bottom: 1px solid #f5f5f5;
color: #000;
background-color: #f5f5f5;
font-weight: bold;
}
#contact-form-editor-tabs button:hover {
color: #000;
}
#contact-form-editor .contact-form-editor-panel > div.config-error {
margin-bottom: 1.4em;
}
#contact-form-editor-tabs button[aria-selected="true"] .icon-in-circle {
display: none;
}
#contact-form-editor .contact-form-editor-panel h2 {
font-size: 18px;
font-weight: 400;
line-height: 24px;
margin: 8px 0;
padding: 0;
}
#contact-form-editor .contact-form-editor-panel {
background-color: #f5f5f5;
border: 1px solid #aaa;
border-top: none;
padding: 16px;
}
#contact-form-editor .form-table th {
width: 100px;
}
#contact-form-editor .contact-form-editor-panel fieldset legend {
line-height: 1.5;
margin: .6em 0 .4em;
}
/*
* Form Tab
*/
#tag-generator-list button {
font-size: 12px;
height: 26px;
line-height: 24px;
margin: 2px;
padding: 0 8px 1px;
}
.tag-generator-dialog {
padding: 12px;
border: 1px solid #c3c4c7;
box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.04 );
height: 720px;
width: 720px;
overflow: auto;
}
.tag-generator-dialog::backdrop {
background: rgb( 0 0 0 / 50% );
}
.tag-generator-dialog > .close-button {
position: absolute;
top: 8px;
right: 8px;
}
form.tag-generator-panel {
display: flex;
flex-direction: column;
height: 720px;
width: 720px;
max-height: 100%;
max-width: 100%;
margin-block-end: 0;
}
form.tag-generator-panel[data-version="2"] {
&:invalid .mail-tag-tip {
display: none;
}
.description-box {
box-sizing: border-box;
flex: none;
margin-inline: -12px;
padding-inline: 12px;
border-bottom: 1px solid #dfdfdf;
}
.control-box {
box-sizing: border-box;
flex: auto;
display: flex;
flex-direction: column;
gap: 12px 0;
min-height: 120px;
overflow: auto;
}
.control-box > fieldset {
margin-block: 8px;
margin-inline-start: 10em;
line-height: 2.25;
}
.control-box > fieldset > legend {
font-weight: bolder;
margin-block: 8px;
margin-inline-start: -10em;
line-height: 1.25;
}
.control-box input[type="text"] {
width: 20rem;
max-width: 88%;
}
.control-box input[type="number"] {
width: 8rem;
max-width: 44%;
}
.control-box textarea {
height: 12ex;
width: 20rem;
max-width: 88%;
}
.control-box select {
width: 20rem;
max-width: 88%;
}
.control-box input:invalid,
.control-box textarea:invalid {
background-color: #ffe9de;
}
.insert-box {
box-sizing: border-box;
flex: none;
margin-block-end: -12px;
margin-inline: -12px;
padding-block: 24px 12px;
padding-inline: 12px;
background-color: #fcfcfc;
border-top: 1px solid #dfdfdf;
}
.insert-box .flex-container {
display: flex;
}
.insert-box .flex-container > [data-tag-part="tag"] {
flex: auto;
margin-inline-end: 8px;
}
.insert-box .mail-tag-tip::before {
font: 1.2rem dashicons;
content: "\f348" / '';
color: #646970;
padding-inline-end: 4px;
vertical-align: top;
}
}
form.tag-generator-panel[data-version="1"] {
.control-box {
padding: 0;
margin: 0;
overflow: auto;
flex-grow: 1;
}
.control-box > fieldset > legend {
border: 1px solid #dfdfdf;
border-left: 4px solid #00a0d2;
background: #f7fcfe;
padding: 4px 12px;
margin: 4px 0;
line-height: 1.4em;
width: 100%;
box-sizing: border-box;
}
table {
width: 100%;
}
table.form-table th {
width: 120px;
padding: 4px 10px 4px 0;
font-size: 13px;
}
table.form-table td {
padding: 4px 10px;
font-size: 13px;
}
.control-box input.oneline {
width: 200px;
}
.control-box input.large-text {
width: 400px;
}
.control-box textarea.values {
width: 200px;
height: 6em;
}
.control-box input[type="number"],
.control-box input[type="date"] {
width: 88px;
}
.control-box table caption {
text-align: left;
font-size: 110%;
font-weight: bold;
color: #777;
margin: 10px 0 5px;
}
.control-box table.form-table td label {
line-height: 1.1em;
}
.control-box table.form-table td label .description {
line-height: 1.4em;
}
.insert-box {
margin: 0 -15px -15px;
padding: 8px 16px;
background-color: #fcfcfc;
border-top: 1px solid #dfdfdf;
overflow: auto;
}
.insert-box input.tag {
width: 510px;
float: left;
background-color: transparent;
box-shadow: none;
}
.insert-box .submitbox {
padding: 0;
}
.insert-box .submitbox input[type="button"] {
float: right;
}
.insert-box .description label {
cursor: text;
}
}
/*
* Mail Tab
*/
.contact-form-editor-box-mail span.mailtag {
display: inline-block;
margin: 0 0 0 4px;
padding: 1px 2px;
cursor: pointer;
color: #000;
}
.contact-form-editor-box-mail span.mailtag.used {
color: #666;
}
.contact-form-editor-box-mail span.mailtag.unused {
font-weight: bold;
}
/*
* Messages Tab
*/
#messages-panel p.description {
margin: 5px 0 10px;
}
/*
* Tabs for integration modules
*/
#sendinblue-panel table tr.inactive ~ tr {
display: none;
}
#sendinblue-panel .dashicons {
text-decoration: none;
}
#sendinblue-panel td p {
margin-top: 12px;
}
/*
* List Table
*/
.fixed .column-title {
width: 38%;
}
.fixed .column-shortcode {
width: 38%;
}
/*
* Welcome Panel
*/
.wpcf7-welcome-panel {
position: relative;
overflow: auto;
margin: 16px 0;
padding: 23px 10px 0;
border: 1px solid #c3c4c7;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
background: #fff;
font-size: 13px;
line-height: 1.7;
}
.wpcf7-welcome-panel h3 {
font-size: 16px;
font-weight: 600;
line-height: 2.1em;
margin: 1em 0 1.2em;
}
.wpcf7-welcome-panel h3 .dashicons {
position: relative;
top: -2px;
display: inline-block;
width: 60px;
color: #575757;
font-size: 40px;
}
.wpcf7-welcome-panel p {
color: #646970;
}
.wpcf7-welcome-panel p a {
font-weight: bold;
}
.wpcf7-welcome-panel .welcome-panel-close {
position: absolute;
z-index: 2;
top: 10px;
right: 10px;
padding: 10px 15px 10px 21px;
font-size: 13px;
line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
text-decoration: none;
}
.wpcf7-welcome-panel .welcome-panel-close::before {
background: 0 0;
color: #787c82;
content: "\f153" / '';
display: block;
font: normal 16px/20px dashicons;
speak: never;
height: 20px;
text-align: center;
width: 20px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
position: absolute;
top: 8px;
left: 0;
transition: all .1s ease-in-out;
}
.wpcf7-welcome-panel .welcome-panel-content {
display: block;
margin-left: 13px;
max-width: 1500px;
min-height: auto;
}
.wpcf7-welcome-panel .welcome-panel-column-container {
clear: both;
position: relative;
}
.wpcf7-welcome-panel .welcome-panel-column {
display: block;
width: 48%;
min-width: 200px;
float: left;
padding: 0 2% 0 0;
margin: 0 0 1em 0;
}
@media screen and (max-width: 870px) {
.wpcf7-welcome-panel .welcome-panel-column {
display: block;
float: none;
width: 100%;
}
}
.wpcf7-welcome-panel .welcome-panel-column p {
margin-top: 7px;
color: #3c434a;
}
/*
* Integration
*/
.card {
background: #fff none repeat scroll 0 0;
border: 1px solid #e5e5e5;
border-left: 4px solid #e5e5e5;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
margin-top: 20px;
max-width: 520px;
min-width: 255px;
padding: 0.7em 2em 1em;
position: relative;
}
.card.active {
border-color: #00a0d2;
}
#constant_contact.card.active {
border-color: #dc3232;
}
.card img.icon {
float: left;
margin: 8px 8px 8px -8px;
}
.card h2.title {
float: left;
max-width: 240px;
font-size: 1.3em;
font-weight: 600;
}
.card .infobox {
float: right;
font-size: 13px;
color: #666;
margin: 1em;
line-height: 1.5;
max-width: 240px;
}
.card .inside .form-table th {
padding: 15px 10px 15px 0;
width: 160px;
}
.card .inside .form-table td {
padding: 10px 10px;
}
.card .checkboxes li {
margin: 0;
}

View File

@@ -0,0 +1,556 @@
<?php
class WPCF7_Editor {
private $contact_form;
private $panels = array();
public function __construct( WPCF7_ContactForm $contact_form ) {
$this->contact_form = $contact_form;
}
public function add_panel( $panel_id, $title, $callback ) {
if ( wpcf7_is_name( $panel_id ) ) {
$this->panels[$panel_id] = array(
'title' => $title,
'callback' => $callback,
);
}
}
public function display() {
if ( empty( $this->panels ) ) {
return;
}
$active_panel_id = wpcf7_superglobal_get( 'active-tab' );
if ( ! array_key_exists( $active_panel_id, $this->panels ) ) {
$active_panel_id = array_key_first( $this->panels );
}
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'nav', array(
'id' => 'contact-form-editor-tabs',
'role' => 'tablist',
'aria-label' => __( 'Contact form editor tabs', 'contact-form-7' ),
'data-active-tab' => absint( array_search(
$active_panel_id, array_keys( $this->panels ), true
) ),
) );
foreach ( $this->panels as $panel_id => $panel ) {
$active = $panel_id === $active_panel_id;
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'role' => 'tab',
'aria-selected' => $active ? 'true' : 'false',
'aria-controls' => $panel_id,
'id' => sprintf( '%s-tab', $panel_id ),
'tabindex' => $active ? '0' : '-1',
) );
$formatter->append_preformatted( esc_html( $panel['title'] ) );
}
$formatter->end_tag( 'nav' );
foreach ( $this->panels as $panel_id => $panel ) {
$active = $panel_id === $active_panel_id;
$formatter->append_start_tag( 'section', array(
'role' => 'tabpanel',
'aria-labelledby' => sprintf( '%s-tab', $panel_id ),
'id' => $panel_id,
'class' => 'contact-form-editor-panel',
'tabindex' => '0',
'hidden' => ! $active,
) );
if ( is_callable( $panel['callback'] ) ) {
$formatter->call_user_func( $panel['callback'], $this->contact_form );
}
$formatter->end_tag( 'section' );
}
$formatter->print();
}
}
function wpcf7_editor_panel_form( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the form template */
__( 'You can edit the form template here. For details, see <a href="%s">Editing form template</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/editing-form-template/', 'contact-form-7' )
);
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted( esc_html( __( 'Form', 'contact-form-7' ) ) );
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
$formatter->call_user_func( static function () {
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_buttons();
} );
$formatter->append_start_tag( 'textarea', array(
'id' => 'wpcf7-form',
'name' => 'wpcf7-form',
'cols' => 100,
'rows' => 24,
'class' => 'large-text code',
'data-config-field' => 'form.body',
) );
$formatter->append_preformatted( esc_textarea( $post->prop( 'form' ) ) );
$formatter->end_tag( 'textarea' );
$formatter->print();
}
function wpcf7_editor_panel_mail( $post ) {
wpcf7_editor_box_mail( $post );
echo '<br class="clear" />';
wpcf7_editor_box_mail( $post, array(
'id' => 'wpcf7-mail-2',
'name' => 'mail_2',
'title' => __( 'Mail (2)', 'contact-form-7' ),
'use' => __( 'Use Mail (2)', 'contact-form-7' ),
) );
}
function wpcf7_editor_box_mail( $post, $options = '' ) {
$options = wp_parse_args( $options, array(
'id' => 'wpcf7-mail',
'name' => 'mail',
'title' => __( 'Mail', 'contact-form-7' ),
'use' => null,
) );
$id = esc_attr( $options['id'] );
$mail = wp_parse_args( $post->prop( $options['name'] ), array(
'active' => false,
'recipient' => '',
'sender' => '',
'subject' => '',
'body' => '',
'additional_headers' => '',
'attachments' => '',
'use_html' => false,
'exclude_blank' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'contact-form-editor-box-mail',
'id' => $id,
) );
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'h2' );
if ( ! empty( $options['use'] ) ) {
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-active', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-active', $id ),
'name' => sprintf( '%s[active]', $id ),
'data-config-field' => '',
'data-toggle' => sprintf( '%s-fieldset', $id ),
'value' => '1',
'checked' => $mail['active'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted( esc_html( $options['use'] ) );
$formatter->end_tag( 'label' );
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_preformatted(
esc_html( __( 'Mail (2) is an additional mail template often used as an autoresponder.', 'contact-form-7' ) )
);
$formatter->end_tag( 'p' );
}
$formatter->append_start_tag( 'fieldset', array(
'id' => sprintf( '%s-fieldset', $id ),
) );
$formatter->append_start_tag( 'legend' );
$description = sprintf(
/* translators: %s: URL to support page about the email template */
__( 'You can edit the email template here. For details, see <a href="%s">Setting up mail</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/setting-up-mail/', 'contact-form-7' )
);
$formatter->append_preformatted( $description );
$formatter->append_start_tag( 'br' );
$formatter->append_preformatted(
esc_html( __( 'In the following fields, you can use these mail-tags:', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'br' );
$formatter->call_user_func( static function () use ( $post, $options ) {
$post->suggest_mail_tags( $options['name'] );
} );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'table', array(
'class' => 'form-table',
) );
$formatter->append_start_tag( 'tbody' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-recipient', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'To', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-recipient', $id ),
'name' => sprintf( '%s[recipient]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['recipient'],
'data-config-field' => sprintf( '%s.recipient', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-sender', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'From', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-sender', $id ),
'name' => sprintf( '%s[sender]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['sender'],
'data-config-field' => sprintf( '%s.sender', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-subject', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Subject', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => sprintf( '%s-subject', $id ),
'name' => sprintf( '%s[subject]', $id ),
'class' => 'large-text code',
'size' => 70,
'value' => $mail['subject'],
'data-config-field' => sprintf( '%s.subject', $options['name'] ),
) );
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-additional-headers', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Additional headers', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-additional-headers', $id ),
'name' => sprintf( '%s[additional_headers]', $id ),
'cols' => 100,
'rows' => 4,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.additional_headers', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['additional_headers'] )
);
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-body', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'Message body', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-body', $id ),
'name' => sprintf( '%s[body]', $id ),
'cols' => 100,
'rows' => 18,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.body', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['body'] )
);
$formatter->end_tag( 'textarea' );
$formatter->append_start_tag( 'p' );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-exclude-blank', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-exclude-blank', $id ),
'name' => sprintf( '%s[exclude_blank]', $id ),
'value' => '1',
'checked' => $mail['exclude_blank'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Exclude a line from output if all of its mail-tags are blank', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'p' );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-use-html', $id ),
) );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'id' => sprintf( '%s-use-html', $id ),
'name' => sprintf( '%s[use_html]', $id ),
'value' => '1',
'checked' => $mail['use_html'],
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use HTML content type', 'contact-form-7' ) )
);
$formatter->end_tag( 'tr' );
$formatter->append_start_tag( 'tr' );
$formatter->append_start_tag( 'th', array(
'scope' => 'row',
) );
$formatter->append_start_tag( 'label', array(
'for' => sprintf( '%s-attachments', $id ),
) );
$formatter->append_preformatted(
esc_html( __( 'File attachments', 'contact-form-7' ) )
);
$formatter->append_start_tag( 'td' );
$formatter->append_start_tag( 'textarea', array(
'id' => sprintf( '%s-attachments', $id ),
'name' => sprintf( '%s[attachments]', $id ),
'cols' => 100,
'rows' => 4,
'class' => 'large-text code',
'data-config-field' => sprintf( '%s.attachments', $options['name'] ),
) );
$formatter->append_preformatted(
esc_textarea( $mail['attachments'] )
);
$formatter->end_tag( 'textarea' );
$formatter->end_tag( 'tr' );
$formatter->print();
}
function wpcf7_editor_panel_messages( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the messages editor */
__( 'You can edit messages used in various situations here. For details, see <a href="%s">Editing messages</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/editing-messages/', 'contact-form-7' )
);
$messages = wpcf7_messages();
if (
isset( $messages['captcha_not_match'] ) and
! wpcf7_use_really_simple_captcha()
) {
unset( $messages['captcha_not_match'] );
}
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Messages', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
foreach ( $messages as $key => $arr ) {
$field_id = sprintf( 'wpcf7-message-%s', strtr( $key, '_', '-' ) );
$field_name = sprintf( 'wpcf7-messages[%s]', $key );
$formatter->append_start_tag( 'p', array(
'class' => 'description',
) );
$formatter->append_start_tag( 'label', array(
'for' => $field_id,
) );
$formatter->append_preformatted( esc_html( $arr['description'] ) );
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'id' => $field_id,
'name' => $field_name,
'class' => 'large-text',
'size' => 70,
'value' => $post->message( $key, false ),
'data-config-field' => sprintf( 'messages.%s', $key ),
) );
}
$formatter->print();
}
function wpcf7_editor_panel_additional_settings( $post ) {
$description = sprintf(
/* translators: %s: URL to support page about the additional settings editor */
__( 'You can add customization code snippets here. For details, see <a href="%s">Additional settings</a>.', 'contact-form-7' ),
__( 'https://contactform7.com/additional-settings/', 'contact-form-7' )
);
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'h2' );
$formatter->append_preformatted(
esc_html( __( 'Additional Settings', 'contact-form-7' ) )
);
$formatter->end_tag( 'h2' );
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( $description );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'textarea', array(
'id' => 'wpcf7-additional-settings',
'name' => 'wpcf7-additional-settings',
'cols' => 100,
'rows' => 24,
'class' => 'large-text',
'data-config-field' => 'additional_settings.body',
) );
$formatter->append_preformatted(
esc_textarea( $post->prop( 'additional_settings' ) )
);
$formatter->end_tag( 'textarea' );
$formatter->print();
}

View File

@@ -0,0 +1,104 @@
<?php
class WPCF7_Help_Tabs {
private $screen;
public function __construct( WP_Screen $screen ) {
$this->screen = $screen;
}
public function set_help_tabs( $screen_type ) {
switch ( $screen_type ) {
case 'list':
$this->screen->add_help_tab( array(
'id' => 'list_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'list_overview' ),
) );
$this->screen->add_help_tab( array(
'id' => 'list_available_actions',
'title' => __( 'Available Actions', 'contact-form-7' ),
'content' => $this->content( 'list_available_actions' ),
) );
$this->sidebar();
return;
case 'edit':
$this->screen->add_help_tab( array(
'id' => 'edit_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'edit_overview' ),
) );
$this->screen->add_help_tab( array(
'id' => 'edit_form_tags',
'title' => __( 'Form-tags', 'contact-form-7' ),
'content' => $this->content( 'edit_form_tags' ),
) );
$this->screen->add_help_tab( array(
'id' => 'edit_mail_tags',
'title' => __( 'Mail-tags', 'contact-form-7' ),
'content' => $this->content( 'edit_mail_tags' ),
) );
$this->sidebar();
return;
case 'integration':
$this->screen->add_help_tab( array(
'id' => 'integration_overview',
'title' => __( 'Overview', 'contact-form-7' ),
'content' => $this->content( 'integration_overview' ),
) );
$this->sidebar();
return;
}
}
private function content( $name ) {
$content = array();
$content['list_overview'] = '<p>' . __( 'On this screen, you can manage contact forms provided by Contact Form 7. You can manage an unlimited number of contact forms. Each contact form has a unique ID and Contact Form 7 shortcode ([contact-form-7 ...]). To insert a contact form into a post or a text widget, insert the shortcode into the target.', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] = '<p>' . __( 'Hovering over a row in the contact forms list will display action links that allow you to manage your contact form. You can perform the following actions:', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] .= '<p>' . __( '<strong>Edit</strong> - Navigates to the editing screen for that contact form. You can also reach that screen by clicking on the contact form title.', 'contact-form-7' ) . '</p>';
$content['list_available_actions'] .= '<p>' . __( '<strong>Duplicate</strong> - Clones that contact form. A cloned contact form inherits all content from the original, but has a different ID.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] = '<p>' . __( 'On this screen, you can edit a contact form. A contact form is comprised of the following components:', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Title</strong> is the title of a contact form. This title is only used for labeling a contact form, and can be edited.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Form</strong> is a content of HTML form. You can use arbitrary HTML, which is allowed inside a form element. You can also use Contact Form 7&#8217;s form-tags here.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Mail</strong> manages a mail template (headers and message body) that this contact form will send when users submit it. You can use Contact Form 7&#8217;s mail-tags here.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Mail (2)</strong> is an additional mail template that works similar to Mail. Mail (2) is different in that it is sent only when Mail has been sent successfully.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( 'In <strong>Messages</strong>, you can edit various types of messages used for this contact form. These messages are relatively short messages, like a validation error message you see when you leave a required field blank.', 'contact-form-7' ) . '</p>';
$content['edit_overview'] .= '<p>' . __( '<strong>Additional Settings</strong> provides a place where you can customize the behavior of this contact form by adding code snippets.', 'contact-form-7' ) . '</p>';
$content['edit_form_tags'] = '<p>' . __( 'A form-tag is a short code enclosed in square brackets used in a form content. A form-tag generally represents an input field, and its components can be separated into four parts: type, name, options, and values. Contact Form 7 supports several types of form-tags including text fields, number fields, date fields, checkboxes, radio buttons, menus, file-uploading fields, CAPTCHAs, and quiz fields.', 'contact-form-7' ) . '</p>';
$content['edit_form_tags'] .= '<p>' . __( 'While form-tags have a comparatively complex syntax, you do not need to know the syntax to add form-tags because you can use the straightforward tag generator (<strong>Generate Tag</strong> button on this screen).', 'contact-form-7' ) . '</p>';
$content['edit_mail_tags'] = '<p>' . __( 'A mail-tag is also a short code enclosed in square brackets that you can use in every Mail and Mail (2) field. A mail-tag represents a user input value through an input field of a corresponding form-tag.', 'contact-form-7' ) . '</p>';
$content['edit_mail_tags'] .= '<p>' . __( 'There are also special mail-tags that have specific names, but do not have corresponding form-tags. They are used to represent meta information of form submissions like the submitter&#8217;s IP address or the URL of the page.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] = '<p>' . __( 'On this screen, you can manage services that are available through Contact Form 7. Using API will allow you to collaborate with any services that are available.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] .= '<p>' . __( 'You may need to first sign up for an account with the service that you plan to use. When you do so, you would need to authorize Contact Form 7 to access the service with your account.', 'contact-form-7' ) . '</p>';
$content['integration_overview'] .= '<p>' . __( 'Any information you provide will not be shared with service providers without your authorization.', 'contact-form-7' ) . '</p>';
if ( ! empty( $content[$name] ) ) {
return $content[$name];
}
}
public function sidebar() {
$content = '<p><strong>' . __( 'For more information:', 'contact-form-7' ) . '</strong></p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/docs/', 'contact-form-7' ), __( 'Docs', 'contact-form-7' ) ) . '</p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/faq/', 'contact-form-7' ), __( 'FAQ', 'contact-form-7' ) ) . '</p>';
$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/support/', 'contact-form-7' ), __( 'Support', 'contact-form-7' ) ) . '</p>';
$this->screen->set_help_sidebar( $content );
}
}

View File

@@ -0,0 +1,9 @@
<?php
return array(
'dependencies' => array(
'wp-api-fetch',
'wp-i18n',
),
'version' => WPCF7_VERSION,
);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,627 @@
<?php
/**
* The base class for form-tag generators management.
*/
class WPCF7_TagGenerator {
private static $instance;
private $panels = array();
private function __construct() {}
/**
* Returns the singleton instance of this class.
*/
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Adds a form-tag generator instance.
*/
public function add( $id, $title, $callback, $options = '' ) {
$id = trim( $id );
if (
'' === $id or
! wpcf7_is_name( $id ) or
! is_callable( $callback )
) {
return false;
}
$options = wp_parse_args( $options, array(
'version' => '1',
) );
$this->panels[$id] = array(
'title' => $title,
'content' => 'tag-generator-panel-' . $id,
'options' => $options,
'callback' => $callback,
);
if ( version_compare( $options['version'], '2', '<' ) ) {
$message = sprintf(
/* translators: 1: version, 2: tag generator title */
__( 'Use of tag generator instances older than version 2 is deprecated. Version %1$s instance (%2$s) detected.', 'contact-form-7' ),
$options['version'],
$title
);
wp_trigger_error( __METHOD__, $message, E_USER_DEPRECATED );
}
return true;
}
/**
* Renders form-tag generator calling buttons.
*/
public function print_buttons() {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'span', array(
'id' => 'tag-generator-list',
'class' => 'hide-if-no-js',
) );
foreach ( (array) $this->panels as $panel ) {
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'data-taggen' => 'open-dialog',
'data-target' => $panel['content'],
'title' => sprintf(
/* translators: %s: title of form-tag */
__( 'Form-tag Generator: %s', 'contact-form-7' ),
$panel['title']
),
) );
$formatter->append_preformatted( esc_html( $panel['title'] ) );
}
$formatter->print();
}
/**
* Renders form-tag generator dialog panels (hidden until called).
*/
public function print_panels( WPCF7_ContactForm $contact_form ) {
$formatter = new WPCF7_HTMLFormatter( array(
'allowed_html' => array_merge( wpcf7_kses_allowed_html(), array(
'dialog' => array(
'id' => true,
'class' => true,
),
'form' => array(
'method' => true,
'class' => true,
'data-*' => true,
),
) ),
) );
foreach ( (array) $this->panels as $id => $panel ) {
$callback = $panel['callback'];
$options = array_merge( $panel['options'], array(
'id' => $id,
'title' => $panel['title'],
'content' => $panel['content'],
) );
if ( is_callable( $callback ) ) {
$formatter->append_start_tag( 'dialog', array(
'id' => $options['content'],
'class' => 'tag-generator-dialog',
) );
$formatter->append_start_tag( 'button', array(
'class' => 'close-button',
'title' => __( 'Close this dialog box', 'contact-form-7' ),
'data-taggen' => 'close-dialog',
) );
$formatter->append_preformatted(
esc_html( __( 'Close', 'contact-form-7' ) )
);
$formatter->end_tag( 'button' );
$formatter->append_start_tag( 'form', array(
'method' => 'dialog',
'class' => 'tag-generator-panel',
'data-id' => $options['id'],
'data-version' => $options['version'],
) );
$formatter->call_user_func( $callback, $contact_form, $options );
$formatter->close_all_tags();
}
}
$formatter->print();
}
}
/**
* Class helps to implement a form-tag generator content.
*/
class WPCF7_TagGeneratorGenerator {
private $key = '';
/**
* The constructor.
*/
public function __construct( $key ) {
$this->key = $key;
}
/**
* Returns a unique reference ID.
*/
public function ref( $suffix = '' ) {
$ref = sprintf( '%s-%s', $this->key, $suffix );
$ref = strtolower( $ref );
$ref = preg_replace( '/[^0-9a-z-]/', '', $ref );
$ref = preg_replace( '/[-]+/', '-', $ref );
$ref = trim( $ref, '-' );
return $ref;
}
/**
* Calls one of the template methods.
*/
public function print( $part, $options = '' ) {
if ( is_callable( array( $this, $part ) ) ) {
call_user_func( array( $this, $part ), $options );
}
}
/**
* Template method for field type field.
*/
private function field_type( $options = '' ) {
$options = wp_parse_args( $options, array(
'with_required' => false,
'with_optional' => false,
'select_options' => array(),
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'type-legend' ),
) );
$formatter->append_preformatted(
esc_html( __( 'Field type', 'contact-form-7' ) )
);
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'select', array(
'data-tag-part' => 'basetype',
'aria-labelledby' => $this->ref( 'type-legend' ),
) );
foreach ( (array) $options['select_options'] as $basetype => $title ) {
$formatter->append_start_tag( 'option', array(
'value' => $basetype,
) );
$formatter->append_preformatted( esc_html( $title ) );
}
$formatter->end_tag( 'select' );
if ( $options['with_required'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'type-suffix',
'value' => '*',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'This is a required field.', 'contact-form-7' ) )
);
}
if ( $options['with_optional'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'option',
'data-tag-option' => 'optional',
'checked' => true,
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'This checkbox is optional.', 'contact-form-7' ) )
);
}
$formatter->print();
}
/**
* Template method for field name field.
*/
private function field_name( $options = '' ) {
$options = wp_parse_args( $options, array(
'ask_if' => '',
) );
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>"><?php
echo esc_html( __( 'Field name', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="name" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>" />
<?php
$tag_option = $label = '';
if ( 'author_name' === $options['ask_if'] ) {
$tag_option = 'autocomplete:name';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author';
}
$label = __( "This field expects the submitter name.", 'contact-form-7' );
} elseif ( 'author_email' === $options['ask_if'] ) {
$tag_option = 'autocomplete:email';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author_email';
}
$label = __( "This field expects the submitter email.", 'contact-form-7' );
} elseif ( 'author_url' === $options['ask_if'] ) {
$tag_option = 'autocomplete:url';
if ( wpcf7_akismet_is_available() ) {
$tag_option .= ' akismet:author_url';
}
$label = __( "This field expects the submitter URL.", 'contact-form-7' );
} elseif ( 'author_tel' === $options['ask_if'] ) {
$tag_option = 'autocomplete:tel';
$label = __( "This field expects the submitter telephone number.", 'contact-form-7' );
}
if ( $tag_option ) {
?>
<br />
<label>
<input type="checkbox" data-tag-part="option" data-tag-option="<?php echo esc_attr( $tag_option ); ?>" />
<?php echo esc_html( $label ); ?>
</label>
<?php
}
?>
</fieldset>
<?php
}
/**
* Template method for ID attribute option field.
*/
private function id_attr( $options = '' ) {
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>"><?php
echo esc_html( __( 'ID attribute', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="option" data-tag-option="id:" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>" />
</fieldset>
<?php
}
/**
* Template method for class attribute option field.
*/
private function class_attr( $options = '' ) {
?>
<fieldset>
<legend id="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>"><?php
echo esc_html( __( 'Class attribute', 'contact-form-7' ) );
?></legend>
<input type="text" data-tag-part="option" data-tag-option="class:" pattern="[A-Za-z0-9_\-\s]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>" />
</fieldset>
<?php
}
/**
* Template method for min/max options.
*/
private function min_max( $options = '' ) {
$options = wp_parse_args( $options, array(
'type' => 'number',
'title' => __( 'Length', 'contact-form-7' ),
'min_option' => 'minlength:',
'max_option' => 'maxlength:',
'accept_minus' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend' );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'label' );
$formatter->append_preformatted(
esc_html( __( 'Min', 'contact-form-7' ) )
);
$formatter->append_whitespace();
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => 'option',
'data-tag-option' => $options['min_option'],
'min' => $options['accept_minus'] ? null : 0,
) );
$formatter->end_tag( 'label' );
$formatter->append_preformatted( ' &#8660; ' );
$formatter->append_start_tag( 'label' );
$formatter->append_preformatted(
esc_html( __( 'Max', 'contact-form-7' ) )
);
$formatter->append_whitespace();
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => 'option',
'data-tag-option' => $options['max_option'],
'min' => $options['accept_minus'] ? null : 0,
) );
$formatter->end_tag( 'label' );
$formatter->print();
}
/**
* Template method for default value field.
*/
private function default_value( $options = '' ) {
$options = wp_parse_args( $options, array(
'type' => 'text',
'title' => __( 'Default value', 'contact-form-7' ),
'with_placeholder' => false,
'use_content' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'value-legend' ),
) );
$formatter->append_preformatted( esc_html( $options['title'] ) );
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'input', array(
'type' => $options['type'],
'data-tag-part' => $options['use_content'] ? 'content' : 'value',
'aria-labelledby' => $this->ref( 'value-legend' ),
) );
if ( $options['with_placeholder'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'data-tag-part' => 'option',
'data-tag-option' => 'placeholder',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use this text as the placeholder.', 'contact-form-7' ) )
);
}
$formatter->print();
}
/**
* Template method for selectable values useful for checkboxes or a menu.
*/
private function selectable_values( $options = '' ) {
$options = wp_parse_args( $options, array(
'first_as_label' => false,
'use_label_element' => false,
) );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'fieldset' );
$formatter->append_start_tag( 'legend', array(
'id' => $this->ref( 'selectable-values-legend' ),
) );
$formatter->append_preformatted(
esc_html( __( 'Selectable values', 'contact-form-7' ) )
);
$formatter->end_tag( 'legend' );
$formatter->append_start_tag( 'span', array(
'id' => $this->ref( 'selectable-values-description' ),
) );
$formatter->append_preformatted(
esc_html( __( 'One item per line.', 'contact-form-7' ) )
);
$formatter->end_tag( 'span' );
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'textarea', array(
'required' => true,
'data-tag-part' => 'value',
'aria-labelledby' => $this->ref( 'selectable-values-legend' ),
'aria-describedby' => $this->ref( 'selectable-values-description' ),
) );
$formatter->append_preformatted(
esc_html( __( "Option 1\nOption 2\nOption 3", 'contact-form-7' ) )
);
$formatter->end_tag( 'textarea' );
if ( $options['first_as_label'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'checked' => 'checked' === $options['first_as_label'],
'data-tag-part' => 'option',
'data-tag-option' => 'first_as_label',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Use the first item as a label.', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
}
if ( $options['use_label_element'] ) {
$formatter->append_start_tag( 'br' );
$formatter->append_start_tag( 'label' );
$formatter->append_start_tag( 'input', array(
'type' => 'checkbox',
'checked' => 'checked' === $options['use_label_element'],
'data-tag-part' => 'option',
'data-tag-option' => 'use_label_element',
) );
$formatter->append_whitespace();
$formatter->append_preformatted(
esc_html( __( 'Wrap each item with a label element.', 'contact-form-7' ) )
);
$formatter->end_tag( 'label' );
}
$formatter->print();
}
/**
* Template method for insert-box content including the result form-tag.
*/
private function insert_box_content( $options = '' ) {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'flex-container',
) );
$formatter->append_start_tag( 'input', array(
'type' => 'text',
'class' => 'code selectable',
'readonly' => true,
'data-tag-part' => 'tag',
'aria-label' => __( 'The form-tag to be inserted into the form template', 'contact-form-7' ),
) );
$formatter->append_whitespace();
$formatter->append_start_tag( 'button', array(
'type' => 'button',
'class' => 'button button-primary',
'data-taggen' => 'insert-tag',
) );
$formatter->append_preformatted(
esc_html( __( 'Insert Tag', 'contact-form-7' ) )
);
$formatter->end_tag( 'button' );
$formatter->print();
}
/**
* Template method for a tip message about mail-tag.
*/
private function mail_tag_tip( $options = '' ) {
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'p', array(
'class' => 'mail-tag-tip',
) );
$formatter->append_preformatted( sprintf(
/* translators: %s: mail-tag corresponding to the form-tag */
esc_html( __( 'To use the user input in the email, insert the corresponding mail-tag %s into the email template.', 'contact-form-7' ) ),
'<strong data-tag-part="mail-tag"></strong>'
) );
$formatter->print();
}
}

View File

@@ -0,0 +1,280 @@
<?php
abstract class WPCF7_WelcomePanelColumn {
abstract protected function icon();
abstract protected function title();
abstract protected function content();
public function print_content() {
$content = $this->content();
if ( is_array( $content ) ) {
$content = implode( "\n\n", $content );
}
$content = wp_kses_post( $content );
$content = wptexturize( $content );
$content = convert_chars( $content );
$content = wpautop( $content );
$formatter = new WPCF7_HTMLFormatter();
$formatter->append_start_tag( 'div', array(
'class' => 'welcome-panel-column',
) );
$formatter->append_start_tag( 'h3' );
$formatter->append_start_tag( 'span', array(
'class' => sprintf( 'dashicons dashicons-%s', $this->icon() ),
'aria-hidden' => 'true',
) );
$formatter->end_tag( 'span' );
$formatter->append_whitespace();
$formatter->append_preformatted( $this->title() );
$formatter->end_tag( 'h3' );
$formatter->append_preformatted( $content );
$formatter->print();
}
}
class WPCF7_WelcomePanelColumn_AntiSpam extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'shield';
}
protected function title() {
return __( 'Getting spammed? You have protection.', 'contact-form-7' );
}
protected function content() {
return array(
__( 'Spammers target everything; your contact forms are not an exception. Before you get spammed, protect your contact forms with the powerful anti-spam features Contact Form 7 provides.', 'contact-form-7' ),
sprintf(
/* translators: 1: URL to support page about Akismet, 2: Cloudflare Turnstile, 3: Disallowed list */
__( 'Contact Form 7 supports spam-filtering with <a href="%1$s">Akismet</a>. <a href="%2$s">Cloudflare Turnstile</a> blocks annoying spambots. Plus, using <a href="%3$s">disallowed list</a>, you can block messages containing specified keywords or those sent from specified IP addresses.', 'contact-form-7' ),
__( 'https://contactform7.com/spam-filtering-with-akismet/', 'contact-form-7' ),
__( 'https://contactform7.com/turnstile-integration/', 'contact-form-7' ),
__( 'https://contactform7.com/comment-blacklist/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Donation extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'megaphone';
}
protected function title() {
return __( 'Contact Form 7 needs your support.', 'contact-form-7' );
}
protected function content() {
return array(
__( 'It is hard to continue to maintain this plugin without support from users like you.', 'contact-form-7' ),
sprintf(
/* translators: %s: URL to support page about ways to contribute */
__( 'There are several ways for you to <a href="%s">contribute to the project</a>: testing, coding, translating it into your local languages, helping other users, financial donations, etc, etc. We equally welcome you regardless of the way you contribute.', 'contact-form-7' ),
__( 'https://contactform7.com/contributing/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Flamingo extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'editor-help';
}
protected function title() {
return __( 'Before you cry over spilt mail&#8230;', 'contact-form-7' );
}
protected function content() {
return array(
__( 'Contact Form 7 does not store submitted messages anywhere. Therefore, you may lose important messages forever if your mail server has issues or you make a mistake in mail configuration.', 'contact-form-7' ),
sprintf(
/* translators: %s: URL to support page about the Flamingo plugin */
__( 'Install a message storage plugin before this happens to you. <a href="%s">Flamingo</a> saves all messages through contact forms into the database. Flamingo is a free WordPress plugin created by the same author as Contact Form 7.', 'contact-form-7' ),
__( 'https://contactform7.com/save-submitted-messages-with-flamingo/', 'contact-form-7' )
),
);
}
}
class WPCF7_WelcomePanelColumn_Integration extends WPCF7_WelcomePanelColumn {
protected function icon() {
return 'superhero-alt';
}
protected function title() {
return __( 'You have strong allies to back you up.', 'contact-form-7' );
}
protected function content() {
return array(
sprintf(
/* translators: %s: URL to support page about the Brevo integration */
__( 'Your contact forms will become more powerful and versatile by integrating them with external APIs. With CRM and email marketing services, you can build your own contact lists (<a href="%s">Brevo</a>).', 'contact-form-7' ),
__( 'https://contactform7.com/sendinblue-integration/', 'contact-form-7' )
),
sprintf(
/* translators: 1: URL to support page about Cloudflare Turnstile, 2: Stripe */
__( 'With help from cloud-based machine learning, anti-spam services will protect your forms (<a href="%1$s">Cloudflare Turnstile</a>). Even payment services are natively supported (<a href="%2$s">Stripe</a>).', 'contact-form-7' ),
__( 'https://contactform7.com/turnstile-integration/', 'contact-form-7' ),
__( 'https://contactform7.com/stripe-integration/', 'contact-form-7' )
),
);
}
}
function wpcf7_welcome_panel() {
$columns = array();
$flamingo_is_active = defined( 'FLAMINGO_VERSION' );
$sendinblue_is_active = false;
if (
class_exists( 'WPCF7_Sendinblue' ) and
$sendinblue = WPCF7_Sendinblue::get_instance()
) {
$sendinblue_is_active = $sendinblue->is_active();
}
if ( $flamingo_is_active and $sendinblue_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
$columns[] = new WPCF7_WelcomePanelColumn_Donation();
} elseif ( $flamingo_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_Integration();
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
} elseif ( $sendinblue_is_active ) {
$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
} else {
$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
$columns[] = new WPCF7_WelcomePanelColumn_Integration();
}
$classes = 'wpcf7-welcome-panel';
$vers = (array) get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
if ( wpcf7_version_grep( wpcf7_version( 'only_major=1' ), $vers ) ) {
$classes .= ' hidden';
}
?>
<div id="wpcf7-welcome-panel" class="<?php echo esc_attr( $classes ); ?>">
<?php wp_nonce_field( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce', false ); ?>
<a class="welcome-panel-close" href="<?php echo esc_url( menu_page_url( 'wpcf7', false ) ); ?>"><?php echo esc_html( __( 'Dismiss', 'contact-form-7' ) ); ?></a>
<div class="welcome-panel-content">
<div class="welcome-panel-column-container">
<?php
foreach ( $columns as $column ) {
$column->print_content();
}
?>
</div>
</div>
</div>
<?php
}
add_action(
'wp_ajax_wpcf7-update-welcome-panel',
'wpcf7_admin_ajax_welcome_panel',
10, 0
);
function wpcf7_admin_ajax_welcome_panel() {
check_ajax_referer( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce' );
$vers = get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
if ( empty( $vers ) or ! is_array( $vers ) ) {
$vers = array();
}
if ( empty( $_POST['visible'] ) ) {
$vers[] = wpcf7_version( 'only_major=1' );
} else {
$vers = array_diff( $vers, array( wpcf7_version( 'only_major=1' ) ) );
}
$vers = array_unique( $vers );
update_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', $vers
);
wp_die( 1 );
}
add_filter(
'screen_settings',
'wpcf7_welcome_panel_screen_settings',
10, 2
);
function wpcf7_welcome_panel_screen_settings( $screen_settings, $screen ) {
if ( 'toplevel_page_wpcf7' !== $screen->id ) {
return $screen_settings;
}
$vers = (array) get_user_meta( get_current_user_id(),
'wpcf7_hide_welcome_panel_on', true
);
$checkbox_id = 'wpcf7-welcome-panel-show';
$checked = ! in_array( wpcf7_version( 'only_major=1' ), $vers, true );
$checkbox = sprintf(
'<input %s />',
wpcf7_format_atts( array(
'id' => $checkbox_id,
'type' => 'checkbox',
'checked' => $checked,
) )
);
$screen_settings .= sprintf( '
<fieldset class="wpcf7-welcome-panel-options">
<legend>%1$s</legend>
<label for="%2$s">%3$s %4$s</label>
</fieldset>',
esc_html( __( 'Welcome panel', 'contact-form-7' ) ),
esc_attr( $checkbox_id ),
$checkbox,
esc_html( __( 'Show welcome panel', 'contact-form-7' ) )
);
return $screen_settings;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 242.5 239.46"><defs><style>.cls-1,.cls-6{fill:none;}.cls-2{clip-path:url(#clip-path);}.cls-3{fill:#33c6f4;}.cls-4{fill:#1b447e;}.cls-5{fill:#fff;}.cls-6{stroke:#221e1f;stroke-miterlimit:10;stroke-width:7.16px;}</style><clipPath id="clip-path" transform="translate(1.72)"><circle class="cls-1" cx="119.73" cy="119.73" r="116.15"/></clipPath></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1" data-name="Layer 1"><g class="cls-2"><circle class="cls-3" cx="121.45" cy="119.73" r="116.15"/><path class="cls-4" d="M239.32,167.79c-53.41-24-108.37-91.46-113-94.55s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11S36.94,237.79,122,237.79C208.48,237.79,239.32,167.79,239.32,167.79Z" transform="translate(1.72)"/><path class="cls-5" d="M67.48,116.58s15.48-7,12.38,4.65-15.48,28.64-11.61,29.41S83,140.58,86.06,142.12s5.42.78,3.87,6.2-3.1,9.29,0,9.29,5.42-7,9.29-13.94,10.06-3.87,12.38-1.55,9.29,15.49,14.71,13.94,8.51-8.52,6.19-24,1.55-20.12,1.55-20.12,4.64-2.32,13.16,8.51,24,27.09,26.31,26.32-10.83-17.8-7.74-19.35,15.48,2.32,21.68,7.74c0,0,2.12,8.87,2.12.36L126.31,73.24,115.47,74l-10.06.77S80.64,111.94,67.48,116.58Z" transform="translate(1.72)"/><path class="cls-6" d="M239.32,170.11c-53.41-24-108.37-93.78-113-96.87s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11" transform="translate(1.72)"/></g><circle class="cls-6" cx="121.45" cy="119.73" r="116.15"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,13 @@
<?php
add_action(
'init',
'wpcf7_init_block_editor_assets',
10, 0
);
function wpcf7_init_block_editor_assets() {
register_block_type(
wpcf7_plugin_path( 'includes/block-editor' )
);
}

View File

@@ -0,0 +1,38 @@
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "contact-form-7/contact-form-selector",
"title": "Contact Form 7",
"category": "widgets",
"description": "Insert a contact form you have created with Contact Form 7.",
"keywords": [ "form" ],
"textdomain": "contact-form-7",
"attributes": {
"id": {
"type": "integer"
},
"hash": {
"type": "string"
},
"title": {
"type": "string"
},
"htmlId": {
"type": "string"
},
"htmlName": {
"type": "string"
},
"htmlTitle": {
"type": "string"
},
"htmlClass": {
"type": "string"
},
"output": {
"enum": [ "form", "raw_form" ],
"default": "form"
}
},
"editorScript": [ "file:./index.js", "contact-form-7-block-editor" ]
}

View File

@@ -0,0 +1,15 @@
<?php
return array(
'dependencies' => array(
'react-jsx-runtime',
'wp-api-fetch',
'wp-block-editor',
'wp-blocks',
'wp-components',
'wp-element',
'wp-i18n',
'wp-url',
),
'version' => WPCF7_VERSION,
);

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More