Recipe_Post_Utilities

Class Recipe_Post_Functions


Source Source

File: src/core/automator-post-types/uo-recipe/class-recipe-post-utilities.php

class Recipe_Post_Utilities {
	/**
	 * Recipe_Post_Functions constructor.
	 */
	public function __construct() {
		// Add the custom columns to the uo-recipe.
		add_filter( 'manage_uo-recipe_posts_columns', array( $this, 'set_custom_columns' ) );
		// Add the data to the custom columns for uo-recipe.
		add_action( 'manage_uo-recipe_posts_custom_column', array( $this, 'custom_column' ), 10, 2 );
		// Add admin post creation scripts.
		add_action( 'admin_enqueue_scripts', array( $this, 'automator_recipe_scripts' ) );
		// Change to before delete post.
		add_action( 'delete_post', array( $this, 'delete_triggers_actions' ), 10, 1 );
		// Draft when recipe moved to trash.
		add_action( 'wp_trash_post', array( $this, 'draft_triggers_actions' ), 10, 1 );
		// Prepopulate recipe from a URL query (only for admins).
		if ( is_admin() ) {
			add_action( 'wp_insert_post', array( 'Uncanny_Automator\Populate_From_Query', 'maybe_populate' ), 9, 3 );
		}
		// Change Default new recipe post from auto-draft to draft.
		add_action( 'wp_insert_post', array( $this, 'change_default_post_status' ), 10, 3 );
		// Add recipe and redirect to it in edit mode.
		add_filter( 'replace_editor', array( $this, 'redirect_to_recipe' ), 20, 2 );
		// Remove WordPress default publish box.
		add_action( 'admin_menu', array( $this, 'remove_publish_box' ) );
	}
	/**
	 * @param $value
	 * @param $post
	 *
	 * @return mixed
	 */
	public function redirect_to_recipe( $value, $post ) {
		global $current_screen;
		if ( $current_screen && 'add' === $current_screen->action && 'uo-recipe' === $current_screen->post_type ) {
			wp_safe_redirect( admin_url( 'post.php?post=' . $post->ID . '&action=edit' ) );
			die();
		}
		return $value;
	}
	/**
	 * Remove the WP standard Post publish metabox
	 */
	public function remove_publish_box() {
		remove_meta_box( 'submitdiv', 'uo-recipe', 'side' );
	}
	/**
	 * @param $post_ID
	 * @param $post
	 * @param $update
	 */
	public function change_default_post_status( $post_ID, $post, $update ) {
		if ( 'uo-recipe' !== (string) $post->post_type ) {
			return;
		}
		if ( 'auto-draft' !== (string) $post->post_status ) {
			return;
		}
		// Update post
		$args = array(
			'ID'          => $post_ID,
			'post_status' => 'draft',
			'post_title'  => '',
		);
		// Update the post into the database
		wp_update_post( $args );
		//Save "user" recipe type as the default IF pro is not active
		if ( ! defined( 'AUTOMATOR_PRO_FILE' ) ) {
			update_post_meta( $post_ID, 'uap_recipe_type', 'user' );
		}
		// Save automator version for future use in case
		// something has to be changed for older recipes
		update_post_meta( $post_ID, 'uap_recipe_version', Utilities::automator_get_version() );
		update_post_meta( $post_ID, 'recipe_completions_allowed', '-1' );
		update_post_meta( $post_ID, 'recipe_max_completions_allowed', '-1' );
	}
	/**
	 * Enqueue scripts only on custom post type edit pages
	 *
	 * @param $hook
	 */
	public function automator_recipe_scripts( $hook ) {
		// Add global assets. Load in all admin pages
		Utilities::automator_enqueue_global_assets();
		// Add scripts ONLY to recipe custom post type
		if ( 'post-new.php' !== $hook && 'post.php' !== $hook ) {
			return;
		}
		if ( 'uo-recipe' !== (string) get_post_type() ) {
			return;
		}
		// Add Select2
		$this->assets_vendor_select2();
		// Add CodeMirror
		$this->assets_vendor_codemirror();
		// Add TinyMCE
		$this->assets_vendor_tinymce();
		// Recipe UI scripts
		wp_register_script(
			'uncanny-automator-ui',
			Utilities::automator_get_recipe_dist( 'bundle.min.js' ),
			array(
				'jquery',
				'uap-select2',
				'uap-codemirror',
				'uap-codemirror-autorefresh',
				'uap-codemirror-no-newlines',
				'uap-codemirror-searchcursor',
				'uap-codemirror-search',
				'uap-codemirror-placeholder',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_localize_script(
			'uncanny-automator-ui',
			'UncannyAutomator',
			$this->assets_get_automator_main_object()
		);
		wp_enqueue_script( 'uncanny-automator-ui' );
		wp_enqueue_style(
			'uncanny-automator-ui',
			Utilities::automator_get_recipe_dist( 'bundle.min.css' ),
			array(
				'uap-codemirror',
			),
			Utilities::automator_get_version()
		);
	}
	/**
	 *
	 */
	private function assets_vendor_select2() {
		// Add select2
		wp_enqueue_style(
			'uap-select2',
			Utilities::automator_get_vendor_asset( 'select2/css/select2.min.css' ),
			array(),
			Utilities::automator_get_version()
		);
		wp_enqueue_script(
			'uap-select2',
			Utilities::automator_get_vendor_asset( 'select2/js/select2.min.js' ),
			array(
				'jquery',
			),
			Utilities::automator_get_version(),
			true
		);
	}
	/**
	 *
	 */
	private function assets_vendor_codemirror() {
		wp_enqueue_style(
			'uap-codemirror',
			Utilities::automator_get_vendor_asset( 'codemirror/css/codemirror.min.css' ),
			array(),
			Utilities::automator_get_version()
		);
		wp_enqueue_script(
			'uap-codemirror',
			Utilities::automator_get_vendor_asset( 'codemirror/js/codemirror.min.js' ),
			array(
				'jquery',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_enqueue_script(
			'uap-codemirror-autorefresh',
			Utilities::automator_get_vendor_asset( 'codemirror/js/autorefresh.js' ),
			array(
				'jquery',
				'uap-codemirror',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_enqueue_script(
			'uap-codemirror-no-newlines',
			Utilities::automator_get_vendor_asset( 'codemirror/js/no-newlines.js' ),
			array(
				'jquery',
				'uap-codemirror',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_enqueue_script(
			'uap-codemirror-placeholder',
			Utilities::automator_get_vendor_asset( 'codemirror/js/placeholder.js' ),
			array(
				'jquery',
				'uap-codemirror',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_enqueue_script(
			'uap-codemirror-searchcursor',
			Utilities::automator_get_vendor_asset( 'codemirror/js/searchcursor.js' ),
			array(
				'jquery',
				'uap-codemirror',
			),
			Utilities::automator_get_version(),
			true
		);
		wp_enqueue_script(
			'uap-codemirror-search',
			Utilities::automator_get_vendor_asset( 'codemirror/js/search.js' ),
			array(
				'jquery',
				'uap-codemirror',
				'uap-codemirror-searchcursor',
			),
			Utilities::automator_get_version(),
			true
		);
	}
	/**
	 *
	 */
	private function assets_vendor_tinymce() {
		wp_enqueue_editor();
		wp_enqueue_media();
	}
	/**
	 * @return mixed|void
	 */
	private function assets_get_automator_main_object() {
		global $post;
		// $post return $post->ID as a string, Our JS expects an int... change it
		$post_id = (int) $post->ID;
		// API data
		$completions_allowed     = get_post_meta( $post_id, 'recipe_completions_allowed', true );
		$max_completions_allowed = get_post_meta( $post_id, 'recipe_max_completions_allowed', true );
		$recipe_type             = get_post_meta( $post_id, 'uap_recipe_type', true );
		// Get source
		$source = get_post_meta( $post_id, 'source', true );
		// Create fields array
		$fields = array(
			'existingUser' => array(),
			'newUser'      => array(),
		);
		// Check if the user defined a valid source
		if ( in_array( $source, array( 'existingUser', 'newUser' ), false ) ) {
			// If the user did it, then add the fields
			$fields[ $source ] = get_post_meta( $post_id, 'fields', true );
		}
		$editable_roles = get_editable_roles();
		$roles          = array();
		foreach ( $editable_roles as $role_key => $role_data ) {
			$roles[ $role_key ] = $role_data['name'];
		}
		$api_setup = array(
			'wp'             => false,
			'restURL'        => esc_url_raw( rest_url() . AUTOMATOR_REST_API_END_POINT ),
			'siteURL'        => get_site_url(),
			'nonce'          => \wp_create_nonce( 'wp_rest' ),
			'dev'            => array(
				'debugMode'    => (bool) AUTOMATOR_DEBUG_MODE,
				'recipesUrl'   => admin_url( 'edit.php?post_type=uo-recipe' ),
				'debuggingURL' => 'https://automatorplugin.com/knowledge-base/troubleshooting-plugin-errors/?utm_source=uncanny_automator&utm_medium=recipe-wizard-error-modal&utm_content=learn-more-debugging',
			),
			'integrations'   => Automator()->get_integrations(),
			'triggers'       => Automator()->get_triggers(),
			'actions'        => Automator()->get_actions(),
			'closures'       => Automator()->get_closures(),
			'i18n'           => Automator()->i18n->get_all(),
			'recipes_object' => Automator()->get_recipes_data( true, $post_id ),
			'version'        => Utilities::automator_get_version(),
			'proVersion'     => defined( 'AUTOMATOR_PRO_FILE' ) ? \Uncanny_Automator_Pro\InitializePlugin::PLUGIN_VERSION : '',
			'proFeatures'    => $this->get_pro_items(),
			'recipe'         => array(
				'id'           => $post_id,
				'author'       => $post->post_author,
				'status'       => $post->post_status,
				'type'         => empty( $recipe_type ) ? null : $recipe_type,
				'isLive'       => 'publish' === $post->post_status,
				'errorMode'    => false,
				'isValid'      => false,
				'userSelector' => array(
					'source'    => $source,
					'data'      => $fields,
					'isValid'   => false,
					'resources' => array(
						'roles' => $roles,
					),
				),
				'hasLive'      => array(
					'trigger' => false,
					'action'  => false,
					'closure' => false,
				),
				'message'      => array(
					'error'   => '',
					'warning' => '',
				),
				'items'        => array(),
				'publish'      => array(
					'timesPerUser'   => empty( $completions_allowed ) ? 1 : $completions_allowed,
					'timesPerRecipe' => empty( $max_completions_allowed ) ? '-1' : $max_completions_allowed,
					'createdOn'      => date_i18n( 'M j, Y @ G:i', get_the_time( 'U', $post_id ) ),
					'moveToTrash'    => get_delete_post_link( $post_id ),
					'copyToDraft'    => sprintf( '%s?action=%s&post=%d&return_to_recipe=yes&_wpnonce=%s', admin_url( 'edit.php' ), 'copy_recipe_parts', $post_id, wp_create_nonce( 'Aut0Mat0R' ) ),
				),
			),
			'format'         => array(
				'date' => get_option( 'date_format' ),
			),
		);
		$api_setup = apply_filters_deprecated( 'uap_api_setup', array( $api_setup ), '3.0', 'automator_api_setup' ); // deprecate
		return apply_filters( 'automator_api_setup', $api_setup );
	}
	/**
	 * List of Pro features to upsell Automator Pro
	 *
	 * @return array
	 */
	private function get_pro_items() {
		return Utilities::get_pro_items_list();
	}
	/**
	 * Delete all children triggers and actions of recipe
	 *
	 * @param $post_ID
	 */
	public function delete_triggers_actions( $post_ID ) {
		$post = get_post( $post_ID );
		if ( ! $post instanceof \WP_Post ) {
			return;
		}
		if ( 'uo-recipe' === $post->post_type ) {
			// delete recipe logs
			self::delete_recipe_logs( $post_ID );
		}
		if ( $post && 'uo-action' === (string) $post->post_type ) {
			Automator()->db->action->delete( $post_ID );
		}
		if ( $post && 'uo-trigger' === (string) $post->post_type ) {
			Automator()->db->trigger->delete( $post_ID );
		}
		if ( $post && 'uo-closure' === (string) $post->post_type ) {
			Automator()->db->closure->delete( $post_ID );
		}
	}
	/**
	 * Delete all logs and meta for triggers
	 *
	 * @param $post_ID
	 */
	public static function delete_recipe_logs( $post_ID ) {
		Automator()->db->recipe->delete( $post_ID );
		$args = array(
			'post_parent'    => $post_ID,
			'post_status'    => 'any',
			'post_type'      => 'uo-trigger',
			'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
		);
		$children = get_children( $args );
		if ( is_array( $children ) && count( $children ) > 0 ) {
			// Delete all the Children of the Parent Page
			foreach ( $children as $child ) {
				wp_delete_post( $child->ID, true );
				Automator()->db->trigger->delete( $post_ID );
			}
		}
		$args = array(
			'post_parent'    => $post_ID,
			'post_status'    => 'any',
			'post_type'      => 'uo-action',
			'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
		);
		$children = get_children( $args );
		if ( is_array( $children ) && count( $children ) > 0 ) {
			// Delete all the Children of the Parent Page
			foreach ( $children as $child ) {
				wp_delete_post( $child->ID, true );
				Automator()->db->action->delete( $post_ID );
			}
		}
		$args = array(
			'post_parent'    => $post_ID,
			'post_status'    => 'any',
			'post_type'      => 'uo-closure',
			'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
		);
		$children = get_children( $args );
		if ( is_array( $children ) && count( $children ) > 0 ) {
			// Delete all the Children of the Parent Page
			foreach ( $children as $child ) {
				wp_delete_post( $child->ID, true );
				Automator()->db->closure->delete( $post_ID );
			}
		}
	}
	/**
	 * Draft all children triggers and actions of recipe
	 *
	 * @param $post_ID
	 */
	public function draft_triggers_actions( $post_ID ) {
		$post = get_post( $post_ID );
		if ( $post && 'uo-recipe' === $post->post_type ) {
			$args = array(
				'post_parent'    => $post->ID,
				'post_status'    => 'any',
				'post_type'      => 'uo-trigger',
				'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
			);
			$children = get_children( $args );
			if ( is_array( $children ) && count( $children ) > 0 ) {
				// Delete all the Children of the Parent Page
				foreach ( $children as $child ) {
					$child_update = array(
						'ID'          => $child->ID,
						'post_status' => 'draft',
					);
					wp_update_post( $child_update );
				}
			}
			$args = array(
				'post_parent'    => $post->ID,
				'post_status'    => 'any',
				'post_type'      => 'uo-action',
				'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
			);
			$children = get_children( $args );
			if ( is_array( $children ) && count( $children ) > 0 ) {
				// Delete all the Children of the Parent Page
				foreach ( $children as $child ) {
					$child_update = array(
						'ID'          => $child->ID,
						'post_status' => 'draft',
					);
					wp_update_post( $child_update );
				}
			}
			$args = array(
				'post_parent'    => $post->ID,
				'post_status'    => 'any',
				'post_type'      => 'uo-closure',
				'posts_per_page' => 999, //phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page
			);
			$children = get_children( $args );
			if ( is_array( $children ) && count( $children ) > 0 ) {
				// Delete all the Children of the Parent Page
				foreach ( $children as $child ) {
					$child_update = array(
						'ID'          => $child->ID,
						'post_status' => 'draft',
					);
					wp_update_post( $child_update );
				}
			}
		}
	}
	/**
	 * Add data to custom columns in the recipe list
	 *
	 * @param $column
	 * @param $post_id
	 */
	public function custom_column( $column, $post_id ) {
		global $wpdb;
		switch ( $column ) {
			case 'triggers':
				$trigger_titles = $wpdb->get_results( $wpdb->prepare( "SELECT post_status, post_title FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = %s", $post_id, 'uo-trigger' ) );
				?>
				<div class="uap">
					<div class="uo-post-column__list">
						<?php
						foreach ( $trigger_titles as $title ) {
							?>
							<div class="uo-post-column__item">
								<?php echo 'publish' === $title->post_status ? '<span class="dashicons dashicons-yes-alt recipe-ui-dash" title="Live"></span>' : '<span class="dashicons dashicons-warning recipe-ui-dash" title="Draft"></span>'; ?>
								<?php echo esc_html( $title->post_title ); ?>
							</div>
						<?php } ?>
					</div>
				</div>
				<?php
				break;
			case 'actions':
				$action_titles = $wpdb->get_results( $wpdb->prepare( "SELECT post_status, post_title FROM {$wpdb->posts} WHERE post_parent=%d AND post_type=%s", $post_id, 'uo-action' ) );
				?>
				<div class="uap">
					<div class="uo-post-column__list">
						<?php foreach ( $action_titles as $title ) { ?>
							<div class="uo-post-column__item">
								<?php echo 'publish' === $title->post_status ? '<span class="dashicons dashicons-yes-alt recipe-ui-dash" title="Live"></span>' : '<span class="dashicons dashicons-warning recipe-ui-dash" title="Draft"></span>'; ?>
								<?php echo esc_html( $title->post_title ); ?>
							</div>
						<?php } ?>
					</div>
				</div>
				<?php
				break;
			case 'runs':
				$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(run_number) FROM {$wpdb->prefix}uap_recipe_log WHERE automator_recipe_id=%d AND completed = %d", $post_id, 1 ) );
				$url   = add_query_arg(
					array(
						'post_type' => 'uo-recipe',
						'page'      => 'uncanny-automator-recipe-log',
						'recipe_id' => $post_id,
					),
					admin_url( 'edit.php' )
				);
				echo sprintf( '<a href="%s">%s</a>', $url, $count ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				break;
			case 'type':
				$type = get_post_meta( $post_id, 'uap_recipe_type', true );
				echo empty( $type ) ? esc_html__( 'User', 'uncanny-automator' ) : esc_html( ucfirst( $type ) );
				break;
			case 'recipe_status':
				$post_status = get_post_status( $post_id );
				echo 'publish' === $post_status ? '<span class="dashicons dashicons-yes-alt recipe-ui-dash" title="Live"></span>' . esc_html__( 'Live', 'uncanny-automator' ) : '<span class="dashicons dashicons-warning recipe-ui-dash" title="Draft"></span>' . esc_html__( 'Draft', 'uncanny-automator' );
				break;
		}
	}
	/**
	 * Create custom columns in the recipe list
	 *
	 * @param $columns
	 *
	 * @return mixed
	 */
	public function set_custom_columns( $columns ) {
		$new_columns = array();
		foreach ( $columns as $key => $column ) {
			if ( 'author' === $key ) {
				$new_columns['type']     = esc_attr__( 'Recipe type', 'uncanny-automator' );
				$new_columns['triggers'] = esc_attr__( 'Triggers', 'uncanny-automator' );
				$new_columns['actions']  = esc_attr__( 'Actions', 'uncanny-automator' );
				/* translators: The number of times a recipe was completed */
				$new_columns['runs']          = esc_attr__( 'Completed runs', 'uncanny-automator' );
				$new_columns['recipe_status'] = esc_attr__( 'Recipe status', 'uncanny-automator' );
				$new_columns[ $key ]          = $column;
			} else {
				$new_columns[ $key ] = $column;
			}
		}
		return $new_columns;
	}
}

Methods Methods