'td_nm_notification', 'post_status' => 'publish', ); if ( empty( $model['ID'] ) ) { $id = wp_insert_post( array_merge( $defaults, $model ) ); } else { $id = wp_update_post( $model ); } if ( empty( $id ) || is_wp_error( $id ) ) { return false; } //save trigger or delete the notification $trigger_saved = td_nm_save_trigger( $model['trigger'], $id ); if ( empty( $trigger_saved ) ) { td_nm_delete_notification( $id ); return false; } //save the actions or delete the notification $actions_saved = td_nm_save_actions( $model['actions'], $id ); if ( empty( $actions_saved ) ) { td_nm_delete_notification( $id ); return false; } return $id; } /** * Assign some post_meta for the a notification|post * * @param array $trigger * @param int $notification_id * * @return int|false */ function td_nm_save_trigger( $trigger, $notification_id ) { if ( empty( $trigger['type'] ) || empty( $trigger['settings'] ) || get_post_status( $notification_id ) === false ) { return false; } $old_type = get_post_meta( $notification_id, 'td_nm_trigger_type', true ); $old_settings = get_post_meta( $notification_id, 'td_nm_trigger_settings', true ); if ( $trigger['type'] === $old_type && $old_settings === $trigger['settings'] ) { return $notification_id; } update_post_meta( $notification_id, 'td_nm_trigger_type', $trigger['type'] ); update_post_meta( $notification_id, 'td_nm_trigger_settings', $trigger['settings'] ); return $notification_id; } /** * Read Notifications from DB based on filters * * @param array $filters * * @return array */ function td_nm_get_notifications( $filters = array() ) { $defaults = array( 'posts_per_page' => - 1, 'post_type' => 'td_nm_notification', 'orderby' => 'date', 'order' => 'ASC', ); if ( ! function_exists( 'is_plugin_active' ) ) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } $filters = array_merge( $defaults, $filters ); $posts = get_posts( $filters ); $notifications = array(); foreach ( $posts as $post ) { $trigger = td_nm_get_trigger( $post->ID ); $trigger_instance = TD_NM_Trigger_Factory::get_instance( $trigger ); if ( $applicable = $trigger_instance->is_notification_applicable() ) { $post->trigger = $trigger; $post->actions = td_nm_get_actions( $post->ID ); $notifications[] = $post; } } return $notifications; } /** * Get trigger for a notification|post * * @param int $notification_id * * @return array */ function td_nm_get_trigger( $notification_id ) { $item = array( 'type' => null, 'settings' => array(), ); $item['type'] = get_post_meta( $notification_id, 'td_nm_trigger_type', true ); $item['settings'] = get_post_meta( $notification_id, 'td_nm_trigger_settings', true ); $item['ID'] = $notification_id; return $item; } /** * Get actions for a notification|post * * @param int $notification_id * * @return array */ function td_nm_get_actions( $notification_id ) { $items = get_post_meta( $notification_id, 'td_nm_actions', true ); foreach ( $items as $key => &$item ) { $item['ID'] = $key; } return $items; } /** * @param $actions * @param $notification_id * * @return bool|int */ function td_nm_save_actions( $actions, $notification_id ) { foreach ( $actions as &$action ) { $action['notification_id'] = $notification_id; } return update_post_meta( $notification_id, 'td_nm_actions', $actions ); } /** * Delete notification|post with all its data|meta * * @param $notification_id * * @return bool */ function td_nm_delete_notification( $notification_id ) { $post_deleted = wp_delete_post( $notification_id, true ); return empty( $post_deleted ) || is_wp_error( $post_deleted ) ? false : true; }