These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * WooCommerce Message Functions |
||
4 | * |
||
5 | * Functions for error/message handling and display. |
||
6 | * |
||
7 | * @package WooCommerce/Functions |
||
8 | * @version 2.1.0 |
||
9 | */ |
||
10 | |||
11 | if ( ! defined( 'ABSPATH' ) ) { |
||
12 | exit; |
||
13 | } |
||
14 | |||
15 | /** |
||
16 | * Get the count of notices added, either for all notices (default) or for one. |
||
17 | * particular notice type specified by $notice_type. |
||
18 | * |
||
19 | * @since 2.1 |
||
20 | * @param string $notice_type Optional. The name of the notice type - either error, success or notice. |
||
21 | * @return int |
||
22 | */ |
||
23 | function wc_notice_count( $notice_type = '' ) { |
||
24 | 2 | if ( ! did_action( 'woocommerce_init' ) ) { |
|
25 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
26 | return; |
||
27 | } |
||
28 | |||
29 | 2 | $notice_count = 0; |
|
30 | 2 | $all_notices = WC()->session->get( 'wc_notices', array() ); |
|
31 | |||
32 | 2 | if ( isset( $all_notices[ $notice_type ] ) ) { |
|
33 | |||
34 | 2 | $notice_count = count( $all_notices[ $notice_type ] ); |
|
35 | |||
36 | 2 | } elseif ( empty( $notice_type ) ) { |
|
37 | |||
38 | 1 | foreach ( $all_notices as $notices ) { |
|
39 | 1 | $notice_count += count( $notices ); |
|
40 | } |
||
41 | } |
||
42 | |||
43 | 2 | return $notice_count; |
|
44 | } |
||
45 | |||
46 | /** |
||
47 | * Check if a notice has already been added. |
||
48 | * |
||
49 | * @since 2.1 |
||
50 | * @param string $message The text to display in the notice. |
||
51 | * @param string $notice_type Optional. The name of the notice type - either error, success or notice. |
||
52 | * @return bool |
||
53 | */ |
||
54 | function wc_has_notice( $message, $notice_type = 'success' ) { |
||
55 | 2 | View Code Duplication | if ( ! did_action( 'woocommerce_init' ) ) { |
56 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
57 | return false; |
||
58 | } |
||
59 | |||
60 | 2 | $notices = WC()->session->get( 'wc_notices', array() ); |
|
61 | 2 | $notices = isset( $notices[ $notice_type ] ) ? $notices[ $notice_type ] : array(); |
|
62 | 2 | return array_search( $message, $notices, true ) !== false; |
|
63 | } |
||
64 | |||
65 | /** |
||
66 | * Add and store a notice. |
||
67 | * |
||
68 | * @since 2.1 |
||
69 | * @param string $message The text to display in the notice. |
||
70 | * @param string $notice_type Optional. The name of the notice type - either error, success or notice. |
||
71 | */ |
||
72 | function wc_add_notice( $message, $notice_type = 'success' ) { |
||
73 | 30 | if ( ! did_action( 'woocommerce_init' ) ) { |
|
74 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
75 | return; |
||
76 | } |
||
77 | |||
78 | 30 | $notices = WC()->session->get( 'wc_notices', array() ); |
|
79 | |||
80 | // Backward compatibility. |
||
81 | 30 | if ( 'success' === $notice_type ) { |
|
82 | 28 | $message = apply_filters( 'woocommerce_add_message', $message ); |
|
83 | } |
||
84 | |||
85 | 30 | $notices[ $notice_type ][] = apply_filters( 'woocommerce_add_' . $notice_type, $message ); |
|
86 | |||
87 | 30 | WC()->session->set( 'wc_notices', $notices ); |
|
88 | } |
||
89 | |||
90 | /** |
||
91 | * Set all notices at once. |
||
92 | * |
||
93 | * @since 2.6.0 |
||
94 | * @param mixed $notices Array of notices. |
||
95 | */ |
||
96 | View Code Duplication | function wc_set_notices( $notices ) { |
|
97 | if ( ! did_action( 'woocommerce_init' ) ) { |
||
98 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.6' ); |
||
99 | return; |
||
100 | } |
||
101 | WC()->session->set( 'wc_notices', $notices ); |
||
102 | } |
||
103 | |||
104 | |||
105 | /** |
||
106 | * Unset all notices. |
||
107 | * |
||
108 | * @since 2.1 |
||
109 | */ |
||
110 | View Code Duplication | function wc_clear_notices() { |
|
0 ignored issues
–
show
|
|||
111 | 4 | if ( ! did_action( 'woocommerce_init' ) ) { |
|
112 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
113 | return; |
||
114 | } |
||
115 | 4 | WC()->session->set( 'wc_notices', null ); |
|
116 | } |
||
117 | |||
118 | /** |
||
119 | * Prints messages and errors which are stored in the session, then clears them. |
||
120 | * |
||
121 | * @since 2.1 |
||
122 | * @param bool $return true to return rather than echo. @since 3.5.0. |
||
123 | * @return string|null |
||
124 | */ |
||
125 | function wc_print_notices( $return = false ) { |
||
126 | 1 | if ( ! did_action( 'woocommerce_init' ) ) { |
|
127 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
128 | return; |
||
129 | } |
||
130 | |||
131 | 1 | $all_notices = WC()->session->get( 'wc_notices', array() ); |
|
132 | 1 | $notice_types = apply_filters( 'woocommerce_notice_types', array( 'error', 'success', 'notice' ) ); |
|
133 | |||
134 | // Buffer output. |
||
135 | 1 | ob_start(); |
|
136 | |||
137 | 1 | foreach ( $notice_types as $notice_type ) { |
|
138 | 1 | if ( wc_notice_count( $notice_type ) > 0 ) { |
|
139 | 1 | wc_get_template( "notices/{$notice_type}.php", array( |
|
140 | 1 | 'messages' => array_filter( $all_notices[ $notice_type ] ), |
|
141 | ) ); |
||
142 | } |
||
143 | } |
||
144 | |||
145 | 1 | wc_clear_notices(); |
|
146 | |||
147 | 1 | $notices = wc_kses_notice( ob_get_clean() ); |
|
148 | |||
149 | 1 | if ( $return ) { |
|
150 | return $notices; |
||
151 | } |
||
152 | |||
153 | 1 | echo $notices; // WPCS: XSS ok. |
|
154 | } |
||
155 | |||
156 | /** |
||
157 | * Print a single notice immediately. |
||
158 | * |
||
159 | * @since 2.1 |
||
160 | * @param string $message The text to display in the notice. |
||
161 | * @param string $notice_type Optional. The singular name of the notice type - either error, success or notice. |
||
162 | */ |
||
163 | function wc_print_notice( $message, $notice_type = 'success' ) { |
||
164 | 3 | if ( 'success' === $notice_type ) { |
|
165 | 1 | $message = apply_filters( 'woocommerce_add_message', $message ); |
|
166 | } |
||
167 | |||
168 | 3 | wc_get_template( "notices/{$notice_type}.php", array( |
|
169 | 3 | 'messages' => array( apply_filters( 'woocommerce_add_' . $notice_type, $message ) ), |
|
170 | ) ); |
||
171 | } |
||
172 | |||
173 | /** |
||
174 | * Returns all queued notices, optionally filtered by a notice type. |
||
175 | * |
||
176 | * @since 2.1 |
||
177 | * @param string $notice_type Optional. The singular name of the notice type - either error, success or notice. |
||
178 | * @return array|mixed |
||
179 | */ |
||
180 | function wc_get_notices( $notice_type = '' ) { |
||
181 | 2 | if ( ! did_action( 'woocommerce_init' ) ) { |
|
182 | wc_doing_it_wrong( __FUNCTION__, __( 'This function should not be called before woocommerce_init.', 'woocommerce' ), '2.3' ); |
||
183 | return; |
||
184 | } |
||
185 | |||
186 | 2 | $all_notices = WC()->session->get( 'wc_notices', array() ); |
|
187 | |||
188 | 2 | if ( empty( $notice_type ) ) { |
|
189 | 2 | $notices = $all_notices; |
|
190 | 1 | } elseif ( isset( $all_notices[ $notice_type ] ) ) { |
|
191 | 1 | $notices = $all_notices[ $notice_type ]; |
|
192 | } else { |
||
193 | 1 | $notices = array(); |
|
194 | } |
||
195 | |||
196 | 2 | return $notices; |
|
197 | } |
||
198 | |||
199 | /** |
||
200 | * Add notices for WP Errors. |
||
201 | * |
||
202 | * @param WP_Error $errors Errors. |
||
203 | */ |
||
204 | function wc_add_wp_error_notices( $errors ) { |
||
205 | if ( is_wp_error( $errors ) && $errors->get_error_messages() ) { |
||
206 | foreach ( $errors->get_error_messages() as $error ) { |
||
207 | wc_add_notice( $error, 'error' ); |
||
208 | } |
||
209 | } |
||
210 | } |
||
211 | |||
212 | /** |
||
213 | * Filters out the same tags as wp_kses_post, but allows tabindex for <a> element. |
||
214 | * |
||
215 | * @since 3.5.0 |
||
216 | * @param string $message Content to filter through kses. |
||
217 | * @return string |
||
218 | */ |
||
219 | function wc_kses_notice( $message ) { |
||
220 | 4 | return wp_kses( $message, |
|
221 | 4 | array_replace_recursive( // phpcs:ignore PHPCompatibility.PHP.NewFunctions.array_replace_recursiveFound |
|
222 | 4 | wp_kses_allowed_html( 'post' ), |
|
223 | array( |
||
224 | 'a' => array( |
||
225 | 4 | 'tabindex' => true, |
|
226 | ), |
||
227 | ) |
||
228 | ) |
||
229 | ); |
||
230 | } |
||
231 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.