Action Since 6.9 uncanny-automator

automator_before_recipe_log_deleted

Fires before a specific recipe run log is deleted. This hook allows extensions (like Pro) to perform cleanup before the log data is removed, such as cancelling scheduled actions in Action Scheduler. Fires before a recipe run log is deleted, allowing for pre-deletion cleanup tasks.

add_action( 'automator_before_recipe_log_deleted', $callback, 10, 3 );

Description

Fires before a specific recipe run log is deleted. Developers can use this hook for pre-deletion cleanup tasks, like canceling associated scheduled actions. It receives the recipe ID, log ID, and run number to target specific logs.


Usage

add_action( 'automator_before_recipe_log_deleted', 'your_function_name', 10, 3 );

Parameters

$recipe_id (int)
The recipe ID.
$recipe_log_id (int)
The recipe log ID being deleted.
$run_number (int)
The run number being deleted.

Examples

/**
 * Unschedule any pending LinkedIn posts associated with the deleted recipe log.
 *
 * @param int $recipe_id     The recipe ID.
 * @param int $recipe_log_id The recipe log ID being deleted.
 * @param int $run_number    The run number being deleted.
 */
add_action( 'automator_before_recipe_log_deleted', function( $recipe_id, $recipe_log_id, $run_number ) {
    // This is a hypothetical example. In a real scenario, you would interact
    // with a WordPress transient or custom database table to find and remove
    // scheduled posts related to this specific recipe log.

    // Example: Check if there are any pending LinkedIn posts for this log.
    $pending_linkedin_posts = get_transient( 'automator_pending_linkedin_posts_' . $recipe_log_id );

    if ( $pending_linkedin_posts && is_array( $pending_linkedin_posts ) ) {
        // Iterate through and remove them.
        foreach ( $pending_linkedin_posts as $post_id ) {
            // In a real scenario, you'd use wp_unschedule_event or a custom deletion method.
            // For this example, we'll just simulate deletion.
            error_log( "Simulating unscheduling LinkedIn post ID: " . $post_id . " for recipe log ID: " . $recipe_log_id );
        }
        // Clear the transient.
        delete_transient( 'automator_pending_linkedin_posts_' . $recipe_log_id );
    }

}, 10, 3 );

Placement

This code should be placed in the functions.php file of your active theme, a custom plugin, or using a code snippets plugin.


Source Code

src/core/admin/class-activity-log.php:101

public function remove_specific_run() {

		if ( ! automator_filter_has_var( 'delete_specific_activity' ) ) {
			return;
		}

		if ( ! current_user_can( automator_get_admin_capability() ) ) { // phpcs:ignore WordPress.WP.Capabilities.Undetermined
			return;
		}

		if ( ! automator_filter_has_var( 'wpnonce' ) ) {
			return;
		}

		if ( ! automator_filter_has_var( 'recipe_id' ) ) {
			return;
		}

		if ( ! automator_filter_has_var( 'run_number' ) ) {
			return;
		}

		if ( ! automator_filter_has_var( 'recipe_log_id' ) ) {
			return;
		}

		if ( ! wp_verify_nonce( automator_filter_input( 'wpnonce' ), AUTOMATOR_FREE_ITEM_NAME ) ) {
			return;
		}

		$recipe_id     = (int) automator_filter_input( 'recipe_id' );
		$recipe_log_id = (int) automator_filter_input( 'recipe_log_id' );
		$run_number    = (int) automator_filter_input( 'run_number' );
		$page          = (string) automator_filter_input( 'page' );

		/**
		 * Fires before a specific recipe run log is deleted.
		 *
		 * This hook allows extensions (like Pro) to perform cleanup before the log data
		 * is removed, such as cancelling scheduled actions in Action Scheduler.
		 *
		 * @since 6.9
		 *
		 * @param int $recipe_id     The recipe ID.
		 * @param int $recipe_log_id The recipe log ID being deleted.
		 * @param int $run_number    The run number being deleted.
		 */
		do_action( 'automator_before_recipe_log_deleted', $recipe_id, $recipe_log_id, $run_number );

		// Delete api logs
		automator_purge_api_logs( $recipe_id, $recipe_log_id );

		// Delete closure logs
		automator_purge_closure_logs( $recipe_id, $recipe_log_id );

		// Delete action logs
		automator_purge_action_logs( $recipe_id, $recipe_log_id );

		// Delete trigger logs
		automator_purge_trigger_logs( $recipe_id, $recipe_log_id );

		// Delete recipe logs
		automator_purge_recipe_logs( $recipe_id, $recipe_log_id );

		do_action( 'automator_recipe_log_deleted', $recipe_id, $recipe_log_id, $run_number );

		$get_referer = wp_get_referer();

		if ( preg_match( "/$page/", $get_referer ) ) {
			wp_safe_redirect( sprintf( '%s&recipe_activity_run_success=1', $get_referer ) );
			exit;
		}

		wp_safe_redirect( sprintf( '%s?post_type=%s&page=%s&recipe_activity_run_success=1', admin_url( 'edit.php' ), AUTOMATOR_POST_TYPE_RECIPE, $page ) );

		exit;
	}


Internal Usage

Found in src/integrations/linkedin/helpers/linkedin-scheduled-posts-manager.php:92:

add_action( 'automator_before_recipe_log_deleted', array( $this, 'unschedule_for_log' ), 10, 2 );

Found in uncanny-automator-pro/src/core/classes/async-actions.php:70:

add_action( 'automator_before_recipe_log_deleted', array( $this, 'cancel_scheduled_actions_for_log' ), 10, 2 );
Scroll to Top