LLMS_Abstract_Processor
Background Processor abstract class
Source Source
File: includes/abstracts/llms.abstract.processor.php
abstract class LLMS_Abstract_Processor extends WP_Background_Process { /** * Prefix * * @var string */ protected $prefix = 'llms'; /** * Unique identifier for the processor * * @var string */ protected $id; /** * Initializer * * Acts as a constructor that extending processors should implement * at the very least should populate the $this->actions array. * * @since 3.15.0 * * @return void */ abstract protected function init(); /** * Array of actions that should be watched to trigger * the process(es) * * @var array */ protected $actions = array(); /** * Constructor * * @since 3.15.0 * * @return void */ public function __construct() { $this->action .= '_' . $this->id; parent::__construct(); // Setup. $this->init(); // Add trigger actions. $this->add_actions(); } /** * Add actions defined in $this->actions * * @since 3.15.0 * * @return void */ public function add_actions() { foreach ( $this->get_actions() as $action => $data ) { $data = wp_parse_args( $data, array( 'arguments' => 1, 'priority' => 10, ) ); add_action( $action, array( $this, $data['callback'] ), $data['priority'], $data['arguments'] ); } } /** * Disable a processor * * Useful when bulk enrolling into a membership (for example) * so we don't trigger course data calculations a few hundred times. * * @since 3.15.0 * * @return void */ public function disable() { remove_action( $this->cron_hook_identifier, array( $this, 'handle_cron_healthcheck' ) ); foreach ( $this->get_actions() as $action => $data ) { $data = wp_parse_args( $data, array( 'arguments' => 1, 'priority' => 10, ) ); remove_action( $action, array( $this, $data['callback'] ), $data['priority'], $data['arguments'] ); } } /** * Dispatch * * Overrides the parent method to reset the (saved) `$data` property and * prevent duplicate data being pushed into future batches. * * @since 4.21.0 * * @return array|WP_Error Result of wp_remote_post() */ public function dispatch() { // Perform the parent method. $ret = parent::dispatch(); /** * Empty the (saved) data to prevent duplicate data in future batches. * * @link https://github.com/gocodebox/lifterlms/issues/1602 */ $this->data = array(); return $ret; } /** * Retrieve a filtered array of actions to be added by $this->add_actions * * @since 3.15.0 * * @return array */ private function get_actions() { return apply_filters( 'llms_data_processor_' . $this->id . '_actions', $this->actions, $this ); } /** * Retrieve data for the current processor that can be used * in future processes * * @since 3.15.0 * * @param string $key If set, return a specific piece of data rather than the whole array. * @param string $default When returning a specific piece of data, allows a default value to be passed. * @return array|mixed */ public function get_data( $key = null, $default = '' ) { // Get the array of processor data. $all_data = get_option( 'llms_processor_data', array() ); // Get data for current processor. $data = isset( $all_data[ $this->id ] ) ? $all_data[ $this->id ] : array(); // Get a specific piece of data. if ( $key ) { return isset( $data[ $key ] ) ? $data[ $key ] : $default; } // Return all the data. return $data; } /** * Returns the edit post link for a post. * * This is based on the WordPress {@see get_edit_post_link()} function, but does not check if the user can * edit the post or if the post's post type has an edit link defined. * * When the background processor is running, the current user ID is 0. This prevents {@see current_user_can()} * from ever returning true and also causes the post's post type edit link to be set to an empty string in * {@see WP_Post_Type::set_props()}. * * This method is useful when the processor has completed and creates an admin notice that contains an edit post link. * * @since 6.0.0 * * @param int|WP_Post $id Optional. Post ID or post object. Default is the global `$post`. * @param string $context Optional. How to output the '&' character. Default '&'. * @return string|null The edit post link for the given post. Null if the post type does not exist * or does not allow an editing UI. */ protected function get_edit_post_link( $id = 0, $context = 'display' ) { $post = get_post( $id ); if ( ! $post ) { return null; } $post_type_object = get_post_type_object( $post->post_type ); if ( ! $post_type_object ) { return null; } if ( 'revision' === $post->post_type ) { $action = ''; } elseif ( 'display' === $context ) { $action = '&action=edit'; } else { $action = '&action=edit'; } $link = admin_url( sprintf( 'post.php?post=%d%s', $post->ID, $action ) ); /** * Filters the post edit link. * * This is identical to the `get_edit_post_link` filter hook in {@see get_edit_post_link()}. * * @since 6.0.0 * * @param string $link The edit link. * @param int $post_id Post ID. * @param string $context The link context. If set to 'display' then ampersands are encoded. */ return apply_filters( 'get_edit_post_link', $link, $post->ID, $context ); } /** * Log data to the processors log when processors debugging is enabled * * @since 3.15.0 * * @param mixed $data Data to log. * @return void */ protected function log( $data ) { if ( defined( 'LLMS_PROCESSORS_DEBUG' ) && LLMS_PROCESSORS_DEBUG ) { llms_log( $data, 'processors' ); } } /** * Persist data to the database related to the processor * * @since 3.15.0 * * @param array $data Data to save. * @return void */ private function save_data( $data ) { // Merge the current data with all processor data. $all_data = wp_parse_args( array( $this->id => $data, ), get_option( 'llms_processor_data', array() ) ); // Save it. update_option( 'llms_processor_data', $all_data ); } /** * Update data to the database related to the processor * * @since 3.15.0 * * @param string $key Key name. * @param mixed $value Value. * @return void */ public function set_data( $key, $value ) { // Get the array of processor data. $data = $this->get_data(); $data[ $key ] = $value; $this->save_data( $data ); } /** * Delete a piece of data from the database by key * * @since 3.15.0 * * @param string $key Key name to remove. * @return void */ public function unset_data( $key ) { $data = $this->get_data(); if ( isset( $data[ $key ] ) ) { unset( $data[ $key ] ); } $this->save_data( $data ); } }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- add_actions — Add actions defined in $this->actions
- disable — Disable a processor
- dispatch — Dispatch
- get_actions — Retrieve a filtered array of actions to be added by $this->add_actions
- get_data — Retrieve data for the current processor that can be used in future processes
- get_edit_post_link — Returns the edit post link for a post.
- init — Initializer
- log — Log data to the processors log when processors debugging is enabled
- save_data — Persist data to the database related to the processor
- set_data — Update data to the database related to the processor
- unset_data — Delete a piece of data from the database by key
Changelog Changelog
Version | Description |
---|---|
3.15.0 | Introduced. |