File: //var/www/html/WPSassoon/wp-content/themes/sassoon/functions.php
<?php
function handle_contact_form_submission() {
if (!isset($_POST['fname'], $_POST['pnum'], $_POST['mailid'], $_POST['msg'])) {
echo "<p style='color:red;'>All fields are required!</p>";
wp_die();
}
$fname = sanitize_text_field($_POST['fname']);
$lname = sanitize_text_field($_POST['lname']);
$name = $fname.' '.$lname;
$phone = sanitize_text_field($_POST['pnum']);
$email = sanitize_email($_POST['mailid']);
$message = sanitize_textarea_field($_POST['msg']);
// Send Email
$to = get_option('admin_email'); // Admin Email
$subject = "New Contact Form Submission";
$message = "<!DOCTYPE html>
<html lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office'>
<head>
<meta charset='utf-8'> <!-- utf-8 works for most cases -->
<meta name='viewport' content='width=device-width'> <!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv='X-UA-Compatible' content='IE=edge'> <!-- Use the latest (edge) version of IE rendering engine -->
<meta name='x-apple-disable-message-reformatting'> <!-- Disable auto-scale in iOS 10 Mail entirely -->
<meta name='format-detection' content='telephone=no,address=no,email=no,date=no,url=no'> <!-- Tell iOS not to automatically link certain text strings. -->
<meta name='color-scheme' content='light'>
<meta name='supported-color-schemes' content='light'>
<title>Welcome</title> <!-- The title tag shows in email notifications, like Android 4.4. -->
<!-- What it does: Makes background images in 72ppi Outlook render at correct size. -->
<!--[if gte mso 9]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!-- Web Font / @font-face : BEGIN -->
<link href='https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap' rel='stylesheet'>
<!-- All other clients get the webfont reference; some will render the font and others will silently fail to the fallbacks. More on that here: http://stylecampaign.com/blog/2015/02/webfont-support-in-email/ -->
<!--[if !mso]>
<link href='https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap' rel='stylesheet'>
<![endif]-->
<!-- Desktop Outlook chokes on web font references and defaults to Times New Roman, so we force a safe fallback font. -->
<!--[if mso]>
<style>
*, body,div,p,a ,h1,h2,h3,h4,h5,h6, table, td, th {
font-family: 'Poppins', sans-serif;
}
</style>
<![endif]-->
<!-- Web Font / @font-face : END -->
<!-- CSS Reset : BEGIN -->
<style>
:root {
color-scheme: light;
supported-color-schemes: light;
}
html,
body {
margin: 0 auto !important;
padding: 0 !important;
height: 100% !important;
width: 100% !important;
}
* {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
/* What it does: Centers email on Android 4.4 */
div[style*='margin: 16px 0'] {
margin: 0 !important;
}
/* What it does: forces Samsung Android mail clients to use the entire viewport */
#MessageViewBody, #MessageWebViewDiv{
width: 100% !important;
}
/* What it does: Stops Outlook from adding extra spacing to tables. */
table,
td {
mso-table-lspace: 0pt !important;
mso-table-rspace: 0pt !important;
}
/* What it does: Fixes webkit padding issue. */
table {
border-spacing: 0 !important;
border-collapse: collapse !important;
table-layout: fixed !important;
margin: 0 auto !important;
}
/* What it does: Uses a better rendering method when resizing images in IE. */
img {
-ms-interpolation-mode:bicubic;
}
/* What it does: Prevents Windows 10 Mail from underlining links despite inline CSS. Styles for underlined links should be inline. */
a {
text-decoration: none;
}
/* What it does: A work-around for email clients meddling in triggered links. */
a[x-apple-data-detectors], /* iOS */
.unstyle-auto-detected-links a,
.aBn {
border-bottom: 0 !important;
cursor: default !important;
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* What it does: Prevents Gmail from changing the text color in conversation threads. */
.im {
color: inherit !important;
}
/* What it does: Prevents Gmail from displaying a download button on large, non-linked images. */
.a6S {
display: none !important;
opacity: 0.01 !important;
}
/* If the above doesn't work, add a .g-img class to any image in question. */
img.g-img + div {
display: none !important;
}
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
/* Create one of these media queries for each additional viewport size you'd like to fix */
/* iPhone 4, 4S, 5, 5S, 5C, and 5SE */
@media only screen and (min-device-width: 320px) and (max-device-width: 374px) {
u ~ div .email-container {
min-width: 320px !important;
}
}
/* iPhone 6, 6S, 7, 8, and X */
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
u ~ div .email-container {
min-width: 375px !important;
}
}
/* iPhone 6+, 7+, and 8+ */
@media only screen and (min-device-width: 414px) {
u ~ div .email-container {
min-width: 414px !important;
}
}
</style>
<!-- CSS Reset : END -->
<!-- Progressive Enhancements : BEGIN -->
<style>
@media screen and (max-width: 579px) {
.name-block{
width: 100% !important;
margin-left: 0 !important;
}
.inner-td{
padding: 20px !important;
}
}
/* Media Queries */
@media screen and (max-width: 480px) {
/* What it does: Forces table cells into full-width rows. */
.stack-column,
.stack-column-center {
display: block !important;
width: 100% !important;
max-width: 100% !important;
direction: ltr !important;
}
/* And center justify these ones. */
.stack-column-center {
text-align: center !important;
}
/* What it does: Generic utility class for centering. Useful for images, buttons, and nested tables. */
.center-on-narrow {
text-align: center !important;
display: block !important;
margin-left: auto !important;
margin-right: auto !important;
float: none !important;
}
table.center-on-narrow {
display: inline-block !important;
}
/* What it does: Adjust typography on small screens to improve readability */
}
</style>
<!-- Progressive Enhancements : END -->
<!-- MSO dark mode fix : use the class name for texts to remain in white -->
<!--[if mso ]>
<style>
a{
line-height: normal !important;
text-decoration: none !important;
}
.ms-whiteX {
mso-style-textfill-type:gradient;
mso-style-textfill-fill-gradientfill-stoplist:'0 \#FFFFFF 0 100000\,100000 \#FFFFFF 0 100000';
}
</style>
<![endif]-->
</head>
<!--
The email background color (#ECF3FE) is defined in three places:
1. body tag: for most email clients
2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr
3. mso conditional: For Windows 10 Mail
-->
<body width='100%' style='margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #fff;'>
<center role='article' aria-roledescription='email' lang='en' style='width: 100%; background-color: #fff;'>
<!--[if mso | IE]>
<table role='presentation' border='0' cellpadding='0' cellspacing='0' width='100%' style='background-color: #ECF3FE;'>
<tr>
<td>
<![endif]-->
<!-- Create white space after the desired preview text so email clients don’t pull other distracting text into the inbox preview. Extend as necessary. -->
<!-- Preview Text Spacing Hack : BEGIN -->
<div style='display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: 'Prompt', sans-serif;'>
‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌
</div>
<!-- Preview Text Spacing Hack : END -->
<!--
Set the email width. Defined in two places:
1. max-width for all clients except Desktop Windows Outlook, allowing the email to squish on narrow but never go wider than 680px.
2. MSO tags for Desktop Windows Outlook enforce a 680px width.
Note: The Fluid and Responsive templates have a different width (600px). The hybrid grid is more 'fragile', and I've found that 680px is a good width. Change with caution.
-->
<div style='background-color: #262677; max-width: 800px; margin: 0 auto;font-family: 'Poppins', sans-serif; padding: 15px 5px;' class='email-container'>
<!--[if mso]>
<table align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' width='800'>
<tr>
<td>
<![endif]-->
<!-- Email Body : BEGIN -->
<table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' style='width: 780px; margin: 0px auto 0 !important; font-family: 'Poppins', sans-serif; max-width: 100%;'>
<tr>
<td>
<table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' width='100%' style='margin: auto !important; '>
<!-- Clear Spacer : BEGIN -->
<!-- <tr>
<td aria-hidden='true' height='10' style='font-size: 0px; line-height: 0px;'>
</td>
</tr> -->
<!-- Clear Spacer : END -->
<tr>
<td class='inner-td' style='background: #fff; padding: 40px; border-top: solid 5px #fff; margin-bottom: 20px;'>
<div style='padding: 0px 0px 10px; text-align: center; border-bottom:1px solid #ededed; padding:15px 0px 10px; margin-bottom: 20px; background: #262677;'>
<img src='https://sassoon.spericorn.com/wp-content/themes/sassoon/img/logo.png' width='180' alt='alt_text' border='0' >
</div>
<h4 style='font-family: 'Poppins', sans-serif; color: #292D32; font-size: 20px; font-weight: 600; margin: 0; margin-bottom: 15px;'>Hi Admin,</h4>
<div style='display:block; text-align: center; padding-top: 15px;'>
<img src='https://sassoon.spericorn.com/wp-content/themes/sassoon/img/contact.png' alt='' width='250' style='width:250px'>
</div>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 14px; margin-top: 30px; margin-bottom: 30px;'>We wanted to inform you that a user has recently made a message on your platform.</p>
<div style='display:block; box-sizing: border-box; width: 100%;'>
<div class='name-block' style='margin-bottom: 20px; display:block; width: 100%; box-sizing: border-box;'>
<p style='font-family: 'Poppins', sans-serif; color: #292D32; color: #697F9B; font-size: 13px; margin: 0;'>
<span style='font-weight: 500;'>Name</span>: ". $name."
</p>
</div>
<div class='name-block' style='margin-bottom: 20px; display:block; width: 100%; box-sizing: border-box;'>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 13px; margin: 0;'>
<span style='font-weight: 500;'>Email</span>: ". $email."
</p>
</div>
<div class='name-block' style='margin-bottom: 20px; display:block; width: 100%; box-sizing: border-box;'>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 13px; margin: 0;'>
<span style='font-weight: 500;'>Phone</span>: ". $phone."
</p>
</div>
<div style='display:inline-block; box-sizing: border-box;'>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 13px; margin: 0 0 10px;'>
<span style='font-weight: 500;'>Message</span>
</p>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 13px; margin: 0 0 15px;'>
". $message."
</p>
<p style='margin-top: 30px; margin-bottom: 5px; font-family: 'Poppins', sans-serif; color: #292D32; font-size: 12px;'>Thank you</p>
<h4 style='font-size: 12px; margin-top: 0; color: #292D32; font-weight: 700;'>Sassoon</h4>
</div>
</div>
</td>
</tr>
<!-- Clear Spacer : BEGIN -->
<!-- Clear Spacer : END -->
</table>
</td>
</tr>
</table>
<!-- Email Body : END -->
<!-- Email Social Media : BEGIN -->
<tr>
<td>
<!-- <table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' width='100%'>
<tr>
<td style='text-align: center; padding: 15px;'>
<p style='font-family: 'Poppins', sans-serif; text-align: center; margin: 0;'>
<a href='#' style='display: inline-block; margin: 0 2px;'><img src='img/upwrk.png' alt='Up work'></a>
<a href='#' style='display: inline-block; margin: 0 2px;'><img src='img/linkd.png' alt='Linked in'></a>
</p>
</td>
</tr>
</table> -->
</td>
</tr>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
</div>
<!-- Full Bleed Background Section : BEGIN -->
<!-- Full Bleed Background Section : END -->
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</center>
</body>
</html>";
$headers = array(
'Content-Type: text/html; charset=utf-8'
);
if (wp_mail($email, $subject, $message, $headers)) {
echo "<p style='color:green;'>Thank you! Your message has been sent.</p>";
} else {
echo "<p style='color:red;'>Error sending email.</p>";
}
wp_die(); // Required to terminate properly
}
add_action('wp_ajax_submit_contact_form', 'handle_contact_form_submission');
add_action('wp_ajax_nopriv_submit_contact_form', 'handle_contact_form_submission');
function handle_email_subscription() {
if (isset($_POST['email']) && is_email($_POST['email'])) {
// Send Email
$email = $_POST['email']; // Admin Email
$subject = "New Subscription";
$message = "<!DOCTYPE html>
<html lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office'>
<head>
<meta charset='utf-8'> <!-- utf-8 works for most cases -->
<meta name='viewport' content='width=device-width'> <!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv='X-UA-Compatible' content='IE=edge'> <!-- Use the latest (edge) version of IE rendering engine -->
<meta name='x-apple-disable-message-reformatting'> <!-- Disable auto-scale in iOS 10 Mail entirely -->
<meta name='format-detection' content='telephone=no,address=no,email=no,date=no,url=no'> <!-- Tell iOS not to automatically link certain text strings. -->
<meta name='color-scheme' content='light'>
<meta name='supported-color-schemes' content='light'>
<title>Welcome</title> <!-- The title tag shows in email notifications, like Android 4.4. -->
<!-- What it does: Makes background images in 72ppi Outlook render at correct size. -->
<!--[if gte mso 9]>
<xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
<o:PixelsPerInch>96</o:PixelsPerInch>
</o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!-- Web Font / @font-face : BEGIN -->
<link href='https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap' rel='stylesheet'>
<!-- All other clients get the webfont reference; some will render the font and others will silently fail to the fallbacks. More on that here: http://stylecampaign.com/blog/2015/02/webfont-support-in-email/ -->
<!--[if !mso]>
<link href='https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap' rel='stylesheet'>
<![endif]-->
<!-- Desktop Outlook chokes on web font references and defaults to Times New Roman, so we force a safe fallback font. -->
<!--[if mso]>
<style>
*, body,div,p,a ,h1,h2,h3,h4,h5,h6, table, td, th {
font-family: 'Poppins', sans-serif;
}
</style>
<![endif]-->
<!-- Web Font / @font-face : END -->
<!-- CSS Reset : BEGIN -->
<style>
:root {
color-scheme: light;
supported-color-schemes: light;
}
html,
body {
margin: 0 auto !important;
padding: 0 !important;
height: 100% !important;
width: 100% !important;
}
* {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
/* What it does: Centers email on Android 4.4 */
div[style*='margin: 16px 0'] {
margin: 0 !important;
}
/* What it does: forces Samsung Android mail clients to use the entire viewport */
#MessageViewBody, #MessageWebViewDiv{
width: 100% !important;
}
/* What it does: Stops Outlook from adding extra spacing to tables. */
table,
td {
mso-table-lspace: 0pt !important;
mso-table-rspace: 0pt !important;
}
/* What it does: Fixes webkit padding issue. */
table {
border-spacing: 0 !important;
border-collapse: collapse !important;
table-layout: fixed !important;
margin: 0 auto !important;
}
/* What it does: Uses a better rendering method when resizing images in IE. */
img {
-ms-interpolation-mode:bicubic;
}
/* What it does: Prevents Windows 10 Mail from underlining links despite inline CSS. Styles for underlined links should be inline. */
a {
text-decoration: none;
}
/* What it does: A work-around for email clients meddling in triggered links. */
a[x-apple-data-detectors], /* iOS */
.unstyle-auto-detected-links a,
.aBn {
border-bottom: 0 !important;
cursor: default !important;
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* What it does: Prevents Gmail from changing the text color in conversation threads. */
.im {
color: inherit !important;
}
/* What it does: Prevents Gmail from displaying a download button on large, non-linked images. */
.a6S {
display: none !important;
opacity: 0.01 !important;
}
/* If the above doesn't work, add a .g-img class to any image in question. */
img.g-img + div {
display: none !important;
}
/* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
/* Create one of these media queries for each additional viewport size you'd like to fix */
/* iPhone 4, 4S, 5, 5S, 5C, and 5SE */
@media only screen and (min-device-width: 320px) and (max-device-width: 374px) {
u ~ div .email-container {
min-width: 320px !important;
}
}
/* iPhone 6, 6S, 7, 8, and X */
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
u ~ div .email-container {
min-width: 375px !important;
}
}
/* iPhone 6+, 7+, and 8+ */
@media only screen and (min-device-width: 414px) {
u ~ div .email-container {
min-width: 414px !important;
}
}
</style>
<!-- CSS Reset : END -->
<!-- Progressive Enhancements : BEGIN -->
<style>
@media screen and (max-width: 579px) {
.name-block{
width: 100% !important;
margin-left: 0 !important;
}
.inner-td{
padding: 20px !important;
}
}
/* Media Queries */
@media screen and (max-width: 480px) {
/* What it does: Forces table cells into full-width rows. */
.stack-column,
.stack-column-center {
display: block !important;
width: 100% !important;
max-width: 100% !important;
direction: ltr !important;
}
/* And center justify these ones. */
.stack-column-center {
text-align: center !important;
}
/* What it does: Generic utility class for centering. Useful for images, buttons, and nested tables. */
.center-on-narrow {
text-align: center !important;
display: block !important;
margin-left: auto !important;
margin-right: auto !important;
float: none !important;
}
table.center-on-narrow {
display: inline-block !important;
}
/* What it does: Adjust typography on small screens to improve readability */
}
</style>
<!-- Progressive Enhancements : END -->
<!-- MSO dark mode fix : use the class name for texts to remain in white -->
<!--[if mso ]>
<style>
a{
line-height: normal !important;
text-decoration: none !important;
}
.ms-whiteX {
mso-style-textfill-type:gradient;
mso-style-textfill-fill-gradientfill-stoplist:'0 \#FFFFFF 0 100000\,100000 \#FFFFFF 0 100000';
}
</style>
<![endif]-->
</head>
<!--
The email background color (#ECF3FE) is defined in three places:
1. body tag: for most email clients
2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr
3. mso conditional: For Windows 10 Mail
-->
<body width='100%' style='margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #fff;'>
<center role='article' aria-roledescription='email' lang='en' style='width: 100%; background-color: #fff;'>
<!--[if mso | IE]>
<table role='presentation' border='0' cellpadding='0' cellspacing='0' width='100%' style='background-color: #ECF3FE;'>
<tr>
<td>
<![endif]-->
<!-- Create white space after the desired preview text so email clients don’t pull other distracting text into the inbox preview. Extend as necessary. -->
<!-- Preview Text Spacing Hack : BEGIN -->
<div style='display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: 'Prompt', sans-serif;'>
‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌
</div>
<!-- Preview Text Spacing Hack : END -->
<!--
Set the email width. Defined in two places:
1. max-width for all clients except Desktop Windows Outlook, allowing the email to squish on narrow but never go wider than 680px.
2. MSO tags for Desktop Windows Outlook enforce a 680px width.
Note: The Fluid and Responsive templates have a different width (600px). The hybrid grid is more 'fragile', and I've found that 680px is a good width. Change with caution.
-->
<div style='background-color: #262677; max-width: 800px; margin: 0 auto;font-family: 'Poppins', sans-serif; padding: 15px 5px;' class='email-container'>
<!--[if mso]>
<table align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' width='800'>
<tr>
<td>
<![endif]-->
<!-- Email Body : BEGIN -->
<table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' style='width: 780px; margin: 0px auto 0 !important; font-family: 'Poppins', sans-serif; max-width: 100%;'>
<tr>
<td>
<table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' width='100%' style='margin: auto !important; '>
<!-- Clear Spacer : BEGIN -->
<!-- <tr>
<td aria-hidden='true' height='10' style='font-size: 0px; line-height: 0px;'>
</td>
</tr> -->
<!-- Clear Spacer : END -->
<tr>
<td class='inner-td' style='background: #fff; padding: 40px; border-top: solid 5px #fff; margin-bottom: 20px;'>
<div style='padding: 0px 0px 10px; text-align: center; border-bottom:1px solid #ededed; padding:15px 0px 10px; margin-bottom: 20px; background: #262677;'>
<img src='https://sassoon.spericorn.com/wp-content/themes/sassoon/img/logo.png' width='180' alt='alt_text' border='0' >
</div>
<h4 style='font-family: 'Poppins', sans-serif; color: #292D32; font-size: 20px; font-weight: 600; margin: 0; margin-bottom: 15px;'>Hi,</h4>
<div style='display:block; text-align: center; padding-top: 15px;'>
<img src='https://sassoon.spericorn.com/wp-content/themes/sassoon/img/contact.png' alt='' width='250' style='width:250px'>
</div>
<p style='font-family: Poppins, sans-serif; color: #697F9B; font-size: 14px; margin-top: 30px; margin-bottom: 30px;'>
Thank you for subscribing!
</p>
<p>We appreciate your interest. You'll receive our latest updates and newsletters.</p>
<div style='display:block; box-sizing: border-box; width: 100%;'>
<div style='display:inline-block; box-sizing: border-box;'>
<p style='font-family: 'Poppins', sans-serif; color: #697F9B; font-size: 13px; margin: 0 0 15px;'>
</p>
<p style='margin-top: 30px; margin-bottom: 5px; font-family: 'Poppins', sans-serif; color: #292D32; font-size: 12px;'>Thank you</p>
<h4 style='font-size: 12px; margin-top: 0; color: #292D32; font-weight: 700;'>Sassoon</h4>
</div>
</div>
</td>
</tr>
<!-- Clear Spacer : BEGIN -->
<!-- Clear Spacer : END -->
</table>
</td>
</tr>
</table>
<!-- Email Body : END -->
<!-- Email Social Media : BEGIN -->
<tr>
<td>
<!-- <table role='presentation' cellspacing='0' cellpadding='0' border='0' bgcolor='' width='100%'>
<tr>
<td style='text-align: center; padding: 15px;'>
<p style='font-family: 'Poppins', sans-serif; text-align: center; margin: 0;'>
<a href='#' style='display: inline-block; margin: 0 2px;'><img src='img/upwrk.png' alt='Up work'></a>
<a href='#' style='display: inline-block; margin: 0 2px;'><img src='img/linkd.png' alt='Linked in'></a>
</p>
</td>
</tr>
</table> -->
</td>
</tr>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
</div>
<!-- Full Bleed Background Section : BEGIN -->
<!-- Full Bleed Background Section : END -->
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</center>
</body>
</html>";
$headers = array(
'Content-Type: text/html; charset=utf-8'
);
if (wp_mail($email, $subject, $message, $headers)) {
echo "<p style='color:green;'>Thank you! Your message has been sent.</p>";
} else {
echo "<p style='color:red;'>Error sending email.</p>";
}
wp_die(); // Required to terminate properly
} else {
echo '<span style="color: red;">Invalid email!</span>';
}
}
add_action('wp_ajax_subscribe_email', 'handle_email_subscription');
add_action('wp_ajax_nopriv_subscribe_email', 'handle_email_subscription');
// 🔹 Register Deals CPT
function create_deal_cpt() {
$labels = [
'name' => 'Deals',
'singular_name' => 'Deal',
'add_new' => 'Add New',
'add_new_item' => 'Add New Deal',
'edit_item' => 'Edit Deal',
'new_item' => 'New Deal',
'all_items' => 'All Deals',
'view_item' => 'View Deal',
'search_items' => 'Search Deals',
'not_found' => 'No Deal found',
'not_found_in_trash' => 'No Deals found in Trash',
'menu_name' => 'Deal'
];
$args = [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'show_in_menu' => true,
'supports' => ['title'],
'menu_position' => 5,
'menu_icon' => 'dashicons-randomize',
];
register_post_type('deal', $args);
}
add_action('init', 'create_deal_cpt');
// 🔹 Register Taxonomy
function create_deal_category_taxonomy() {
$labels = [
'name' => 'Deal Categories',
'singular_name' => 'Deal Category',
'menu_name' => 'Categories',
];
$args = [
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => ['slug' => 'deal-category'],
];
register_taxonomy('deal_category', 'deal', $args);
}
add_action('init', 'create_deal_category_taxonomy');
// 🔹 Add Meta Boxes
function deal_add_meta_boxes() {
add_meta_box('deal_meta', 'Deal Details', 'deal_meta_callback', 'deal', 'normal', 'high');
}
add_action('add_meta_boxes', 'deal_add_meta_boxes');
function deal_meta_callback($post) {
$buyer_name = get_post_meta($post->ID, '_buyer_name', true);
$buyer_logo = get_post_meta($post->ID, '_buyer_logo', true);
$seller_name = get_post_meta($post->ID, '_seller_name', true);
$seller_logo = get_post_meta($post->ID, '_seller_logo', true);
wp_nonce_field('save_deal_meta', 'deal_meta_nonce');
?>
<p>
<label>Buyer Name</label><br>
<input type="text" name="buyer_name" value="<?php echo esc_attr($buyer_name); ?>" style="width:100%">
</p>
<p>
<label>Buyer Logo</label><br>
<input type="hidden" name="buyer_logo" id="buyer_logo" value="<?php echo esc_attr($buyer_logo); ?>">
<img id="buyer_logo_preview" src="<?php echo esc_url($buyer_logo); ?>" style="max-width:120px; display:block; margin-bottom:10px;">
<button type="button" class="button upload-logo" data-target="buyer_logo">Upload Logo</button>
<button type="button" class="button remove-logo" data-target="buyer_logo">Remove</button>
</p>
<hr>
<p>
<label>Seller Name</label><br>
<input type="text" name="seller_name" value="<?php echo esc_attr($seller_name); ?>" style="width:100%">
</p>
<p>
<label>Seller Logo</label><br>
<input type="hidden" name="seller_logo" id="seller_logo" value="<?php echo esc_attr($seller_logo); ?>">
<img id="seller_logo_preview" src="<?php echo esc_url($seller_logo); ?>" style="max-width:120px; display:block; margin-bottom:10px;">
<button type="button" class="button upload-logo" data-target="seller_logo">Upload Logo</button>
<button type="button" class="button remove-logo" data-target="seller_logo">Remove</button>
</p>
<?php
}
// 🔹 Save Meta
function save_deal_meta($post_id) {
if (!isset($_POST['deal_meta_nonce']) || !wp_verify_nonce($_POST['deal_meta_nonce'], 'save_deal_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
update_post_meta($post_id, '_buyer_name', sanitize_text_field($_POST['buyer_name'] ?? ''));
update_post_meta($post_id, '_buyer_logo', esc_url_raw($_POST['buyer_logo'] ?? ''));
update_post_meta($post_id, '_seller_name', sanitize_text_field($_POST['seller_name'] ?? ''));
update_post_meta($post_id, '_seller_logo', esc_url_raw($_POST['seller_logo'] ?? ''));
}
add_action('save_post', 'save_deal_meta');
// 🔹 Enqueue JS
function deals_enqueue_scripts() {
wp_enqueue_script(
'deals-ajax',
get_stylesheet_directory_uri() . '/js/deals-ajax.js',
['jquery'],
null,
true
);
wp_localize_script('deals-ajax', 'deals_ajax', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('deals_nonce')
]);
}
add_action('wp_enqueue_scripts', 'deals_enqueue_scripts');
// 🔹 Media uploader for logos
function deal_admin_scripts($hook) {
global $post_type;
if ($post_type === 'deal') {
wp_enqueue_media();
wp_enqueue_script(
'deal-meta-js',
get_stylesheet_directory_uri() . '/js/deal-meta.js',
['jquery'],
null,
true
);
}
}
add_action('admin_enqueue_scripts', 'deal_admin_scripts');
// 🔹 Shortcode
function deals_ajax_shortcode($atts) {
$atts = shortcode_atts([
'posts_per_page' => 6,
], $atts, 'deals_ajax');
$categories = get_terms(['taxonomy' => 'deal_category', 'hide_empty' => true]);
ob_start(); ?>
<div class="deals-filter">
<select id="deal-category-select">
<option value="">All Categories</option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo esc_attr($cat->slug); ?>">
<?php echo esc_html($cat->name); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div id="deals-container" data-perpage="<?php echo intval($atts['posts_per_page']); ?>">
<!-- Deals load here -->
</div>
<div id="deals-pagination"></div>
<?php
return ob_get_clean();
}
add_shortcode('deals_ajax', 'deals_ajax_shortcode');
// 🔹 AJAX Loader
function load_deals_ajax() {
check_ajax_referer('deals_nonce', 'nonce');
$category = sanitize_text_field($_POST['category'] ?? '');
$paged = intval($_POST['paged'] ?? 1);
$per_page = intval($_POST['per_page'] ?? 6);
$tax_query = [];
if ($category) {
$tax_query[] = [
'taxonomy' => 'deal_category',
'field' => 'slug',
'terms' => $category,
];
}
$query = new WP_Query([
'post_type' => 'deal',
'posts_per_page' => $per_page,
'paged' => $paged,
'tax_query' => $tax_query,
]);
ob_start();
if ($query->have_posts()) {
echo '<div class="deals-wrapper">';
while ($query->have_posts()) {
$query->the_post();
$buyer_name = get_post_meta(get_the_ID(), '_buyer_name', true);
$buyer_logo = get_post_meta(get_the_ID(), '_buyer_logo', true);
$seller_name = get_post_meta(get_the_ID(), '_seller_name', true);
$seller_logo = get_post_meta(get_the_ID(), '_seller_logo', true);
$terms = get_the_terms(get_the_ID(), 'deal_category');
$category_name = $terms && !is_wp_error($terms) ? $terms[0]->name : '';
echo '<div class="deal-card">';
echo '<div class="deal-logos">';
// Buyer
echo '<div class="deal-buyer">';
echo '<span class="deal-label">Buyer</span>';
if ($buyer_logo) echo '<img src="'.esc_url($buyer_logo).'" alt="'.esc_attr($buyer_name).'" />';
echo '</div>';
// Seller
echo '<div class="deal-seller">';
echo '<span class="deal-label">Seller</span>';
if ($seller_logo) echo '<img src="'.esc_url($seller_logo).'" alt="'.esc_attr($seller_name).'" />';
echo '</div>';
echo '</div>'; // end logos
if ($category_name) {
echo '<div class="deal-category">'.esc_html($category_name).'</div>';
}
echo '</div>'; // end deal-card
}
echo '</div>';
} else {
echo '<p>No Deal found.</p>';
}
// Pagination
$paginate_links = paginate_links([
'base' => '%_%',
'format' => '',
'current' => $paged,
'total' => $query->max_num_pages,
]);
echo '<div class="deals-pagination">'.$paginate_links.'</div>';
wp_reset_postdata();
echo ob_get_clean();
wp_die();
}
add_action('wp_ajax_load_deals', 'load_deals_ajax');
add_action('wp_ajax_nopriv_load_deals', 'load_deals_ajax');
function load_deals_pagination() {
$paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
$per_page = isset($_POST['per_page']) ? intval($_POST['per_page']) : 6;
$query = new WP_Query([
'post_type' => 'deal',
'posts_per_page' => $per_page,
'paged' => $paged,
]);
if ($query->have_posts()) {
echo '<div class="box-inner">';
while ($query->have_posts()) {
$query->the_post();
$buyer_name = get_post_meta(get_the_ID(), '_buyer_name', true);
$buyer_logo = get_post_meta(get_the_ID(), '_buyer_logo', true);
$seller_name = get_post_meta(get_the_ID(), '_seller_name', true);
$seller_logo = get_post_meta(get_the_ID(), '_seller_logo', true);
$terms = wp_get_post_terms(get_the_ID(), 'deal_category');
$category_name = !empty($terms) ? $terms[0]->name : '';
?>
<div class="box">
<div class="top-sec">
<div class="gray-btn"><button class="btn-1">Buyer</button></div>
<div class="gray-btn"><button class="btn-1">Seller</button></div>
</div>
<div class="mid-sec">
<div class="logo-sec">
<?php if ($buyer_logo): ?>
<img src="<?php echo esc_url($buyer_logo); ?>" alt="<?php echo esc_attr($buyer_name); ?>">
<?php elseif ($buyer_name): ?>
<span><?php echo esc_html($buyer_name); ?></span>
<?php endif; ?>
</div>
<div class="line"></div>
<div class="logo-sec">
<?php if ($seller_logo): ?>
<img src="<?php echo esc_url($seller_logo); ?>" alt="<?php echo esc_attr($seller_name); ?>">
<?php elseif ($seller_name): ?>
<span><?php echo esc_html($seller_name); ?></span>
<?php endif; ?>
</div>
</div>
<div class="bottom-btn">
<?php if ($category_name): ?>
<button class="community-btn"><?php echo esc_html($category_name); ?></button>
<?php endif; ?>
</div>
</div>
<?php
}
echo '</div>'; // close box-inner
} else {
echo '<p>No deals found.</p>';
}
// Custom pagination
$total_pages = $query->max_num_pages;
$total_posts = $query->found_posts;
$showing_to = min($paged * $per_page, $total_posts);
if ($total_pages > 1) {
echo '<div class="pagination-wrap">';
echo '<div class="left-wrap"><span>Showing ' . $showing_to . ' of ' . $total_posts . '</span></div>';
echo '<div class="right-wrap"><ul>';
// Left arrow
$prev_class = ($paged <= 1) ? 'class="disabled"' : '';
echo '<li ' . $prev_class . '><a href="#" data-page="' . max(1, $paged - 1) . '">
<div class="num arrow left">
<div class="svg"><svg xmlns="http://www.w3.org/2000/svg" width="8" height="13" fill="none"><path stroke="#0E0E0E" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m1 12 5.5-5.5L1 1"/></svg></div>
</div>
</a></li>';
// Numbered pages (show first 3, last, current ±1, with "..." in between)
$range = 1; // pages around current
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == 1 || $i == $total_pages || ($i >= $paged - $range && $i <= $paged + $range)) {
$active = ($i == $paged) ? 'class="active"' : '';
echo '<li ' . $active . '><a href="#" data-page="' . $i . '"><div class="num">' . $i . '</div></a></li>';
} elseif ($i == 2 && $paged > 3) {
echo '<li><div class="num">...</div></li>';
} elseif ($i == $total_pages - 1 && $paged < $total_pages - 2) {
echo '<li><div class="num">...</div></li>';
}
}
// Right arrow
$next_class = ($paged >= $total_pages) ? 'class="disabled"' : '';
echo '<li ' . $next_class . '><a href="#" data-page="' . min($total_pages, $paged + 1) . '">
<div class="num arrow right">
<div class="svg"><svg xmlns="http://www.w3.org/2000/svg" width="8" height="13" fill="none"><path stroke="#0E0E0E" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m1 12 5.5-5.5L1 1"/></svg></div>
</div>
</a></li>';
echo '</ul></div></div>';
}
wp_reset_postdata();
wp_die();
}
add_action('wp_ajax_load_more_deals', 'load_deals_pagination');
add_action('wp_ajax_nopriv_load_more_deals', 'load_deals_pagination');
function enqueue_deals_scripts() {
wp_enqueue_script('deals-loadmore', get_template_directory_uri() . '/js/deals-loadmore.js', ['jquery'], '1.0', true);
wp_localize_script('deals-loadmore', 'deals_ajax', [
'ajax_url' => admin_url('admin-ajax.php'),
]);
}
add_action('wp_enqueue_scripts', 'enqueue_deals_scripts');
// Allow SVG upload safely
function allow_svg_uploads($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter('upload_mimes', 'allow_svg_uploads');