self::getAllActiveNotifications(), 'new' => self::getNewNotifications( $reset ), 'dismissed' => self::getAllDismissedNotifications() ]; } /** * Get an array of active notifications. * * @since 4.0.0 * * @return array An array of active notifications. */ public static function getAllActiveNotifications() { $staticNotifications = self::getStaticNotifications(); $notifications = array_values( json_decode( wp_json_encode( self::getActiveNotifications() ), true ) ); return ! empty( $staticNotifications ) ? array_merge( $staticNotifications, $notifications ) : $notifications; } /** * Get all new notifications. After retrieving them, this will reset them. * This means that calling this method twice will result in no results * the second time. The only exception is to pass false as a reset variable to prevent it. * * @since 4.1.3 * * @param boolean $reset Whether or not to reset the new notifications. * @return array An array of new notifications if any exist. */ public static function getNewNotifications( $reset = true ) { $notifications = self::filterNotifications( aioseo()->db ->start( 'aioseo_notifications' ) ->where( 'dismissed', 0 ) ->where( 'new', 1 ) ->whereRaw( "(start <= '" . gmdate( 'Y-m-d H:i:s' ) . "' OR start IS NULL)" ) ->whereRaw( "(end >= '" . gmdate( 'Y-m-d H:i:s' ) . "' OR end IS NULL)" ) ->orderBy( 'start DESC, created DESC' ) ->run() ->models( 'AIOSEO\\Plugin\\Common\\Models\\Notification' ) ); if ( $reset ) { self::resetNewNotifications(); } return $notifications; } /** * Resets all new notifications. * * @since 4.1.3 * * @return void */ public static function resetNewNotifications() { aioseo()->db ->update( 'aioseo_notifications' ) ->where( 'new', 1 ) ->set( 'new', 0 ) ->run(); } /** * Returns all static notifications. * * @since 4.1.2 * * @return array An array of static notifications. */ public static function getStaticNotifications() { $staticNotifications = []; $notifications = [ 'unlicensed-addons', 'review' ]; foreach ( $notifications as $notification ) { switch ( $notification ) { case 'review': // If they intentionally dismissed the main notification, we don't show the repeat one. $originalDismissed = get_user_meta( get_current_user_id(), '_aioseo_plugin_review_dismissed', true ); if ( '2' !== $originalDismissed ) { break; } $dismissed = get_user_meta( get_current_user_id(), '_aioseo_notification_plugin_review_dismissed', true ); if ( '1' === $dismissed ) { break; } if ( ! empty( $dismissed ) && $dismissed > time() ) { break; } $activated = aioseo()->internalOptions->internal->firstActivated( time() ); if ( $activated > strtotime( '-30 days' ) ) { break; } $staticNotifications[] = [ 'slug' => 'notification-' . $notification, 'component' => 'notifications-' . $notification ]; break; case 'unlicensed-addons': $unlicensedAddons = aioseo()->addons->unlicensedAddons(); if ( empty( $unlicensedAddons['addons'] ) ) { break; } $staticNotifications[] = [ 'slug' => 'notification-' . $notification, 'component' => 'notifications-' . $notification, 'addons' => $unlicensedAddons['addons'], 'message' => $unlicensedAddons['message'] ]; break; } } return $staticNotifications; } /** * Retrieve active notifications. * * @since 4.0.0 * * @return array An array of active notifications or empty. */ public static function getActiveNotifications() { return self::filterNotifications( aioseo()->db ->start( 'aioseo_notifications' ) ->where( 'dismissed', 0 ) ->whereRaw( "(start <= '" . gmdate( 'Y-m-d H:i:s' ) . "' OR start IS NULL)" ) ->whereRaw( "(end >= '" . gmdate( 'Y-m-d H:i:s' ) . "' OR end IS NULL)" ) ->orderBy( 'start DESC, created DESC' ) ->run() ->models( 'AIOSEO\\Plugin\\Common\\Models\\Notification' ) ); } /** * Get an array of dismissed notifications. * * @since 4.0.0 * * @return array An array of dismissed notifications. */ public static function getAllDismissedNotifications() { return array_values( json_decode( wp_json_encode( self::getDismissedNotifications() ), true ) ); } /** * Retrieve dismissed notifications. * * @since 4.0.0 * * @return array An array of dismissed notifications or empty. */ public static function getDismissedNotifications() { return self::filterNotifications( aioseo()->db ->start( 'aioseo_notifications' ) ->where( 'dismissed', 1 ) ->orderBy( 'updated DESC' ) ->run() ->models( 'AIOSEO\\Plugin\\Common\\Models\\Notification' ) ); } /** * Returns a notification by its name. * * @since 4.0.0 * * @param string $name The notification name. * @return Notification The notification. */ public static function getNotificationByName( $name ) { return aioseo()->db ->start( 'aioseo_notifications' ) ->where( 'notification_name', $name ) ->run() ->model( 'AIOSEO\\Plugin\\Common\\Models\\Notification' ); } /** * Stores a new notification in the DB. * * @since 4.0.0 * * @param array $fields The fields. * @return Notification $notification The notification. */ public static function addNotification( $fields ) { // Set the dismissed status to false. $fields['dismissed'] = 0; $notification = new self; $notification->set( $fields ); $notification->save(); return $notification; } /** * Deletes a notification by its name. * * @since 4.0.0 * * @param string $name The notification name. * @return void */ public static function deleteNotificationByName( $name ) { aioseo()->db ->delete( 'aioseo_notifications' ) ->where( 'notification_name', $name ) ->run(); } /** * Filters the notifications based on the targeted plan levels. * * @since 4.0.0 * * @param array $notifications The notifications * @return array $remainingNotifications The remaining notifications. */ public static function filterNotifications( $notifications ) { $remainingNotifications = []; foreach ( $notifications as $notification ) { $levels = $notification->level; if ( ! is_array( $levels ) ) { $levels = empty( $notification->level ) ? [ 'all' ] : [ $notification->level ]; } foreach ( $levels as $level ) { if ( ! aioseo()->notices->validateType( $level ) ) { continue 2; } } $remainingNotifications[] = $notification; } return $remainingNotifications; } }