option_id ); if ( ! $notices ) { return false; } $this->notices = array_merge( $notices, $this->notices ); delete_option( $this->option_id ); return true; } /** * Add new notice to show in admin page. * * @since 3.2.6 * * @param string|WP_Error $message * @param string $type * @param bool $dismissible * @param string $id * @param bool $redirect * @param bool $override * * @return boolean */ public function add( $message, $type = 'success', $dismissible = true, $id = '', $redirect = false, $override = false ) { if ( ! $id ) { $id = uniqid(); } if ( empty( $this->notices[ $id ] ) || $override ) { $this->notices[ $id ] = array( 'message' => $message, 'type' => $type ? $type : 'success', 'redirect' => $redirect, 'dismissible' => $dismissible, ); return true; } return false; } /** * @param string|WP_Error $message * @param string $type * @param bool $dismissible * @param string $id * @param bool $override * * @return bool */ public function add_redirect( $message, $type = 'success', $dismissible = false, $id = '', $override = false ) { return $this->add( $message, $type, $dismissible, $id, true, $override ); } /** * Show all notices. * * @return bool */ public function show_notices() { if ( empty( $this->notices ) ) { return false; } $redirect_notices = array(); foreach ( $this->notices as $id => $notice ) { $notice['message'] = $notice['message'] instanceof WP_Error ? $notice['message']->get_error_message() : $notice['message']; if ( $notice['redirect'] ) { $notice['redirect'] = false; $redirect_notices[ $id ] = $notice; } else { if ( ! $this->has_dismissed_notice( $id ) ) { if ( preg_match( '/.php$/', $notice['message'] ) ) { $view = $notice['message']; } else { $view = 'admin-notice.php'; } learn_press_admin_view( $view, array_merge( $notice, array( 'id' => $id ) ) ); } } } if ( $redirect_notices ) { update_option( $this->option_id, $redirect_notices ); } return true; } /** * Check if a notice is already added by id. * * @since 3.2.6 * * @param string[] $notice * * @return bool */ public function has_notice( $notice ) { settype( $notice, 'array' ); if ( ! $this->notices ) { return false; } foreach ( $notice as $id ) { if ( ! empty( $this->notices[ $id ] ) ) { return true; } } return false; } /** * Remove one or more notices from queue by ids. * * @since 3.2.6 * * @param string|array $notice * * @return array|bool */ public function remove( $notice ) { settype( $notice, 'array' ); if ( ! $this->notices ) { return false; } foreach ( $notice as $id ) { if ( ! empty( $this->notices[ $id ] ) ) { unset( $this->notices[ $id ] ); } } // Also remove in db $redirects = get_option( $this->option_id ); if ( $redirects ) { foreach ( $notice as $id ) { if ( ! empty( $redirects[ $id ] ) ) { unset( $redirects[ $id ] ); } } update_option( $this->option_id, $redirects ); } return $this->notices; } /** * Clear all notices. * * @since 3.2.6 */ public function clear() { $this->notices = array(); delete_option( $this->option_id ); } /** * @since 3.2.6 */ /*public function dismiss_notice() { $id = LP_Request::get( 'lp-dismiss-notice' ); if ( ! $id ) { return; } $dismissed = get_option( $this->dismissed_option_id ); if ( ! $dismissed ) { $dismissed = array(); } do_action( 'learn-press/before-dismiss-notice', $id ); if ( array_search( $id, $dismissed ) === false ) { $dismissed[] = $id; update_option( $this->dismissed_option_id, $dismissed ); } do_action( 'learn-press/dismissed-notice', $id ); learn_press_send_json( apply_filters( 'learn-press/dismissed-notice-response', array( 'dismissed' => $id, ), $id ) ); }*/ /** * Update option to turn-off a notice. * * @since 3.2.6 * * @param string $name * @param string $value * @param int $expired */ public function dismiss_notice_2( $name, $value, $expired = 0 ) { if ( $expired ) { set_transient( 'lp_dismiss_notice' . $name, $value, $expired ); } else { $values = get_option( 'lp_dismiss_notice' ); if ( ! $values ) { $values = array( $name => $value ); } else { $values[ $name ] = $value; } update_option( 'lp_dismiss_notice', $values ); } } /** * Check if a notice has dismissed. * * @since 3.2.6 * * @param string $name * * @return bool */ public function has_dismissed_notice( $name ) { $dismissed = get_option( $this->dismissed_option_id ); if ( ! $dismissed ) { return false; } return array_search( $name, $dismissed ) !== false; } /** * Restore dismissed notices by id. * * @since 3.2.6 * * @param string[] $notice * * @return bool */ public function restore_dismissed_notice( $notice ) { $dismissed = get_option( $this->dismissed_option_id ); if ( ! $dismissed ) { return false; } settype( $notice, 'array' ); foreach ( $notice as $id ) { $at = array_search( $id, $dismissed ); if ( false !== $at ) { unset( $dismissed[ $at ] ); } } update_option( $this->dismissed_option_id, $dismissed ); return true; } /** * Clear all notices has dismissed. * * @since 3.2.6 */ public function clear_dismissed_notice() { delete_option( $this->dismissed_option_id ); } /** * Remove a notice has been dismissed. * * @since 3.2.6 * * @param string|array $name - Optional. NULL will remove all notices. * @param bool $expired - Optional. TRUE if dismiss notice as transient (in case $name passed). * * @return bool */ public function remove_dismissed_notice( $name = '' ) { if ( ! $name ) { global $wpdb; $query = $wpdb->prepare( "SELECT SUBSTR(option_name, 12) FROM {$wpdb->options} WHERE option_name LIKE %s", '%' . $wpdb->esc_like( '_transient_lp_dismiss_notice' ) . '%' ); $all_notices = $wpdb->get_col( $query ); if ( $all_notices ) { foreach ( $all_notices as $notice ) { delete_transient( $notice ); } } delete_option( 'lp_dismiss_notice' ); return true; } elseif ( is_array( $name ) ) { foreach ( $name as $notice ) { $this->remove_dismissed_notice( $notice ); } return true; } delete_transient( 'lp_dismiss_notice' . $name ); $values = get_option( 'lp_dismiss_notice' ); if ( ! $values ) { return false; } else { if ( array_key_exists( $name, $values ) ) { unset( $values[ $name ] ); update_option( 'lp_dismiss_notice', $values ); return $values; } } return false; } /** * @deprecated */ public function dismiss_notice_deprecated() { $notice = learn_press_get_request( 'lp-hide-notice' ); if ( ! $notice ) { return; } $transient = learn_press_get_request( 't' ); if ( $transient ) { set_transient( 'lp-hide-notice-' . $notice, 'yes', $transient ); } else { learn_press_update_user_option( 'hide-notice-' . $notice, 'yes' ); } $redirect = apply_filters( 'learn_press_hide_notice_redirect', esc_url_raw( remove_query_arg( 'lp-hide-notice' ) ) ); if ( $redirect ) { wp_redirect( untrailingslashit( $redirect ) ); exit(); } } /** * Add new notice to queue * * @deprecated * * @param string $message The message want to display * @param string $type The class name of WP message type updated|update-nag|error * @param string $id Custom id for html element's ID * @param bool */ public static function add_deprecated( $message, $type = 'success', $id = '', $redirect = false ) { if ( $redirect ) { $notices = get_transient( 'learn_press_redirect_notices' ); if ( empty( $notices ) ) { $notices = array(); } $notices[] = array( 'type' => $type, 'message' => $message, 'id' => $id, ); set_transient( 'learn_press_redirect_notices', $notices ); } else { self::$_notices[] = array( 'type' => $type, 'message' => $message, 'id' => $id, ); } } public static function add_redirect_reprecated( $message, $type = 'updated', $id = '' ) { self::add( $message, $type, $id, true ); } /** * Show all notices has registered * * @deprecated */ public static function show_notices_deprecated() { if ( self::$_notices ) { foreach ( self::$_notices as $notice ) { if ( empty( $notice ) ) { continue; } learn_press_admin_view( 'admin-notice.php', $notice ); } } $notices = get_transient( 'learn_press_redirect_notices' ); if ( $notices ) { foreach ( $notices as $notice ) { if ( empty( $notice ) ) { continue; } learn_press_admin_view( 'admin-notice.php', $notice ); } delete_transient( 'learn_press_redirect_notices' ); } } /** * Get single instance of this class * * @since 3.2.6 * * @return LP_Admin_Notice */ public static function instance() { if ( ! self::$instance ) { self::$instance = new self(); } return self::$instance; } } LP_Admin_Notice::instance();