Completed
Push — master ( 15aa29...17da96 )
by Claudio
18:39 queued 11s
created

includes/wc-notice-functions.php (1 issue)

Upgrade to new PHP Analysis Engine

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
This function seems to be duplicated in your project.

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.

Loading history...
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