Completed
Push — issues/611 ( 661115...758b1c )
by Ravinder
21:11
created

includes/emails/template.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
 * Email Template
4
 *
5
 * @package     Give
6
 * @subpackage  Emails
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       1.0
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
/**
18
 * Gets all the email templates that have been registered. The list is extendable
19
 * and more templates can be added.
20
 *
21
 * This is simply a wrapper to Give_Email_Templates->get_templates()
22
 *
23
 * @since 1.0
24
 * @return array $templates All the registered email templates.
25
 */
26
function give_get_email_templates() {
27
	$templates = new Give_Emails;
28
29
	return $templates->get_templates();
30
}
31
32
/**
33
 * Email Template Tags.
34
 * @todo Modify this function to remove payment id dependency.
35
 *
36
 * @since 1.0
37
 *
38
 * @param string $message Message with the template tags.
39
 * @param array  $payment_data Payment Data.
40
 * @param int    $payment_id Payment ID.
41
 * @param bool   $admin_notice Whether or not this is a notification email.
42
 *
43
 * @return string $message Fully formatted message
44
 */
45
function give_email_template_tags( $message, $payment_data, $payment_id, $admin_notice = false ) {
46
	return give_do_email_tags( $message, $payment_id );
47
}
48
49
/**
50
 * Email Preview Template Tags.
51
 *
52
 * Provides sample content for the preview email functionality within settings > email.
53
 *
54
 * @since 1.0
55
 *
56
 * @param string $message Email message with template tags
57
 *
58
 * @return string $message Fully formatted message
59
 */
60
function give_email_preview_template_tags( $message ) {
61
62
	$price = give_currency_filter( give_format_amount( 10.50 ) );
63
64
	$gateway = 'PayPal';
65
66
	$receipt_id = strtolower( md5( uniqid() ) );
67
68
	$payment_id = rand( 1, 100 );
69
70
	$receipt_link_url = esc_url( add_query_arg( array( 'payment_key' => $receipt_id, 'give_action' => 'view_receipt' ), home_url() ) );
71
	$receipt_link = sprintf(
72
		'<a href="%1$s">%2$s</a>',
73
		$receipt_link_url,
74
		esc_html__( 'View the receipt in your browser &raquo;', 'give' )
75
	);
76
77
	$user = wp_get_current_user();
78
79
	$message = str_replace( '{name}', $user->display_name, $message );
80
	$message = str_replace( '{fullname}', $user->display_name, $message );
81
	$message = str_replace( '{username}', $user->user_login, $message );
82
	$message = str_replace( '{date}', date( give_date_format(), current_time( 'timestamp' ) ), $message );
83
	$message = str_replace( '{amount}', $price, $message );
84
	$message = str_replace( '{price}', $price, $message );
85
	$message = str_replace( '{donation}', esc_html__( 'Sample Donation Form Title', 'give' ), $message );
86
	$message = str_replace( '{form_title}', esc_html__( 'Sample Donation Form Title - Sample Donation Level', 'give' ), $message );
87
	$message = str_replace( '{receipt_id}', $receipt_id, $message );
88
	$message = str_replace( '{payment_method}', $gateway, $message );
89
	$message = str_replace( '{sitename}', get_bloginfo( 'name' ), $message );
90
	$message = str_replace( '{payment_id}', $payment_id, $message );
91
	$message = str_replace( '{receipt_link}', $receipt_link, $message );
92
	$message = str_replace( '{receipt_link_url}', $receipt_link_url, $message );
93
	$message = str_replace( '{pdf_receipt}', '<a href="#">Download Receipt</a>', $message );
94
95
	return wpautop( apply_filters( 'give_email_preview_template_tags', $message ) );
96
}
97
98
99
/**
100
 * Output Email Template Preview Buttons.
101
 *
102
 * @access private
103
 * @since  1.0
104
 * @since  1.8 Field arguments param added.
105
 *
106
 * @param array $field Field arguments.
107
 *
108
 * @return array
109
 */
110
function give_email_preview_buttons_callback( $field ) {
111
	$field_id = str_replace( '_preview_buttons', '', $field['id'] );
112
113
	ob_start();
114
115
	echo sprintf(
116
		'<a href="%1$s" class="button-secondary" target="_blank">%2$s</a>',
117
		wp_nonce_url(
118
			add_query_arg(
119
				array( 'give_action' => 'preview_email', 'email_type' => $field_id ),
120
				home_url()
121
			), 'give-preview-email'
122
		),
123
		$field['name']
124
	);
125
126
	echo sprintf(
127
		' <a href="%1$s" aria-label="%2$s" class="button-secondary">%3$s</a>',
128
		wp_nonce_url(
129
				add_query_arg( array(
130
			'give_action'  => 'send_preview_email',
131
			'email_type' => $field_id,
132
			'give-message' => 'sent-test-email',
133
		) ), 'give-send-preview-email' ),
134
		esc_attr__( 'Send Test Email.', 'give' ),
135
		esc_html__( 'Send Test Email', 'give' )
136
	);
137
138
	echo ob_get_clean();
139
}
140
141
142
/**
143
 * Render Receipt in the Browser.
144
 *
145
 * A link is added to the Donation Receipt to view the email in the browser and
146
 * this function renders the Donation Receipt in the browser. It overrides the
147
 * Donation Receipt template and provides its only styling.
148
 *
149
 * @since  1.0
150
 */
151
function give_render_receipt_in_browser() {
152
	if ( ! isset( $_GET['payment_key'] ) ) {
153
		wp_die( esc_html__( 'Missing donation payment key.', 'give' ), esc_html__( 'Error', 'give' ), array( 'response' => 400 ) );
154
	}
155
156
	$key = urlencode( $_GET['payment_key'] );
157
158
	ob_start();
159
	//Disallows caching of the page
160
	header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
161
	header( "Cache-Control: no-store, no-cache, must-revalidate" ); // HTTP/1.1
162
	header( "Cache-Control: post-check=0, pre-check=0", false );
163
	header( "Pragma: no-cache" ); // HTTP/1.0
164
	header( "Expires: Sat, 23 Oct 1977 05:00:00 PST" ); // Date in the past
165
	?>
166
	<!DOCTYPE html>
167
	<html lang="en">
168
	<head>
169
		<?php
170
		/**
171
		 * Fires in the receipt HEAD.
172
		 *
173
		 * @since 1.0
174
		 */
175
		do_action( 'give_receipt_head' );
176
		?>
177
	</head>
178
	<body class="<?php echo apply_filters( 'give_receipt_page_body_class', 'give_receipt_page' ); ?>">
179
180
	<div id="give_receipt_wrapper">
181
		<?php
182
		/**
183
		 * Fires in the receipt template before the content.
184
		 *
185
		 * @since 1.0
186
		 */
187
		do_action( 'give_render_receipt_in_browser_before' );
188
189
		echo do_shortcode( '[give_receipt payment_key=' . $key . ']' );
190
191
		/**
192
		 * Fires in the receipt template after the content.
193
		 *
194
		 * @since 1.0
195
		 */
196
		do_action( 'give_render_receipt_in_browser_after' );
197
		?>
198
	</div>
199
200
	<?php
201
	/**
202
	 * Fires in the receipt footer.
203
	 *
204
	 * @since 1.0
205
	 */
206
	do_action( 'give_receipt_footer' );
207
	?>
208
	</body>
209
	</html>
210
	<?php
211
	echo ob_get_clean();
212
	die();
213
}
214
215
add_action( 'give_view_receipt', 'give_render_receipt_in_browser' );
216
217
218
/**
219
 * Give Preview Email Header.
220
 *
221
 * Displays a header bar with the ability to change donations to preview actual data within the preview. Will not display if
222
 *
223
 * @since 1.6
224
 *
225
 */
226
function give_get_preview_email_header() {
227
228
	//Payment receipt switcher
229
	$payment_count = give_count_payments()->publish;
230
	$payment_id    = give_check_variable( give_clean( $_GET ), 'isset', 0, 'preview_id' );
231
232
	if ( $payment_count <= 0 ) {
233
		return false;
234
	}
235
236
	//Get payments.
237
	$payments = new Give_Payments_Query( array(
238
		'number' => 100
239
	) );
240
	$payments = $payments->get_payments();
241
	$options  = array();
242
243
	// Default option.
244
	$options[0] = esc_html__( 'No donations found.', 'give' );
245
246
	//Provide nice human readable options.
247
	if ( $payments ) {
248
		$options[0] = esc_html__( '- Select a donation -', 'give' );
249
		foreach ( $payments as $payment ) {
250
251
			$options[ $payment->ID ] = esc_html( '#' . $payment->ID . ' - ' . $payment->email . ' - ' . $payment->form_title );
252
253
		}
254
	}
255
256
	//Start constructing HTML output.
257
	$transaction_header = '<div style="margin:0;padding:10px 0;width:100%;background-color:#FFF;border-bottom:1px solid #eee; text-align:center;">';
258
259
	//Inline JS function for switching donations.
260
	$request_url = $_SERVER['REQUEST_URI'];
261
262
	// Remove payment id query param if set from request url.
263
	if ( $payment_id ) {
264
		$request_url_data = wp_parse_url( $_SERVER['REQUEST_URI'] );
265
		$query            = $request_url_data['query'];
266
		$query            = str_replace( "&preview_id={$payment_id}", '', $query );
267
268
		$request_url = home_url( '/?' . str_replace( '', '', $query ) );
269
	}
270
271
272
	$transaction_header .= '<script>
273
				 function change_preview(){
274
				  var transactions = document.getElementById("give_preview_email_payment_id");
275
			        var selected_trans = transactions.options[transactions.selectedIndex];
276
				        console.log(selected_trans);
277
				        if (selected_trans){
278
				            var url_string = "' . $request_url . '&preview_id=" + selected_trans.value;
279
				                window.location = url_string;
280
				        }
281
				    }
282
			    </script>';
283
284
	$transaction_header .= '<label for="give_preview_email_payment_id" style="font-size:12px;color:#333;margin:0 4px 0 0;">' . esc_html__( 'Preview email with a donation:', 'give' ) . '</label>';
285
286
	//The select field with 100 latest transactions
287
	$transaction_header .= Give()->html->select( array(
288
		'name'             => 'preview_email_payment_id',
289
		'selected'         => $payment_id,
290
		'id'               => 'give_preview_email_payment_id',
291
		'class'            => 'give-preview-email-payment-id',
292
		'options'          => $options,
293
		'chosen'           => false,
294
		'select_atts'      => 'onchange="change_preview()"',
295
		'show_option_all'  => false,
296
		'show_option_none' => false
297
	) );
298
299
	//Closing tag
300
	$transaction_header .= '</div>';
301
302
	return apply_filters( 'give_preview_email_receipt_header', $transaction_header );
303
304
}
305
306
307
/**
308
 * Give Receipt Head Content
309
 *
310
 * @since 1.6
311
 * @return string
0 ignored issues
show
Should the return type not be string|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
312
 */
313
function give_receipt_head_content() {
314
315
	//Title.
316
	$output = '<title>' . esc_html__( 'Donation Receipt', 'give' ) . '</title>';
317
318
	//Meta.
319
	$output .= '<meta charset="utf-8"/>
320
		<!-- Further disallowing of caching of this page -->
321
		<meta charset="utf-8"/>
322
		<meta http-equiv="cache-control" content="max-age=0"/>
323
		<meta http-equiv="cache-control" content="no-cache"/>
324
		<meta http-equiv="expires" content="0"/>
325
		<meta http-equiv="expires" content="Tue, 23 Oct 1977 05:00:00 PST"/>
326
		<meta http-equiv="pragma" content="no-cache"/>
327
		<meta name="robots" content="noindex, nofollow"/>';
328
329
	//CSS
330
	$output .= '<link rel="stylesheet" href="' . give_get_stylesheet_uri() . '?ver=' . GIVE_VERSION . '">';
331
332
	echo apply_filters( 'give_receipt_head_content', $output );
333
334
}
335
336
add_action( 'give_receipt_head', 'give_receipt_head_content' );