PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 10.9.4
WooCommerce v10.9.4
10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 7.8.0-beta.1 7.8.0-beta.2 7.8.0-rc.1 7.8.0-rc.2 7.8.1 7.8.2 7.8.3 7.8.4 7.9.0 7.9.0-beta.1 7.9.0-beta.2 7.9.0-rc.2 7.9.0-rc.3 7.9.1 7.9.2 8.0.0 8.0.0-beta.1 8.0.0-beta.2 8.0.0-rc.1 8.0.0-rc.2 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.1.0 8.1.0-beta.1 8.1.0-rc.1 8.1.0-rc.2 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 8.2.0-beta.1 8.2.0-rc.1 8.2.0-rc.2 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.3.0 8.3.0-beta.1 8.3.0-rc.1 8.3.0-rc.2 8.3.1 8.3.2 8.3.3 8.3.4 8.4.0 8.4.0-beta.1 8.4.0-rc.1 8.4.1 8.4.2 8.4.3 8.5.0 8.5.0-beta.1 8.5.0-rc.1 8.5.1 8.5.2 8.5.3 8.5.4 8.5.5 8.6.0 8.6.0-beta.1 8.6.0-rc.1 8.6.1 8.6.2 8.6.3 8.6.4 8.7.0 8.7.0-beta.1 8.7.0-beta.2 8.7.0-rc.1 8.7.1 8.7.2 8.7.3 8.8.0 8.8.0-beta.1 8.8.0-rc.1 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.8.6 8.8.7 8.9.0 8.9.0-beta.1 8.9.0-rc.1 8.9.1 8.9.2 8.9.3 8.9.4 8.9.5 9.0.0 9.0.0-beta.1 9.0.0-beta.2 9.0.0-rc.1 9.0.1 9.0.2 9.0.3 9.0.4 9.1.0 9.1.0-beta.1 9.1.0-rc.1 9.1.1 9.1.2 9.1.3 9.1.4 9.1.5 9.1.6 9.2.0 9.2.0-beta.1 9.2.0-rc.1 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.3.0 9.3.0-beta.1 9.3.0-rc.1 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.4.0 9.4.0-beta.1 9.4.0-beta.2 9.4.0-rc.1 9.4.0-rc.2 9.4.0-rc.3 9.4.0-rc.4 9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.5.0 9.5.0-beta.1 9.5.0-beta.2 9.5.0-rc.1 9.5.1 9.5.2 9.5.3 9.5.4 9.6.0 9.6.0-beta.1 9.6.0-beta.2 9.6.0-rc.1 9.6.1 9.6.2 9.6.3 9.6.4 9.7.0 9.7.0-beta.1 9.7.0-rc.1 9.7.1 9.7.2 9.7.3 9.8.0 9.8.0-beta.1 9.8.0-rc.1 9.8.1 9.8.2 9.8.3 9.8.4 9.8.5 9.8.6 9.8.7 9.9.0 9.9.0-beta.1 9.9.0-rc.1 9.9.1 9.9.2 9.9.3 9.9.4 9.9.5 9.9.6 9.9.7 3.7.3 7.1.2 3.8.0 7.2.0 3.8.0-beta.1 7.2.0-beta.1 3.8.0-rc.1 7.2.0-beta.2 3.8.0-rc.2 7.2.0-rc.1 3.8.1 7.2.0-rc.2 3.8.2 7.2.1 3.8.3 7.2.2 3.9.0 7.2.3 3.9.0-beta.1 7.2.4 3.9.0-beta.2 7.3.0 3.9.0-rc.1 7.3.0-beta.1 3.9.0-rc.2 7.3.0-beta.2 3.9.0-rc.3 7.3.0-rc.1 3.9.0-rc.4 7.3.0-rc.2 3.9.1 7.3.1 3.9.2 7.4.0 3.9.3 7.4.0-beta.1 3.9.4 7.4.0-beta.2 3.9.5 7.4.0-rc.1 4.0.0 7.4.0-rc.2 4.0.0-beta.1 7.4.1 4.0.0-rc.1 7.4.2 4.0.0-rc.2 7.5.0 4.0.1 7.5.0-beta.1 4.0.2 7.5.0-beta.2 4.0.3 7.5.0-rc.1 4.0.4 7.5.1 4.1.0 7.5.2 4.1.0-beta.1 7.6.0 4.1.0-beta.2 7.6.0-beta.1 4.1.0-rc.1 7.6.0-beta.2 4.1.0-rc.2 7.6.0-rc.1 4.1.1 7.6.0-rc.2 4.1.2 7.6.0-rc.3 4.1.3 7.6.1 4.1.4 7.6.2 4.2.0 7.7.0 4.2.0-RC.1 7.7.0-beta.1 4.2.0-RC.2 7.7.0-beta.2 4.2.0-beta.1 7.7.0-rc.1 4.2.1 7.7.1 4.2.2 7.7.2 4.2.3 7.7.3 4.2.4 7.8.0 4.2.5 4.3.0 4.3.0-beta.1 4.3.0-rc.1 4.3.0-rc.2 4.3.0-rc.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.4.0 4.4.0-beta.1 4.4.0-rc.1 4.4.1 4.4.2 4.4.3 4.4.4 4.5.0 4.5.0-beta.1 4.5.0-rc.1 4.5.0-rc.3 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.6.0-beta.1 4.6.0-rc.1 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.7.0 4.7.0-beta.1 4.7.0-beta.2 4.7.0-rc.1 4.7.1 4.7.1-beta.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.0-beta.1 4.8.0-rc.1 4.8.0-rc.2 4.8.1 4.8.2 4.8.3 4.9.0 4.9.0-beta.1 4.9.0-rc.1 4.9.0-rc.2 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 5.0.0 5.0.0-beta.1 5.0.0-beta.2 5.0.0-rc.1 5.0.0-rc.2 5.0.0-rc.3 5.0.1 5.0.2 5.0.3 5.1.0 5.1.0-beta.1 5.1.0-rc.1 trunk 5.1.1 10.0.0 5.1.2 10.0.0-rc.1 5.1.3 10.0.0-rc.2 5.2.0 10.0.1 5.2.0-beta.1 10.0.2 5.2.0-rc.1 10.0.3 5.2.0-rc.2 10.0.4 5.2.1 10.0.5 5.2.2 10.0.6 5.2.3 10.1.0 5.2.4 10.1.0-rc.1 5.2.5 10.1.0-rc.2 5.3.0 10.1.0-rc.3 5.3.0-beta.1 10.1.0-rc.4 5.3.0-rc.1 10.1.1 5.3.0-rc.2 10.1.2 5.3.1 10.1.3 5.3.2 10.1.4 5.3.3 10.2.0 5.4.0 10.2.0-beta.1 5.4.0-beta.1 10.2.0-beta.2 5.4.0-rc.1 10.2.0-rc.1 5.4.1 10.2.1 5.4.2 10.2.2 5.4.3 10.2.3 5.4.4 10.2.4 5.4.5 10.3.0 5.5.0 10.3.0-beta.1 5.5.0-beta.1 10.3.0-beta.2 5.5.0-rc.1 10.3.0-rc.1 5.5.0-rc.2 10.3.0-rc.2 5.5.1 10.3.1 5.5.2 10.3.2 5.5.3 10.3.3 5.5.4 10.3.4 5.5.5 10.3.5 5.6.0 10.3.6 5.6.0-beta.1 10.3.7 5.6.0-rc.1 10.3.8 5.6.0-rc.2 10.4.0 5.6.1 10.4.0-beta.1 5.6.2 10.4.0-beta.2 5.6.3 10.4.0-rc.1 5.7.0 10.4.1 5.7.0-beta.1 10.4.2 5.7.0-rc.1 10.4.3 5.7.1 10.4.4 5.7.2 10.5.0 5.7.3 10.5.0-beta.1 5.8.0 10.5.0-beta.2 5.8.0-beta.1 10.5.0-rc.1 5.8.0-beta.2 10.5.0-rc.2 5.8.0-rc.1 10.5.0-rc.3 5.8.1 10.5.1 5.8.2 10.5.2 5.9.0 10.5.3 5.9.0-beta.1 10.6.0 5.9.0-rc.1 10.6.0-beta.1 5.9.0-rc.2 10.6.0-beta.2 5.9.1 10.6.0-rc.1 5.9.2 10.6.1 6.0.0 10.6.2 6.0.0-beta.1 10.7.0 6.0.0-rc.1 10.7.0-beta.1 6.0.1 10.7.0-beta.2 6.0.2 10.7.0-rc.1 6.1.0 3.0.0 6.1.0-beta.1 3.0.1 6.1.0-rc.1 3.0.2 6.1.0-rc.2 3.0.3 6.1.1 3.0.4 6.1.2 3.0.5 6.1.3 3.0.6 6.2.0 3.0.7 6.2.0-beta.1 3.0.8 6.2.0-rc.1 3.0.9 6.2.0-rc.2 3.1.0 6.2.1 3.1.1 6.2.2 3.1.2 6.2.3 3.2.0 6.3.0 3.2.1 6.3.0-beta.1 3.2.2 6.3.0-rc.1 3.2.3 6.3.0-rc.2 3.2.4 6.3.1 3.2.5 6.3.2 3.2.6 6.4.0 3.3.0 6.4.0-beta.1 3.3.1 6.4.0-rc.1 3.3.2 6.4.1 3.3.2-rc.1 6.4.2 3.3.3 6.5.0 3.3.4 6.5.0-beta.1 3.3.5 6.5.0-rc.1 3.3.6 6.5.0-rc.2 3.4.0 6.5.1 3.4.0-beta.1 6.5.2 3.4.0-rc.2 6.6.0 3.4.1 6.6.0-beta.1 3.4.2 6.6.0-rc.1 3.4.3 6.6.0-rc.2 3.4.4 6.6.1 3.4.5 6.6.2 3.4.6 6.7.0 3.4.7 6.7.0-beta.1 3.4.8 6.7.0-beta.2 3.5.0 6.7.0-rc.1 3.5.0-beta.1 6.7.1 3.5.0-rc.1 6.8.0 3.5.0-rc.2 6.8.0-beta.1 3.5.1 6.8.0-beta.2 3.5.10 6.8.0-rc.1 3.5.2 6.8.1 3.5.3 6.8.2 3.5.4 6.8.3 3.5.5 6.9.0 3.5.6 6.9.0-beta.1 3.5.7 6.9.0-beta.2 3.5.8 6.9.0-rc.1 3.5.9 6.9.1 3.6.0 6.9.2 3.6.0-beta.1 6.9.3 3.6.0-rc.1 6.9.4 3.6.0-rc.2 6.9.5 3.6.0-rc.3 7.0.0 3.6.1 7.0.0-beta.1 3.6.2 7.0.0-beta.2 3.6.3 7.0.0-beta.3 3.6.4 7.0.0-rc.1 3.6.5 7.0.0-rc.2 3.6.6 7.0.1 3.6.7 7.0.2 3.7.0 7.1.0 3.7.0-beta.1 7.1.0-beta.1 3.7.0-rc.1 7.1.0-beta.2 3.7.0-rc.2 7.1.0-rc.1 3.7.1 7.1.0-rc.2 3.7.2 7.1.1
woocommerce / packages / action-scheduler / classes / ActionScheduler_AdminView.php
woocommerce / packages / action-scheduler / classes Last commit date
WP_CLI 11 months ago abstracts 11 months ago actions 1 year ago data-stores 11 months ago migration 1 year ago schedules 1 year ago schema 11 months ago ActionScheduler_ActionClaim.php 1 year ago ActionScheduler_ActionFactory.php 1 year ago ActionScheduler_AdminView.php 1 year ago ActionScheduler_AsyncRequest_QueueRunner.php 1 year ago ActionScheduler_Compatibility.php 1 year ago ActionScheduler_DataController.php 11 months ago ActionScheduler_DateTime.php 1 year ago ActionScheduler_Exception.php 3 years ago ActionScheduler_FatalErrorMonitor.php 1 year ago ActionScheduler_InvalidActionException.php 1 year ago ActionScheduler_ListTable.php 1 year ago ActionScheduler_LogEntry.php 1 year ago ActionScheduler_NullLogEntry.php 1 year ago ActionScheduler_OptionLock.php 1 year ago ActionScheduler_QueueCleaner.php 1 year ago ActionScheduler_QueueRunner.php 1 year ago ActionScheduler_RecurringActionScheduler.php 11 months ago ActionScheduler_SystemInformation.php 1 year ago ActionScheduler_Versions.php 1 year ago ActionScheduler_WPCommentCleaner.php 1 year ago ActionScheduler_wcSystemStatus.php 11 months ago
ActionScheduler_AdminView.php
312 lines
1 <?php
2
3 /**
4 * Class ActionScheduler_AdminView
5 *
6 * @codeCoverageIgnore
7 */
8 class ActionScheduler_AdminView extends ActionScheduler_AdminView_Deprecated {
9
10 /**
11 * Instance.
12 *
13 * @var null|self
14 */
15 private static $admin_view = null;
16
17 /**
18 * Screen ID.
19 *
20 * @var string
21 */
22 private static $screen_id = 'tools_page_action-scheduler';
23
24 /**
25 * ActionScheduler_ListTable instance.
26 *
27 * @var ActionScheduler_ListTable
28 */
29 protected $list_table;
30
31 /**
32 * Get instance.
33 *
34 * @return ActionScheduler_AdminView
35 * @codeCoverageIgnore
36 */
37 public static function instance() {
38
39 if ( empty( self::$admin_view ) ) {
40 $class = apply_filters( 'action_scheduler_admin_view_class', 'ActionScheduler_AdminView' );
41 self::$admin_view = new $class();
42 }
43
44 return self::$admin_view;
45 }
46
47 /**
48 * Initialize.
49 *
50 * @codeCoverageIgnore
51 */
52 public function init() {
53 if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
54
55 if ( class_exists( 'WooCommerce' ) ) {
56 add_action( 'woocommerce_admin_status_content_action-scheduler', array( $this, 'render_admin_ui' ) );
57 add_action( 'woocommerce_system_status_report', array( $this, 'system_status_report' ) );
58 add_filter( 'woocommerce_admin_status_tabs', array( $this, 'register_system_status_tab' ) );
59 }
60
61 add_action( 'admin_menu', array( $this, 'register_menu' ) );
62 add_action( 'admin_notices', array( $this, 'maybe_check_pastdue_actions' ) );
63 add_action( 'current_screen', array( $this, 'add_help_tabs' ) );
64 }
65 }
66
67 /**
68 * Print system status report.
69 */
70 public function system_status_report() {
71 $table = new ActionScheduler_wcSystemStatus( ActionScheduler::store() );
72 $table->render();
73 }
74
75 /**
76 * Registers action-scheduler into WooCommerce > System status.
77 *
78 * @param array $tabs An associative array of tab key => label.
79 * @return array $tabs An associative array of tab key => label, including Action Scheduler's tabs
80 */
81 public function register_system_status_tab( array $tabs ) {
82 $tabs['action-scheduler'] = __( 'Scheduled Actions', 'woocommerce' );
83
84 return $tabs;
85 }
86
87 /**
88 * Include Action Scheduler's administration under the Tools menu.
89 *
90 * A menu under the Tools menu is important for backward compatibility (as that's
91 * where it started), and also provides more convenient access than the WooCommerce
92 * System Status page, and for sites where WooCommerce isn't active.
93 */
94 public function register_menu() {
95 $hook_suffix = add_submenu_page(
96 'tools.php',
97 __( 'Scheduled Actions', 'woocommerce' ),
98 __( 'Scheduled Actions', 'woocommerce' ),
99 'manage_options',
100 'action-scheduler',
101 array( $this, 'render_admin_ui' )
102 );
103 add_action( 'load-' . $hook_suffix, array( $this, 'process_admin_ui' ) );
104 }
105
106 /**
107 * Triggers processing of any pending actions.
108 */
109 public function process_admin_ui() {
110 $this->get_list_table();
111 }
112
113 /**
114 * Renders the Admin UI
115 */
116 public function render_admin_ui() {
117 $table = $this->get_list_table();
118 $table->display_page();
119 }
120
121 /**
122 * Get the admin UI object and process any requested actions.
123 *
124 * @return ActionScheduler_ListTable
125 */
126 protected function get_list_table() {
127 if ( null === $this->list_table ) {
128 $this->list_table = new ActionScheduler_ListTable( ActionScheduler::store(), ActionScheduler::logger(), ActionScheduler::runner() );
129 $this->list_table->process_actions();
130 }
131
132 return $this->list_table;
133 }
134
135 /**
136 * Action: admin_notices
137 *
138 * Maybe check past-due actions, and print notice.
139 *
140 * @uses $this->check_pastdue_actions()
141 */
142 public function maybe_check_pastdue_actions() {
143
144 // Filter to prevent checking actions (ex: inappropriate user).
145 if ( ! apply_filters( 'action_scheduler_check_pastdue_actions', current_user_can( 'manage_options' ) ) ) {
146 return;
147 }
148
149 // Get last check transient.
150 $last_check = get_transient( 'action_scheduler_last_pastdue_actions_check' );
151
152 // If transient exists, we're within interval, so bail.
153 if ( ! empty( $last_check ) ) {
154 return;
155 }
156
157 // Perform the check.
158 $this->check_pastdue_actions();
159 }
160
161 /**
162 * Check past-due actions, and print notice.
163 */
164 protected function check_pastdue_actions() {
165
166 // Set thresholds.
167 $threshold_seconds = (int) apply_filters( 'action_scheduler_pastdue_actions_seconds', DAY_IN_SECONDS );
168 $threshold_min = (int) apply_filters( 'action_scheduler_pastdue_actions_min', 1 );
169
170 // Set fallback value for past-due actions count.
171 $num_pastdue_actions = 0;
172
173 // Allow third-parties to preempt the default check logic.
174 $check = apply_filters( 'action_scheduler_pastdue_actions_check_pre', null );
175
176 // If no third-party preempted and there are no past-due actions, return early.
177 if ( ! is_null( $check ) ) {
178 return;
179 }
180
181 // Scheduled actions query arguments.
182 $query_args = array(
183 'date' => as_get_datetime_object( time() - $threshold_seconds ),
184 'status' => ActionScheduler_Store::STATUS_PENDING,
185 'per_page' => $threshold_min,
186 );
187
188 // If no third-party preempted, run default check.
189 if ( is_null( $check ) ) {
190 $store = ActionScheduler_Store::instance();
191 $num_pastdue_actions = (int) $store->query_actions( $query_args, 'count' );
192
193 // Check if past-due actions count is greater than or equal to threshold.
194 $check = ( $num_pastdue_actions >= $threshold_min );
195 $check = (bool) apply_filters( 'action_scheduler_pastdue_actions_check', $check, $num_pastdue_actions, $threshold_seconds, $threshold_min );
196 }
197
198 // If check failed, set transient and abort.
199 if ( ! boolval( $check ) ) {
200 $interval = apply_filters( 'action_scheduler_pastdue_actions_check_interval', round( $threshold_seconds / 4 ), $threshold_seconds );
201 set_transient( 'action_scheduler_last_pastdue_actions_check', time(), $interval );
202
203 return;
204 }
205
206 $actions_url = add_query_arg(
207 array(
208 'page' => 'action-scheduler',
209 'status' => 'past-due',
210 'order' => 'asc',
211 ),
212 admin_url( 'tools.php' )
213 );
214
215 // Print notice.
216 echo '<div class="notice notice-warning"><p>';
217 printf(
218 wp_kses(
219 // translators: 1) is the number of affected actions, 2) is a link to an admin screen.
220 _n(
221 '<strong>Action Scheduler:</strong> %1$d <a href="%2$s">past-due action</a> found; something may be wrong. <a href="https://actionscheduler.org/faq/#my-site-has-past-due-actions-what-can-i-do" target="_blank">Read documentation &raquo;</a>',
222 '<strong>Action Scheduler:</strong> %1$d <a href="%2$s">past-due actions</a> found; something may be wrong. <a href="https://actionscheduler.org/faq/#my-site-has-past-due-actions-what-can-i-do" target="_blank">Read documentation &raquo;</a>',
223 $num_pastdue_actions,
224 'woocommerce'
225 ),
226 array(
227 'strong' => array(),
228 'a' => array(
229 'href' => true,
230 'target' => true,
231 ),
232 )
233 ),
234 absint( $num_pastdue_actions ),
235 esc_attr( esc_url( $actions_url ) )
236 );
237 echo '</p></div>';
238
239 // Facilitate third-parties to evaluate and print notices.
240 do_action( 'action_scheduler_pastdue_actions_extra_notices', $query_args );
241 }
242
243 /**
244 * Provide more information about the screen and its data in the help tab.
245 */
246 public function add_help_tabs() {
247 $screen = get_current_screen();
248
249 if ( ! $screen || self::$screen_id !== $screen->id ) {
250 return;
251 }
252
253 $as_version = ActionScheduler_Versions::instance()->latest_version();
254 $as_source = ActionScheduler_SystemInformation::active_source();
255 $as_source_path = ActionScheduler_SystemInformation::active_source_path();
256 $as_source_markup = sprintf( '<code>%s</code>', esc_html( $as_source_path ) );
257
258 if ( ! empty( $as_source ) ) {
259 $as_source_markup = sprintf(
260 '%s: <abbr title="%s">%s</abbr>',
261 ucfirst( $as_source['type'] ),
262 esc_attr( $as_source_path ),
263 esc_html( $as_source['name'] )
264 );
265 }
266
267 $screen->add_help_tab(
268 array(
269 'id' => 'action_scheduler_about',
270 'title' => __( 'About', 'woocommerce' ),
271 'content' =>
272 // translators: %s is the Action Scheduler version.
273 '<h2>' . sprintf( __( 'About Action Scheduler %s', 'woocommerce' ), $as_version ) . '</h2>' .
274 '<p>' .
275 __( 'Action Scheduler is a scalable, traceable job queue for background processing large sets of actions. Action Scheduler works by triggering an action hook to run at some time in the future. Scheduled actions can also be scheduled to run on a recurring schedule.', 'woocommerce' ) .
276 '</p>' .
277 '<h3>' . esc_html__( 'Source', 'woocommerce' ) . '</h3>' .
278 '<p>' .
279 esc_html__( 'Action Scheduler is currently being loaded from the following location. This can be useful when debugging, or if requested by the support team.', 'woocommerce' ) .
280 '</p>' .
281 '<p>' . $as_source_markup . '</p>' .
282 '<h3>' . esc_html__( 'WP CLI', 'woocommerce' ) . '</h3>' .
283 '<p>' .
284 sprintf(
285 /* translators: %1$s is WP CLI command (not translatable) */
286 esc_html__( 'WP CLI commands are available: execute %1$s for a list of available commands.', 'woocommerce' ),
287 '<code>wp help action-scheduler</code>'
288 ) .
289 '</p>',
290 )
291 );
292
293 $screen->add_help_tab(
294 array(
295 'id' => 'action_scheduler_columns',
296 'title' => __( 'Columns', 'woocommerce' ),
297 'content' =>
298 '<h2>' . __( 'Scheduled Action Columns', 'woocommerce' ) . '</h2>' .
299 '<ul>' .
300 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Hook', 'woocommerce' ), __( 'Name of the action hook that will be triggered.', 'woocommerce' ) ) .
301 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Status', 'woocommerce' ), __( 'Action statuses are Pending, Complete, Canceled, Failed', 'woocommerce' ) ) .
302 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Arguments', 'woocommerce' ), __( 'Optional data array passed to the action hook.', 'woocommerce' ) ) .
303 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Group', 'woocommerce' ), __( 'Optional action group.', 'woocommerce' ) ) .
304 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Recurrence', 'woocommerce' ), __( 'The action\'s schedule frequency.', 'woocommerce' ) ) .
305 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Scheduled', 'woocommerce' ), __( 'The date/time the action is/was scheduled to run.', 'woocommerce' ) ) .
306 sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Log', 'woocommerce' ), __( 'Activity log for the action.', 'woocommerce' ) ) .
307 '</ul>',
308 )
309 );
310 }
311 }
312