Populate_From_Query
Class Populate_From_Query.
Source Source
File: src/core/classes/class-populate-from-query.php
class Populate_From_Query { /** * WP Post object. * * @var \WP_Post */ static $post; /** * Recipe functions. * * @var Recipe */ static $recipe; /** * Nonce name. * * @var string */ static $nonce = 'Uncanny Automator'; /** * Figure out if this post needs to be populated from the query params. * * @param $post_ID * @param \WP_Post * @param $update */ public static function maybe_populate( $post_ID, $post, $update ) { self::init( $post ); try { if ( self::is_new_recipe() ) { if ( self::query_args_exist( array( 'action', 'nonce' ) ) ) { if ( self::is_authorized() ) { return self::populate(); } } return false; } } catch ( \Throwable $e ) { error_log( 'Uncanny_Automator\Populate_From_Query: ' . $e->getMessage() ); } } /** * Initialize class, populate the variables from the hook call. * * @param \WP_Post */ public static function init( $post ) { self::$recipe = new Recipe(); self::$post = $post; } /** * Check if the post is an Automator recipe and is newly created. * * @return bool */ protected static function is_new_recipe() { if ( 'uo-recipe' !== self::$post->post_type ) { return false; } if ( 'auto-draft' !== self::$post->post_status ) { return false; } return true; } /** * Check if query arguments exist in the GET array. * * @param $args * * @return bool */ protected static function query_args_exist( $args ) { foreach ( $args as $arg ) { if ( ! isset( $_GET[ $arg ] ) ) { return false; } } return true; } /** * Checks the nonce and capabilities. * * @return bool */ private static function is_authorized() { if ( ! wp_verify_nonce( $_GET['nonce'], self::$nonce ) ) { throw new \Exception( 'Invalid nonce.' ); } // Use the save_setting_permissings function from the recipe class to check required capabilities. return self::$recipe->save_settings_permissions(); } /** * Populates the recipe. * * @return bool */ protected static function populate() { switch ( $_GET['action'] ) { case 'add-new-trigger': if ( self::query_args_exist( array( 'item_code' ) ) ) { return self::add_new_trigger(); } else { throw new \Exception( 'Missing item code.' ); } break; default: throw new \Exception( 'Unknown action.' ); break; } return true; } /** * Creates a trigger. * * @return bool */ public static function add_new_trigger() { self::change_recipe_type(); $trigger_id = self::add_trigger(); // Trigger was created, check if its meta needs to be set self::maybe_update_trigger( $trigger_id ); // add do_action for external hooks do_action_deprecated( 'uap_trigger_populated_from_query', array( self::$post, $trigger_id, $_GET, // phpcs:ignore WordPress.Security.NonceVerification.Recommended ), '3.0', 'automator_trigger_populated_from_query' ); do_action( 'automator_trigger_populated_from_query', self::$post, $trigger_id, $_GET ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended return true; } /** * Changes recipe type to logged-in. * * @return bool */ public static function change_recipe_type() { $_POST['post_ID'] = self::$post->ID; $_POST['recipe_type'] = 'user'; $recipe_type_changed = self::$recipe->change_post_recipe_type( '' ); if ( ! $recipe_type_changed->data['success'] ) { throw new \Exception( "Recipe type couldn't be changed." ); } return true; } /** * Populates the POST array with the data and adds a trigger. * * @return string trigger ID */ public static function add_trigger() { $_POST['recipePostID'] = self::$post->ID; $_POST['action'] = $_GET['action']; $_POST['item_code'] = $_GET['item_code']; $trigger_added = self::$recipe->add( '' ); if ( ! $trigger_added->data['success'] ) { throw new \Exception( "Trigger couldn't be added." ); } else { return $trigger_added->data['post_ID']; } } /** * Decides if trigger needs a value. * * @return bool */ public static function maybe_update_trigger( $trigger_id ) { $trigger_value = self::query_args_exist( array( 'optionCode', 'optionValue', 'optionValue_readable' ) ); if ( $trigger_value ) { // Check if trigger value needs to be populated self::add_trigger_value( $trigger_id ); self::publish_trigger( $trigger_id ); } return true; } /** * Populates the POST array with the data and adds trigger value. * * @return bool */ public static function add_trigger_value( $trigger_id ) { $_POST['itemId'] = $trigger_id; $_POST['optionCode'] = $_GET['optionCode']; $_POST['optionValue'] = array( $_POST['optionCode'] => $_GET['optionValue'], $_POST['optionCode'] . '_readable' => urldecode( $_GET['optionValue_readable'] ), ); $trigger_value_added = self::$recipe->update( '' ); if ( ! $trigger_value_added->data['success'] ) { throw new \Exception( "Trigger value couldn't be set." ); } return true; } /** * Populates the POST array and publishes the trigger. * * @return bool */ public static function publish_trigger( $trigger_id ) { $_POST['post_ID'] = $trigger_id; $_POST['post_status'] = 'publish'; $trigger_status_changed = self::$recipe->change_post_status( '' ); if ( ! $trigger_status_changed->data['success'] ) { throw new \Exception( "Trigger couldn't be published." ); } return true; } }
Expand full source code Collapse full source code View on Github
Methods Methods
- add_new_trigger — Creates a trigger.
- add_trigger — Populates the POST array with the data and adds a trigger.
- add_trigger_value — Populates the POST array with the data and adds trigger value.
- change_recipe_type — Changes recipe type to logged-in.
- init — Initialize class, populate the variables from the hook call.
- is_authorized — Checks the nonce and capabilities.
- is_new_recipe — Check if the post is an Automator recipe and is newly created.
- maybe_populate — Figure out if this post needs to be populated from the query params.
- maybe_update_trigger — Decides if trigger needs a value.
- populate — Populates the recipe.
- publish_trigger — Populates the POST array and publishes the trigger.
- query_args_exist — Check if query arguments exist in the GET array.