PluginProbe
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI / 6.0.2
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI v6.0.2
6.0.2 6.0.1 6.0.0 5.8.6 5.8.5 5.8.4 5.8.3 5.8.2 5.8.1 5.8.0 5.7.9.2 5.7.9.1 5.7.8 5.7.9 5.7.6 5.7.7 5.7.5 5.7.4 5.7.3 5.7.2 5.7.1 trunk 5.6.0 5.6.1 5.6.2 All 33 releases
automatorwp / includes / logs.php

logs.php in AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI 6.0.2, at includes/logs.php

371 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Log
4 *
5 * @package AutomatorWP\Log
6 * @author AutomatorWP <contact@automatorwp.com>, Ruben Garcia <rubengcdev@gmail.com>
7 * @since 1.0.0
8 */
9 // Exit if accessed directly
10 if( !defined( 'ABSPATH' ) ) exit;
11
12 /**
13 * Get log registered types
14 *
15 * @since 1.0.0
16 *
17 * @return array
18 */
19 function automatorwp_get_log_types() {
20
21 return apply_filters( 'automatorwp_log_types', array(
22 'automation' => __( 'Automation', 'automatorwp' ),
23 'anonymous' => __( 'Anonymous', 'automatorwp' ),
24 'trigger' => __( 'Trigger', 'automatorwp' ),
25 'action' => __( 'Action', 'automatorwp' ),
26 'filter' => __( 'Filter', 'automatorwp' ),
27 ) );
28
29 }
30
31 /**
32 * Insert a new log
33 *
34 * @since 1.0.0
35 *
36 * @param array $log_data The log data to insert
37 * @param array $log_meta The log meta data to insert
38 *
39 * @return int|WP_Error The log ID on success. The value 0 or WP_Error on failure.
40 */
41 function automatorwp_insert_log( $log_data = array(), $log_meta = array() ) {
42
43 global $wpdb;
44
45 $log_data = wp_parse_args( $log_data, array(
46 'title' => '',
47 'type' => '',
48 'object_id' => 0,
49 'user_id' => 0,
50 'post_id' => 0,
51 'date' => date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ),
52 ) );
53
54 $ct_table = ct_setup_table( 'automatorwp_logs' );
55
56 // Store log entry
57 $log_id = $ct_table->db->insert( $log_data );
58
59 // If log correctly inserted, insert all meta data received
60 if( $log_id && ! empty( $log_meta ) ) {
61
62 $log_data['log_id'] = $log_id;
63
64 $metas = array();
65
66 foreach( $log_meta as $meta_key => $meta_value ) {
67 $original_meta_key = $meta_key;
68 $original_meta_value = $meta_value;
69
70 // Sanitize vars
71 $meta_key = sanitize_key( $meta_key );
72 $meta_key = wp_unslash( $meta_key );
73 $meta_value = wp_unslash( $meta_value );
74 $meta_value = esc_sql( $meta_value );
75 $meta_value = sanitize_meta( $meta_key, $meta_value, $ct_table->name );
76 $meta_value = maybe_serialize( $meta_value );
77
78 /**
79 * Filter to override the meta value
80 *
81 * @since 1.0.0
82 *
83 * @param string $meta_value The parsed meta value
84 * @param string $meta_key The parsed meta key
85 * @param string $original_meta_value The original meta value
86 * @param string $original_meta_key The original meta key
87 * @param array $log_data The log data (includes the log_id key)
88 * @param array $log_meta The original log meta data
89 *
90 * @return mixed
91 */
92 $meta_value = apply_filters( 'automatorwp_insert_log_meta_value', $meta_value, $meta_key, $original_meta_value, $original_meta_key, $log_data, $log_meta );
93
94 // Setup the insert value
95 $metas[] = $wpdb->prepare( '%d, %s, %s', array( $log_id, $meta_key, $meta_value ) );
96 }
97
98 $logs_meta = AutomatorWP()->db->logs_meta;
99 $metas = implode( '), (', $metas );
100
101 // Since the log is recently inserted, is faster to run a single query to insert all metas instead of insert them one-by-one
102 $wpdb->query( "INSERT INTO {$logs_meta} (id, meta_key, meta_value) VALUES ({$metas})" );
103
104 }
105
106 ct_reset_setup_table();
107
108 // Flush cache to prevent meta data cached values
109 wp_cache_flush();
110
111 return $log_id;
112
113 }
114
115 /**
116 * Get the log object data
117 *
118 * @since 1.0.0
119 *
120 * @param int $log_id The log ID
121 * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to
122 * a object, an associative array, or a numeric array, respectively. Default OBJECT.
123 * @return array|stdClass|null
124 */
125 function automatorwp_get_log_object( $log_id, $output = OBJECT ) {
126
127 ct_setup_table( 'automatorwp_logs' );
128
129 $log = ct_get_object( $log_id );
130
131 ct_reset_setup_table();
132
133 return $log;
134
135 }
136
137 /**
138 * Get the log object data
139 *
140 * @since 1.0.0
141 *
142 * @param int $log_id The log ID
143 * @param string $meta_key Optional. The meta key to retrieve. By default, returns
144 * data for all keys. Default empty.
145 * @param bool $single Optional. Whether to return a single value. Default false.
146 *
147 * @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true.
148 */
149 function automatorwp_get_log_meta( $log_id, $meta_key = '', $single = false ) {
150
151 ct_setup_table( 'automatorwp_logs' );
152
153 $meta_value = ct_get_object_meta( $log_id, $meta_key, $single );
154
155 ct_reset_setup_table();
156
157 return $meta_value;
158
159 }
160
161 /**
162 * Get the log integration icon HTML markup
163 *
164 * @since 1.0.0
165 *
166 * @param stdClass $log The log object
167 */
168 function automatorwp_get_log_integration_icon( $log ) {
169
170 if( in_array( $log->type, array( 'trigger', 'action' ) ) ) {
171
172 // Get the trigger or action
173 ct_setup_table( "automatorwp_{$log->type}s" );
174 $object = ct_get_object( $log->object_id );
175 ct_reset_setup_table();
176
177 if( $object->type === 'filter' ) {
178 automatorwp_get_log_filter_icon( $log, $log->type, 'passed' );
179 return;
180 }
181
182 $type_args = automatorwp_automation_item_type_args( $object, $log->type );
183
184 if( $type_args ) {
185 $integration = automatorwp_get_integration( $type_args['integration'] );
186
187 if( $integration ) :
188
189 if( $log->type === 'action' && $object->type === 'automatorwp_anonymous_user' ) {
190 $integration['icon'] = AUTOMATORWP_URL . 'assets/img/automatorwp-anonymous.svg';
191 }
192
193 $integration = apply_filters( 'automatorwp_get_log_integration_icon_integration', $integration, $object, $log->type, $log );
194
195 ?>
196
197 <div class="automatorwp-integration-icon cmb-tooltip">
198 <img src="<?php echo esc_attr( $integration['icon'] ); ?>" alt="<?php echo esc_attr( $integration['label'] ); ?>">
199 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_html( $integration['label'] ); ?></span>
200 </div>
201
202 <?php endif;
203 } else { ?>
204
205 <div class="automatorwp-integration-icon cmb-tooltip">
206 <img src="<?php echo esc_attr( AUTOMATORWP_URL . 'assets/img/integration-missing.svg' ); ?>" alt="<?php echo esc_attr( __( 'Missing plugin', 'automatorwp' ) ); ?>">
207 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_html( $log->type ); ?></span>
208 </div>
209
210 <?php }
211
212 } else if( $log->type === 'filter' ) {
213
214 $item_type = automatorwp_get_log_meta( $log->id, 'item_type', true );
215
216 automatorwp_get_log_filter_icon( $log, $item_type, 'not-passed' );
217
218 } else {
219
220 $icon = AUTOMATORWP_URL . 'integrations/automatorwp/assets/automatorwp.svg';
221
222 if( $log->type === 'anonymous' ) {
223 $icon = AUTOMATORWP_URL . 'assets/img/automatorwp-anonymous.svg';
224 }
225
226 /**
227 * Available filter to override log default icon
228 *
229 * @since 1.2.4
230 *
231 * @param string $icon The icon URL
232 * @param stdClass $log The log object
233 *
234 * @return string
235 */
236 $icon = apply_filters( 'automatorwp_get_log_default_icon', $icon, $log );
237
238 /**
239 * Available filter to override log default icon title
240 *
241 * @since 1.2.4
242 *
243 * @param string $title The icon title attribute
244 * @param stdClass $log The log object
245 *
246 * @return string
247 */
248 $title = apply_filters( 'automatorwp_get_log_default_icon_title', 'AutomatorWP', $log ); ?>
249
250 <div class="automatorwp-integration-icon cmb-tooltip">
251 <img src="<?php echo esc_attr( $icon ); ?>" alt="<?php echo esc_attr( $title ); ?>">
252 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_attr( $title ); ?></span>
253 </div>
254
255 <?php }
256
257 }
258
259 /**
260 * Get the filter log integration icon HTML markup
261 *
262 * @since 1.0.0
263 *
264 * @param stdClass $log The log object
265 * @param string $item_type The item type (trigger|action)
266 * @param string $class The icon class (passed|not-passed)
267 */
268 function automatorwp_get_log_filter_icon( $log, $item_type, $class ) {
269
270 if( in_array( $item_type, array( 'action', 'trigger' ) ) ) {
271
272 // Get the trigger or action
273 ct_setup_table( "automatorwp_{$item_type}s" );
274 $filter = ct_get_object_meta( $log->object_id, 'filter', true );
275 ct_reset_setup_table();
276
277 $filter_args = automatorwp_get_filter( $filter );
278
279 $message = __( 'Filter not passed', 'automatorwp' );
280
281 if( $class === 'passed' ) {
282 $message = __( 'Filter passed', 'automatorwp' );
283 }
284
285 if( $filter_args ) {
286 $integration = automatorwp_get_integration( $filter_args['integration'] );
287
288 if( $integration ) : ?>
289
290 <div class="automatorwp-integration-icon cmb-tooltip">
291 <img src="<?php echo esc_attr( $integration['icon'] ); ?>" title="<?php echo esc_attr( $integration['label'] ); ?>" alt="<?php echo esc_attr( $integration['label'] ); ?>">
292 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_attr( $message ); ?></span>
293 <div class="automatorwp-filter-icon automatorwp-filter-icon-<?php echo $class; ?>">
294 <img src="<?php echo esc_attr( AUTOMATORWP_URL . 'integrations/filter/assets/filter-icon.svg' ); ?>" title="<?php echo esc_attr( $message ); ?>">
295 </div>
296 </div>
297
298 <?php endif;
299 } else { ?>
300
301 <div class="automatorwp-integration-icon cmb-tooltip">
302 <img src="<?php echo esc_attr( AUTOMATORWP_URL . 'assets/img/integration-missing.svg' ); ?>" title="<?php echo esc_attr( __( 'Missing plugin', 'automatorwp' ) ); ?>">
303 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_attr( __( 'Filter not passed', 'automatorwp' ) ); ?></span>
304 <div class="automatorwp-filter-icon automatorwp-filter-icon-<?php echo $class; ?>">
305 <img src="<?php echo esc_attr( AUTOMATORWP_URL . 'integrations/filter/assets/filter-icon.svg' ); ?>" title="<?php echo esc_attr( __( 'Filter not passed', 'automatorwp' ) ); ?>">
306 </div>
307 </div>
308
309 <?php }
310
311 }
312
313 }
314
315 /**
316 * Get the last object log
317 *
318 * @since 1.0.0
319 *
320 * @param int $object_id The object ID
321 * @param string $type The object type
322 *
323 * @return stdClass|false
324 */
325 function automatorwp_get_object_last_log( $object_id, $type ) {
326
327 global $wpdb;
328
329 $object_id = absint( $object_id );
330
331 // Check the object ID
332 if( $object_id === 0 ) {
333 return false;
334 }
335
336 $types = automatorwp_get_log_types();
337
338 // Check the type
339 if( ! isset( $types[$type] ) ) {
340 return false;
341 }
342
343 $cache = automatorwp_get_cache( 'object_last_log', array(), false );
344
345 // If result already cached, return it
346 if( isset( $cache[$type] )
347 && isset( $cache[$type][$object_id] ) ) {
348 return $cache[$type][$object_id];
349 }
350
351 $ct_table = ct_setup_table( 'automatorwp_logs' );
352
353 $log = $wpdb->get_row(
354 "SELECT *
355 FROM {$ct_table->db->table_name} AS l
356 WHERE 1=1
357 AND l.object_id = {$object_id}
358 AND l.type = '{$type}'
359 ORDER BY l.date DESC
360 LIMIT 1"
361 );
362
363 ct_reset_setup_table();
364
365 $cache[$type][$object_id] = $log;
366
367 automatorwp_set_cache( 'object_last_log', $cache );
368
369 return $log;
370
371 }