* @copyright (c) 05.07.2020, Webcraftic * @version 1.0 */ /** * Access to global variable $wp_filter in WP core. * Migration from WP 4.2 to 4.9 * * @see https://codex.wordpress.org/Version_4.7 WP 4.7 changelog (WP_Hook) * * @param $key string filter name * * @return array callbacks array by link */ function &wdan_get_wp_filter( $key ) { global $wp_filter; $default = []; if ( 'admin_notices' === $key && is_multisite() && is_network_admin() ) { $key = 'network_admin_notices'; } if ( ! isset( $wp_filter[ $key ] ) ) { return $default; } return $wp_filter[ $key ]->callbacks; } /** * @param $key * * @return array */ function wdan_collect_notices( $key ) { $wp_filter = &wdan_get_wp_filter( $key ); $content = []; if ( ! empty( $wp_filter ) ) { foreach ( (array) $wp_filter as $filters ) { foreach ( $filters as $callback_name => $callback ) { if ( 'usof_hide_admin_notices_start' == $callback_name || 'usof_hide_admin_notices_end' == $callback_name ) { continue; } ob_start(); // #CLRF-140 fix bug for php7 // when the developers forgot to delete the argument in the function of implementing the notification. $args = []; $accepted_args = isset( $callback['accepted_args'] ) && ! empty( $callback['accepted_args'] ) ? $callback['accepted_args'] : 0; if ( $accepted_args > 0 ) { for ( $i = 0; $i < (int) $accepted_args; $i ++ ) { $args[] = null; } } //=========== call_user_func_array( $callback['function'], $args ); $cont = ob_get_clean(); if ( ! empty( $cont ) ) { $salt = is_multisite() ? get_current_blog_id() : ''; $uniq_id1 = md5( $cont . $salt ); $uniq_id2 = md5( $callback_name . $salt ); if ( is_array( $callback['function'] ) && sizeof( $callback['function'] ) == 2 ) { $class = $callback['function'][0]; if ( is_object( $class ) ) { $class_name = get_class( $class ); $method_name = $callback['function'][1]; $uniq_id2 = md5( $class_name . ':' . $method_name ); } } $content[ $uniq_id1 . "_" . $uniq_id2 ] = $cont; } } } } return $content; } /** * @param $key * @param array $excluded_classes * @param array $excluded_callback_names */ function wdan_clear_all_notices( $key, $excluded_classes = [], $excluded_callback_names = [] ) { $wp_filter = &wdan_get_wp_filter( $key ); if ( ! empty( $wp_filter ) ) { foreach ( (array) $wp_filter as $f_key => $f ) { foreach ( $f as $c_name => $clback ) { if ( is_array( $clback['function'] ) && sizeof( $clback['function'] ) == 2 ) { $class = $clback['function'][0]; if ( is_object( $class ) ) { $class_name = get_class( $class ); if ( in_array( $class_name, $excluded_classes ) ) { continue; } } } if ( in_array( $c_name, $excluded_callback_names ) ) { continue; } unset( $wp_filter[ $f_key ][ $c_name ] ); } } } }