PluginProbe ʕ •ᴥ•ʔ
WP 2FA – Two-factor authentication for WordPress / 2.9.0
WP 2FA – Two-factor authentication for WordPress v2.9.0
4.0.0 1.7.1 2.0.0 2.0.1 2.1.0 2.2.0 2.2.1 2.3.0 2.4.0 2.4.1 2.4.2 2.5.0 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.8.0 2.9.0 2.9.1 2.9.2 2.9.3 3.0.0 3.0.1 3.1.0 3.1.1 3.1.1.2 trunk 1.2.0 1.3.0 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.6.0 1.6.1 1.6.2 1.7.0
wp-2fa / includes / classes / Admin / Helpers / class-classes-helper.php
wp-2fa / includes / classes / Admin / Helpers Last commit date
class-ajax-helper.php 11 months ago class-classes-helper.php 11 months ago class-file-writer.php 11 months ago class-methods-helper.php 11 months ago class-php-helper.php 11 months ago class-user-helper.php 11 months ago class-wp-helper.php 11 months ago index.php 11 months ago
class-classes-helper.php
201 lines
1 <?php
2 /**
3 * Responsible for the User's operations.
4 *
5 * @package wp2fa
6 * @subpackage helpers
7 *
8 * @since 2.4.0
9 *
10 * @copyright 2025 Melapress
11 * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
12 *
13 * @see https://wordpress.org/plugins/wp-2fa/
14 */
15
16 declare(strict_types=1);
17
18 namespace WP2FA\Admin\Helpers;
19
20 // Exit if accessed directly.
21 if ( ! defined( 'ABSPATH' ) ) {
22 exit;
23 }
24
25 if ( ! class_exists( '\WP2FA\Admin\Helpers\Classes_Helper' ) ) {
26 /**
27 * Responsible for the proper class loading.
28 */
29 class Classes_Helper {
30 /**
31 * Holds the classmap array for more info check @see autoload_classmap.php from the auto generated Composer file.
32 *
33 * @var array
34 *
35 * @since 2.4.0
36 */
37 private static $class_map = array();
38
39 /**
40 * Caches and returns the classmap structure of the plugin.
41 *
42 * @since 2.4.0
43 */
44 public static function get_class_map(): array {
45 if ( empty( self::$class_map ) ) {
46 self::$class_map = require WP_2FA_PATH . 'vendor/composer/autoload_classmap.php';
47 }
48
49 return self::$class_map;
50 }
51
52 /**
53 * Returns the class by its filename. Checks if it exists and returns it as string. Returns false otherwise.
54 *
55 * @param string $file - The filename of the class to check.
56 *
57 * @return string|false
58 *
59 * @since 2.4.0
60 */
61 public static function get_class_by_filename( string $file ) {
62 $file = \sanitize_text_field( $file );
63
64 if ( in_array( $file, self::get_class_map(), true ) ) {
65 $class = array_search( $file, self::get_class_map(), true );
66
67 if ( class_exists( $class ) ) {
68 return $class;
69 }
70 }
71
72 return false;
73 }
74
75 /**
76 * Extracts subclasses of the given class, optionally abstract classes could be included as well.
77 *
78 * @param string $current_class - The calling class.
79 * @param string $base_class - The class which subclasses should be extracted.
80 * @param bool $exclude_abstracts - Should we exclude abstract classes.
81 *
82 * @since 2.4.0
83 */
84 public static function get_subclasses_of_class( string $current_class, string $base_class, bool $exclude_abstracts = true ): array {
85 $current_class = \sanitize_text_field( $current_class );
86 $base_class = \sanitize_text_field( $base_class );
87
88 $matching_classes = array();
89 foreach ( array_keys( self::get_class_map() ) as $class_name ) {
90 if ( $current_class !== $class_name && is_subclass_of( $class_name, $base_class ) ) {
91 if ( $exclude_abstracts && ( false !== strpos( $class_name, 'Abstract' ) ) ) {
92 continue;
93 }
94 $matching_classes[ $class_name ] = $class_name;
95 }
96 }
97
98 return $matching_classes;
99 }
100
101 /**
102 * Returns all the classes which are part of the given namespace.
103 *
104 * @param string $extract_namespace - The extract_namespace to search for.
105 *
106 * @return array
107 *
108 * @since 2.4.0
109 */
110 public static function get_classes_by_namespace( string $extract_namespace ) {
111 $extract_namespace = \sanitize_text_field( $extract_namespace );
112
113 if ( 0 === strpos( $extract_namespace, '\\' ) ) {
114 $extract_namespace = ltrim( $extract_namespace, '\\' );
115 }
116
117 $extract_namespace = rtrim( $extract_namespace, '\\' );
118
119 $term_upper = strtoupper( $extract_namespace );
120
121 return array_filter(
122 array_keys( self::get_class_map() ),
123 function ( $found_class ) use ( $term_upper ) {
124 $class_name = strtoupper( $found_class );
125
126 /**
127 * Find class name, by finding the last occurrence of the \
128 * if it is false (from the strrchr) then class does not belong to any namespace currently.
129 */
130 $esc_position = strrchr( $class_name, '\\' );
131
132 if ( false !== $esc_position ) {
133 $class_name_no_ns = substr( $esc_position, 1 );
134 } else {
135 return false;
136 }
137
138 if ( $class_name_no_ns &&
139 $term_upper . '\\' . $class_name_no_ns === $class_name &&
140 false === strpos( $class_name, strtoupper( 'Abstract' ) ) &&
141 false === strpos( $class_name, strtoupper( 'Interface' ) )
142 ) {
143 return $found_class;
144 }
145
146 return false;
147 }
148 );
149 }
150
151 /**
152 * Search for classes by given term.
153 *
154 * @param string $term - The term to search for.
155 *
156 * @return array
157 *
158 * @since 2.4.0
159 */
160 public static function get_classes_with_term( $term ) {
161 $term = \sanitize_text_field( $term );
162 $term_upper = strtoupper( $term );
163
164 return array_filter(
165 self::get_class_map(),
166 function ( $found_class ) use ( $term_upper ) {
167 $class_name = strtoupper( $found_class );
168 if (
169 false !== strpos( $class_name, $term_upper ) &&
170 false === strpos( $class_name, strtoupper( 'Abstract' ) ) &&
171 false === strpos( $class_name, strtoupper( 'Interface' ) )
172 ) {
173 return $found_class;
174 }
175
176 return false;
177 }
178 );
179 }
180
181 /**
182 * Adds a class (or classes) to the class map.
183 *
184 * @param array $class_add - Array with class or classes to add.
185 *
186 * @return void
187 *
188 * @since 2.7.0
189 */
190 public static function add_to_class_map( array $class_add ) {
191 $class_add = array_map( 'sanitize_text_field', $class_add );
192
193 if ( empty( self::$class_map ) ) {
194 self::$class_map = require WP_2FA_PATH . 'vendor/composer/autoload_classmap.php';
195 }
196
197 self::$class_map = \array_merge( self::$class_map, $class_add );
198 }
199 }
200 }
201