/wp-content/plugins/the-events-calendar/common/src/Tribe/Service_Providers/Processes.php
https://github.com/livinglab/openlab · PHP · 278 lines · 116 code · 37 blank · 125 comment · 19 complexity · f66e669378d620ceb0d68ec33f452b98 MD5 · raw file
- <?php
- /**
- * Class Tribe__Service_Providers__Processes
- *
- * @since 4.7.12
- *
- * Handles the registration and creation of our async process handlers.
- */
- class Tribe__Service_Providers__Processes extends tad_DI52_ServiceProvider {
- /**
- * An array of all handler actions registered in this HTTP request.
- *
- * This is an array cache with a request lifetime by design.
- *
- * @var array
- */
- protected $handler_actions;
- /**
- * An array of all queue actions registered in this HTTP request.
- *
- * This is an array cache with a request lifetime by design.
- *
- * @var array
- */
- protected $queue_actions;
- /**
- * An instance of the context abstraction layer.
- *
- * @var Tribe__Context
- */
- protected $context;
- /**
- * Hooks the filters and binds the implementations needed to handle processes.
- */
- public function register() {
- $this->context = tribe( 'context' );
- // If the context of this request is neither AJAX or Cron bail.
- if ( ! ( $this->context->doing_ajax() || $this->context->doing_cron() ) ) {
- return;
- }
- /** @var Tribe__Feature_Detection $feature_detection */
- $feature_detection = tribe( 'feature-detection' );
- $action = tribe_get_request_var( 'action', false );
- $testing_for_async_support = $action === $this->get_handler_action( 'Tribe__Process__Tester' );
- // Dispatch in async mode if testing for it (w/o re-checking) or if async processes are supported.
- if ( $testing_for_async_support || $feature_detection->supports_async_process() ) {
- $this->dispatch_async();
- return;
- }
- $this->dispatch_cron();
- }
- /**
- * Hooks the correct handler for the action.
- *
- * @since 4.7.12
- *
- * @param string $action
- */
- protected function hook_handler_for( $action ) {
- if ( null === $this->handler_actions ) {
- $handlers = [
- 'Tribe__Process__Tester',
- 'Tribe__Process__Post_Thumbnail_Setter',
- ];
- /**
- * Filters the process handler classes the Service Provider should handle.
- *
- * All handlers should extend the `Tribe__Process__Handler` base class.
- *
- * @since 4.7.12
- *
- * @param array $handlers
- */
- $handlers = array_unique( apply_filters( 'tribe_process_handlers', $handlers ) );
- $this->handler_actions = array_combine(
- $handlers,
- array_map( [ $this, 'get_handler_action' ], $handlers )
- );
- }
- $array_search = array_search( $action, $this->handler_actions, true );
- if ( false === $handler_class = $array_search ) {
- return;
- }
- // the handler will handle the hooking
- $this->container->make( $handler_class );
- }
- /**
- * Hooks the correct queue for the action.
- *
- * @since 4.7.12
- *
- * @param string $action
- */
- protected function hook_queue_for( $action ) {
- if ( null === $this->queue_actions ) {
- $queues = [
- 'Tribe__Promise',
- ];
- /**
- * Filters the queue processing classes the Service Provider should handle.
- *
- * All queues should extend the `Tribe__Process__Queue` base class.
- *
- * @since 4.7.12
- *
- * @param array $queues An array of class names, each extending the `Tribe__Process__Queue` base class.
- */
- $queues = array_unique( apply_filters( 'tribe_process_queues', $queues ) );
- $all_queues_actions = array_combine(
- $queues,
- array_map( [ $this, 'get_queue_action' ], $queues )
- );
- }
- $array_search = array_search( $action, $all_queues_actions, true );
- if ( false === $queue_class = $array_search ) {
- return;
- }
- // the queue will handle the hooking
- $this->container->make( $queue_class );
- }
- /**
- * Returns the action for the handler.
- *
- * @since 4.7.12
- *
- * @param string $handler_class
- *
- * @return string
- */
- protected function get_handler_action( $handler_class ) {
- /** @var Tribe__Process__Handler handler_class */
- return 'tribe_process_' . call_user_func( [ $handler_class, 'action' ] );
- }
- /**
- * Returns the action for the queue.
- *
- * @since 4.7.12
- *
- * @param string $queue_class
- *
- * @return string
- */
- protected function get_queue_action( $queue_class ) {
- /** @var Tribe__Process__Queue queue_class */
- return 'tribe_queue_' . call_user_func( [ $queue_class, 'action' ] );
- }
- /**
- * Dispatches the request, if in AJAX context of a valid queue processing request,
- * to the correct handler.
- *
- * @since 4.7.23
- */
- protected function dispatch_async() {
- if ( ! (
- $this->context->doing_ajax()
- && false !== $action = tribe_get_request_var( 'action', false )
- ) ) {
- return;
- }
- $this->hook_handler_for_action( $action );
- }
- /**
- * Start the process handlers if in the context of a cron process and
- * if any is registered.
- *
- * @since 4.7.23
- */
- protected function dispatch_cron() {
- if ( ! $this->context->doing_cron() ) {
- return;
- }
- /*
- * Here we parse the scheduled cron events to get those scheduled by a queue
- * or process handler.
- */
- $hooks = $this->get_scheduled_like( [ 'tribe_process_', 'tribe_queue_' ] );
- if ( empty( $hooks ) ) {
- return;
- }
- foreach ( $hooks as $action ) {
- /*
- * Building the queue or process handler for an action will make it
- * so the handler, in its `__construct` method, will hook on the action
- * triggered by its cron event.
- */
- $this->hook_handler_for_action( $action );
- }
- }
- /**
- * Hooks the correct queue or process handler for an action if any.
- *
- * @since 4.7.23
- *
- * @param string $action The action to hook the handler, or queue, for.
- */
- protected function hook_handler_for_action( $action ) {
- if (
- 0 !== strpos( $action, 'tribe_process_' )
- && 0 !== strpos( $action, 'tribe_queue_' )
- ) {
- return;
- }
- if ( 0 === strpos( $action, 'tribe_process_' ) ) {
- $this->hook_handler_for( $action );
- } else {
- $this->hook_queue_for( $action );
- }
- }
- /**
- * Parses the `cron` array to return the hook names starting with a pattern.
- *
- * @since 4.7.23
- *
- * @param string|array $needles A pattern to look for or an array of patterns; if
- * this is an array then a match will be an hook that
- * matches at least one pattern.
- *
- * @return array An array of hook names matching the pattern.
- */
- protected function get_scheduled_like( $needles ) {
- $cron = get_option( 'cron', false );
- if ( empty( $cron ) ) {
- return [];
- }
- $needles = (array) $needles;
- $matching = [];
- foreach ( $cron as $time ) {
- if ( ! is_array( $time ) ) {
- continue;
- }
- foreach ( $time as $hook => $entry ) {
- foreach ( $needles as $needle ) {
- if ( false !== strpos( $hook, $needle ) ) {
- $matching[] = $hook;
- }
- }
- }
- }
- return $matching;
- }
- }