Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/wpforms-.../src/Emails
File: Notifications.php
[1000] Fix | Delete
// Use a switch-case statement to handle specific field types.
[1001] Fix | Delete
switch ( $field['type'] ) {
[1002] Fix | Delete
case 'divider':
[1003] Fix | Delete
$field_name = ! empty( $field['label'] ) ? str_repeat( '—', 3 ) . ' ' . $field['label'] . ' ' . str_repeat( '—', 3 ) : null;
[1004] Fix | Delete
$field_val = ! empty( $field['description'] ) ? $field['description'] : '';
[1005] Fix | Delete
break;
[1006] Fix | Delete
[1007] Fix | Delete
case 'pagebreak':
[1008] Fix | Delete
// Skip if the position is 'bottom'.
[1009] Fix | Delete
if ( ! empty( $field['position'] ) && $field['position'] === 'bottom' ) {
[1010] Fix | Delete
break;
[1011] Fix | Delete
}
[1012] Fix | Delete
[1013] Fix | Delete
$title = ! empty( $field['title'] ) ? $field['title'] : esc_html__( 'Page Break', 'wpforms-lite' );
[1014] Fix | Delete
$field_name = str_repeat( '—', 6 ) . ' ' . $title . ' ' . str_repeat( '—', 6 );
[1015] Fix | Delete
break;
[1016] Fix | Delete
[1017] Fix | Delete
case 'html':
[1018] Fix | Delete
$field_name = ! empty( $field['name'] ) ? $field['name'] : esc_html__( 'HTML / Code Block', 'wpforms-lite' );
[1019] Fix | Delete
$field_val = $field['code'];
[1020] Fix | Delete
break;
[1021] Fix | Delete
[1022] Fix | Delete
case 'content':
[1023] Fix | Delete
$field_name = esc_html__( 'Content', 'wpforms-lite' );
[1024] Fix | Delete
$field_val = wpforms_esc_richtext_field( $field['content'] );
[1025] Fix | Delete
break;
[1026] Fix | Delete
[1027] Fix | Delete
default:
[1028] Fix | Delete
$field_name = '';
[1029] Fix | Delete
$field_val = '';
[1030] Fix | Delete
break;
[1031] Fix | Delete
}
[1032] Fix | Delete
[1033] Fix | Delete
return [ $field_name, $field_val ];
[1034] Fix | Delete
}
[1035] Fix | Delete
[1036] Fix | Delete
/**
[1037] Fix | Delete
* Get the email reply to the address.
[1038] Fix | Delete
* This method has been overridden to add support for the Reply-to Name.
[1039] Fix | Delete
*
[1040] Fix | Delete
* @since 1.8.5
[1041] Fix | Delete
*
[1042] Fix | Delete
* @return string
[1043] Fix | Delete
*/
[1044] Fix | Delete
public function get_reply_to_address() {
[1045] Fix | Delete
[1046] Fix | Delete
$reply_to = $this->__get( 'reply_to' );
[1047] Fix | Delete
$reply_to_name = false;
[1048] Fix | Delete
[1049] Fix | Delete
if ( ! empty( $reply_to ) ) {
[1050] Fix | Delete
[1051] Fix | Delete
// Optional custom format with a Reply-to Name specified: John Doe <john@doe.com>
[1052] Fix | Delete
// - starts with anything,
[1053] Fix | Delete
// - followed by space,
[1054] Fix | Delete
// - ends with <anything> (expected to be an email, validated later).
[1055] Fix | Delete
$regex = '/^(.+) (<.+>)$/';
[1056] Fix | Delete
$matches = [];
[1057] Fix | Delete
[1058] Fix | Delete
if ( preg_match( $regex, $reply_to, $matches ) ) {
[1059] Fix | Delete
$reply_to_name = $this->sanitize( $matches[1] );
[1060] Fix | Delete
$reply_to = trim( $matches[2], '<> ' );
[1061] Fix | Delete
}
[1062] Fix | Delete
[1063] Fix | Delete
$reply_to = $this->process_tag( $reply_to, 'notification-reply-to' );
[1064] Fix | Delete
[1065] Fix | Delete
if ( ! is_email( $reply_to ) ) {
[1066] Fix | Delete
$reply_to = false;
[1067] Fix | Delete
$reply_to_name = false;
[1068] Fix | Delete
}
[1069] Fix | Delete
}
[1070] Fix | Delete
[1071] Fix | Delete
if ( $reply_to_name ) {
[1072] Fix | Delete
$reply_to = "$reply_to_name <{$reply_to}>";
[1073] Fix | Delete
}
[1074] Fix | Delete
[1075] Fix | Delete
/**
[1076] Fix | Delete
* Filter the email reply-to address.
[1077] Fix | Delete
*
[1078] Fix | Delete
* @since 1.8.5
[1079] Fix | Delete
*
[1080] Fix | Delete
* @param string $reply_to Email reply-to address.
[1081] Fix | Delete
* @param object $this Instance of the Notifications class.
[1082] Fix | Delete
*/
[1083] Fix | Delete
return apply_filters( 'wpforms_emails_notifications_get_reply_to_address', $reply_to, $this );
[1084] Fix | Delete
}
[1085] Fix | Delete
[1086] Fix | Delete
/**
[1087] Fix | Delete
* Sanitize the string.
[1088] Fix | Delete
* This method has been overridden to add support for processing smart tags.
[1089] Fix | Delete
*
[1090] Fix | Delete
* @since 1.8.5
[1091] Fix | Delete
*
[1092] Fix | Delete
* @param string $input String to sanitize and process for smart tags.
[1093] Fix | Delete
* @param string $context Context of the smart tag.
[1094] Fix | Delete
*
[1095] Fix | Delete
* @return string
[1096] Fix | Delete
*/
[1097] Fix | Delete
public function sanitize( $input = '', $context = 'notification' ): string {
[1098] Fix | Delete
[1099] Fix | Delete
return wpforms_decode_string( $this->process_tag( $input, $context ) );
[1100] Fix | Delete
}
[1101] Fix | Delete
[1102] Fix | Delete
/**
[1103] Fix | Delete
* Get the email content type.
[1104] Fix | Delete
* This method has been overridden to better declare the email template assigned to each notification.
[1105] Fix | Delete
*
[1106] Fix | Delete
* @since 1.8.5.2
[1107] Fix | Delete
*
[1108] Fix | Delete
* @return string
[1109] Fix | Delete
*/
[1110] Fix | Delete
public function get_content_type() {
[1111] Fix | Delete
[1112] Fix | Delete
$content_type = 'text/html';
[1113] Fix | Delete
[1114] Fix | Delete
if ( Helpers::is_plain_text_template( $this->current_template ) ) {
[1115] Fix | Delete
$content_type = 'text/plain';
[1116] Fix | Delete
}
[1117] Fix | Delete
[1118] Fix | Delete
/**
[1119] Fix | Delete
* Filter the email content type.
[1120] Fix | Delete
*
[1121] Fix | Delete
* @since 1.8.5.2
[1122] Fix | Delete
*
[1123] Fix | Delete
* @param string $content_type The email content type.
[1124] Fix | Delete
* @param Notifications $this An instance of the "Notifications" class.
[1125] Fix | Delete
*/
[1126] Fix | Delete
$content_type = apply_filters( 'wpforms_emails_notifications_get_content_type', $content_type, $this );
[1127] Fix | Delete
[1128] Fix | Delete
// Set the content type.
[1129] Fix | Delete
$this->__set( 'content_type', $content_type );
[1130] Fix | Delete
[1131] Fix | Delete
// Return the content type.
[1132] Fix | Delete
return $content_type;
[1133] Fix | Delete
}
[1134] Fix | Delete
[1135] Fix | Delete
/**
[1136] Fix | Delete
* Check if all emails are disabled.
[1137] Fix | Delete
*
[1138] Fix | Delete
* @since 1.8.5
[1139] Fix | Delete
*
[1140] Fix | Delete
* @return bool
[1141] Fix | Delete
*/
[1142] Fix | Delete
public function is_email_disabled() {
[1143] Fix | Delete
[1144] Fix | Delete
/**
[1145] Fix | Delete
* Filter to control email disabling.
[1146] Fix | Delete
*
[1147] Fix | Delete
* The "Notifications" class is designed to mirror the properties and methods
[1148] Fix | Delete
* provided by the "WPForms_WP_Emails" class for backward compatibility.
[1149] Fix | Delete
*
[1150] Fix | Delete
* @since 1.8.5
[1151] Fix | Delete
*
[1152] Fix | Delete
* @param bool $is_disabled Whether to disable all emails.
[1153] Fix | Delete
* @param Notifications $this An instance of the "Notifications" class.
[1154] Fix | Delete
*/
[1155] Fix | Delete
return (bool) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
[1156] Fix | Delete
'wpforms_disable_all_emails',
[1157] Fix | Delete
false,
[1158] Fix | Delete
$this
[1159] Fix | Delete
);
[1160] Fix | Delete
}
[1161] Fix | Delete
[1162] Fix | Delete
/**
[1163] Fix | Delete
* Get the default field name as a fallback.
[1164] Fix | Delete
*
[1165] Fix | Delete
* @since 1.8.5
[1166] Fix | Delete
*
[1167] Fix | Delete
* @param int $field_id Field ID.
[1168] Fix | Delete
*
[1169] Fix | Delete
* @return string
[1170] Fix | Delete
*/
[1171] Fix | Delete
private function get_default_field_name( $field_id ) {
[1172] Fix | Delete
[1173] Fix | Delete
return sprintf( /* translators: %1$d - field ID. */
[1174] Fix | Delete
esc_html__( 'Field ID #%1$s', 'wpforms-lite' ),
[1175] Fix | Delete
wpforms_validate_field_id( $field_id )
[1176] Fix | Delete
);
[1177] Fix | Delete
}
[1178] Fix | Delete
[1179] Fix | Delete
/**
[1180] Fix | Delete
* Wrap content in the 'tr' tag on the first level depth.
[1181] Fix | Delete
*
[1182] Fix | Delete
* @since 1.9.6
[1183] Fix | Delete
*
[1184] Fix | Delete
* @param string $content Processed smart tag content.
[1185] Fix | Delete
*
[1186] Fix | Delete
* @return string
[1187] Fix | Delete
*/
[1188] Fix | Delete
private function fix_table_body_markup( string $content ): string {
[1189] Fix | Delete
[1190] Fix | Delete
$content = trim( $content );
[1191] Fix | Delete
[1192] Fix | Delete
libxml_use_internal_errors( true );
[1193] Fix | Delete
[1194] Fix | Delete
$dom = new DOMDocument( '1.0', 'UTF-8' );
[1195] Fix | Delete
[1196] Fix | Delete
// We should encode `<` and `>` symbols to prevent unexpected HTML tags.
[1197] Fix | Delete
$html = '<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>' . wp_pre_kses_less_than( $content ) . '</body></html>';
[1198] Fix | Delete
[1199] Fix | Delete
$dom->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOERROR );
[1200] Fix | Delete
[1201] Fix | Delete
libxml_clear_errors();
[1202] Fix | Delete
[1203] Fix | Delete
$body = $dom->getElementsByTagName( 'body' )->item( 0 );
[1204] Fix | Delete
[1205] Fix | Delete
if ( ! $body ) {
[1206] Fix | Delete
return $this->wrap_content_with_row( $content );
[1207] Fix | Delete
}
[1208] Fix | Delete
[1209] Fix | Delete
$modified_content = '';
[1210] Fix | Delete
$content_to_wrap = '';
[1211] Fix | Delete
[1212] Fix | Delete
// phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
[1213] Fix | Delete
foreach ( $body->childNodes as $node ) {
[1214] Fix | Delete
$node_text = $node->nodeType === XML_TEXT_NODE ? $node->nodeValue : $dom->saveHTML( $node );
[1215] Fix | Delete
[1216] Fix | Delete
if ( ! property_exists( $node, 'tagName' ) || $node->tagName !== 'tr' ) {
[1217] Fix | Delete
$content_to_wrap .= $node_text;
[1218] Fix | Delete
[1219] Fix | Delete
continue;
[1220] Fix | Delete
}
[1221] Fix | Delete
[1222] Fix | Delete
// Wrap content before the `tr` tag.
[1223] Fix | Delete
$modified_content .= $this->wrap_content_with_row( $content_to_wrap );
[1224] Fix | Delete
[1225] Fix | Delete
// Save the `tr` tag without wrapping.
[1226] Fix | Delete
$modified_content .= $node_text;
[1227] Fix | Delete
[1228] Fix | Delete
$content_to_wrap = '';
[1229] Fix | Delete
}
[1230] Fix | Delete
// phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
[1231] Fix | Delete
[1232] Fix | Delete
if ( ! wpforms_is_empty_string( $content_to_wrap ) ) {
[1233] Fix | Delete
$modified_content .= $this->wrap_content_with_row( $content_to_wrap );
[1234] Fix | Delete
}
[1235] Fix | Delete
[1236] Fix | Delete
return $modified_content;
[1237] Fix | Delete
}
[1238] Fix | Delete
[1239] Fix | Delete
/**
[1240] Fix | Delete
* Wrap content to the `tr` tag.
[1241] Fix | Delete
*
[1242] Fix | Delete
* @since 1.9.6
[1243] Fix | Delete
*
[1244] Fix | Delete
* @param string $content Content.
[1245] Fix | Delete
*
[1246] Fix | Delete
* @return string
[1247] Fix | Delete
*/
[1248] Fix | Delete
private function wrap_content_with_row( string $content ): string {
[1249] Fix | Delete
[1250] Fix | Delete
$content = trim( $content );
[1251] Fix | Delete
[1252] Fix | Delete
if ( wpforms_is_empty_string( $content ) ) {
[1253] Fix | Delete
return '';
[1254] Fix | Delete
}
[1255] Fix | Delete
[1256] Fix | Delete
return sprintf( '<tr class="smart-tag"><td class="field-name field-value" colspan="2">%s</td></tr>', $content );
[1257] Fix | Delete
}
[1258] Fix | Delete
[1259] Fix | Delete
/**
[1260] Fix | Delete
* Get the list of available email templates.
[1261] Fix | Delete
*
[1262] Fix | Delete
* Given a template name, this method will return the template data.
[1263] Fix | Delete
* If no template name is provided, all available templates will be returned.
[1264] Fix | Delete
*
[1265] Fix | Delete
* Templates will go through a conditional check to make sure they are available for the current plugin edition.
[1266] Fix | Delete
*
[1267] Fix | Delete
* @since 1.8.5
[1268] Fix | Delete
*
[1269] Fix | Delete
* @param string $template Template name. If empty, all available templates will be returned.
[1270] Fix | Delete
*
[1271] Fix | Delete
* @return array
[1272] Fix | Delete
*/
[1273] Fix | Delete
public static function get_available_templates( $template = '' ) {
[1274] Fix | Delete
[1275] Fix | Delete
$templates = self::get_all_templates();
[1276] Fix | Delete
[1277] Fix | Delete
// Filter the list of available email templates based on the edition of WPForms.
[1278] Fix | Delete
if ( ! wpforms()->is_pro() ) {
[1279] Fix | Delete
$templates = array_filter(
[1280] Fix | Delete
$templates,
[1281] Fix | Delete
static function ( $instance ) {
[1282] Fix | Delete
[1283] Fix | Delete
return ! $instance['is_pro'];
[1284] Fix | Delete
}
[1285] Fix | Delete
);
[1286] Fix | Delete
}
[1287] Fix | Delete
[1288] Fix | Delete
return $templates[ $template ] ?? $templates;
[1289] Fix | Delete
}
[1290] Fix | Delete
[1291] Fix | Delete
/**
[1292] Fix | Delete
* Get the list of all email templates.
[1293] Fix | Delete
*
[1294] Fix | Delete
* Given the name of a template, this method will return the template data.
[1295] Fix | Delete
* If the template is not found, all available templates will be returned.
[1296] Fix | Delete
*
[1297] Fix | Delete
* @since 1.8.5
[1298] Fix | Delete
*
[1299] Fix | Delete
* @param string $template Template name. If empty, all templates will be returned.
[1300] Fix | Delete
*
[1301] Fix | Delete
* @return array
[1302] Fix | Delete
*/
[1303] Fix | Delete
public static function get_all_templates( $template = '' ) {
[1304] Fix | Delete
[1305] Fix | Delete
$templates = [
[1306] Fix | Delete
'classic' => [
[1307] Fix | Delete
'name' => esc_html__( 'Classic', 'wpforms-lite' ),
[1308] Fix | Delete
'path' => Templates\Classic::class,
[1309] Fix | Delete
'is_pro' => false,
[1310] Fix | Delete
],
[1311] Fix | Delete
'compact' => [
[1312] Fix | Delete
'name' => esc_html__( 'Compact', 'wpforms-lite' ),
[1313] Fix | Delete
'path' => Templates\Compact::class,
[1314] Fix | Delete
'is_pro' => false,
[1315] Fix | Delete
],
[1316] Fix | Delete
'modern' => [
[1317] Fix | Delete
'name' => esc_html__( 'Modern', 'wpforms-lite' ),
[1318] Fix | Delete
'path' => Modern::class,
[1319] Fix | Delete
'is_pro' => true,
[1320] Fix | Delete
],
[1321] Fix | Delete
'elegant' => [
[1322] Fix | Delete
'name' => esc_html__( 'Elegant', 'wpforms-lite' ),
[1323] Fix | Delete
'path' => Elegant::class,
[1324] Fix | Delete
'is_pro' => true,
[1325] Fix | Delete
],
[1326] Fix | Delete
'tech' => [
[1327] Fix | Delete
'name' => esc_html__( 'Tech', 'wpforms-lite' ),
[1328] Fix | Delete
'path' => Tech::class,
[1329] Fix | Delete
'is_pro' => true,
[1330] Fix | Delete
],
[1331] Fix | Delete
'none' => [
[1332] Fix | Delete
'name' => esc_html__( 'Plain Text', 'wpforms-lite' ),
[1333] Fix | Delete
'path' => Templates\Plain::class,
[1334] Fix | Delete
'is_pro' => false,
[1335] Fix | Delete
],
[1336] Fix | Delete
];
[1337] Fix | Delete
[1338] Fix | Delete
// Make sure the current user can preview templates.
[1339] Fix | Delete
if ( wpforms_current_user_can() ) {
[1340] Fix | Delete
// Add a preview key to each template.
[1341] Fix | Delete
foreach ( $templates as $key => &$tmpl ) {
[1342] Fix | Delete
$tmpl['preview'] = wp_nonce_url(
[1343] Fix | Delete
add_query_arg(
[1344] Fix | Delete
[
[1345] Fix | Delete
'wpforms_email_preview' => '1',
[1346] Fix | Delete
'wpforms_email_template' => $key,
[1347] Fix | Delete
],
[1348] Fix | Delete
admin_url()
[1349] Fix | Delete
),
[1350] Fix | Delete
Preview::PREVIEW_NONCE_NAME
[1351] Fix | Delete
);
[1352] Fix | Delete
}
[1353] Fix | Delete
[1354] Fix | Delete
// Make sure to unset the reference to avoid unintended changes later.
[1355] Fix | Delete
unset( $tmpl );
[1356] Fix | Delete
}
[1357] Fix | Delete
[1358] Fix | Delete
return $templates[ $template ] ?? $templates;
[1359] Fix | Delete
}
[1360] Fix | Delete
[1361] Fix | Delete
/**
[1362] Fix | Delete
* Get multiple field formatted value.
[1363] Fix | Delete
*
[1364] Fix | Delete
* @since 1.9.0
[1365] Fix | Delete
*
[1366] Fix | Delete
* @param string $value Field value.
[1367] Fix | Delete
* @param int $field_id Field ID.
[1368] Fix | Delete
* @param array $fields List of fields.
[1369] Fix | Delete
* @param string $field_key Field key to get value from.
[1370] Fix | Delete
*
[1371] Fix | Delete
* @return string
[1372] Fix | Delete
*
[1373] Fix | Delete
* @noinspection PhpUnusedParameterInspection
[1374] Fix | Delete
*/
[1375] Fix | Delete
public function get_multi_field_formatted_value( string $value, int $field_id, array $fields, string $field_key ): string {
[1376] Fix | Delete
[1377] Fix | Delete
$field_type = $fields[ $field_id ]['type'] ?? '';
[1378] Fix | Delete
[1379] Fix | Delete
// Leave early if the field type is not a multi-field.
[1380] Fix | Delete
if ( ! in_array( $field_type, wpforms_get_multi_fields(), true ) ) {
[1381] Fix | Delete
return $value;
[1382] Fix | Delete
}
[1383] Fix | Delete
[1384] Fix | Delete
// Leave early if the template is set to plain text.
[1385] Fix | Delete
if ( Helpers::is_plain_text_template( $this->current_template ) ) {
[1386] Fix | Delete
// Replace <br/> tags with line breaks.
[1387] Fix | Delete
return str_replace( '<br/>', "\r\n", $value );
[1388] Fix | Delete
}
[1389] Fix | Delete
[1390] Fix | Delete
return str_replace( [ "\r\n", "\r", "\n" ], '<br/>', $value );
[1391] Fix | Delete
}
[1392] Fix | Delete
[1393] Fix | Delete
/**
[1394] Fix | Delete
* Get the current template name.
[1395] Fix | Delete
*
[1396] Fix | Delete
* @since 1.9.3
[1397] Fix | Delete
*
[1398] Fix | Delete
* @return string
[1399] Fix | Delete
*/
[1400] Fix | Delete
public function get_current_template(): string {
[1401] Fix | Delete
[1402] Fix | Delete
return $this->current_template;
[1403] Fix | Delete
}
[1404] Fix | Delete
[1405] Fix | Delete
/**
[1406] Fix | Delete
* Get the current field template markup.
[1407] Fix | Delete
*
[1408] Fix | Delete
* @since 1.9.4
[1409] Fix | Delete
*
[1410] Fix | Delete
* @return string
[1411] Fix | Delete
*/
[1412] Fix | Delete
public function get_current_field_template(): string {
[1413] Fix | Delete
[1414] Fix | Delete
return $this->field_template;
[1415] Fix | Delete
}
[1416] Fix | Delete
}
[1417] Fix | Delete
[1418] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function