=== BACKDOOR HUNT ===
=== Code Snippets ===
Total snippets: 11
--- Snippet #1: Make upload filenames lowercase ---
Active: no | Scope: global
Code:
add_filter( 'sanitize_file_name', 'mb_strtolower' );
--- Snippet #2: Disable admin bar ---
Active: no | Scope: front-end
Code:
add_action( 'wp', function () {
if ( ! current_user_can( 'manage_options' ) ) {
show_admin_bar( false );
}
} );
--- Snippet #3: Allow smilies ---
Active: no | Scope: global
Code:
add_filter( 'widget_text', 'convert_smilies' );
add_filter( 'the_title', 'convert_smilies' );
add_filter( 'wp_title', 'convert_smilies' );
add_filter( 'get_bloginfo', 'convert_smilies' );
--- Snippet #4: Current year ---
Active: no | Scope: content
Code:
--- Snippet #5: not ---
Active: no | Scope: global
Code:
add_action('init', function () {
register_post_type('vitrin_purchase', [
'labels' => [
'name' => 'اعلان خرید',
'singular_name' => 'اعلان خرید',
'add_new' => 'افزودن خرید جدید',
'add_new_item' => 'افزودن اعلان خرید جدید',
'edit_item' => 'ویرایش اعلان خرید',
'all_items' => 'همه اعلانها',
'menu_name' => 'اعلان خرید',
],
'public' => false,
'show_ui' => true,
'show_in_menu' => true,
'menu_icon' => 'dashicons-cart',
'supports' => ['title'],
'menu_position' => 25,
]);
});
add_action('add_meta_boxes', function () {
add_meta_box(
'vitrin_purchase_details',
'جزئیات خرید',
function ($post) {
wp_nonce_field('vitrin_purchase_save', 'vitrin_purchase_nonce');
$city = get_post_meta($post->ID, '_vp_city', true);
$product = get_post_meta($post->ID, '_vp_product', true);
$link = get_post_meta($post->ID, '_vp_link', true);
$minutes = get_post_meta($post->ID, '_vp_minutes', true);
?>
این عدد فقط برای متن «X دقیقه پیش» استفاده میشود.
تنظیمات ذخیره شد.
';
}
$enabled = get_option('vp_enabled', 1);
$position = get_option('vp_position', 'top-left');
$bg = get_option('vp_bg_color', '#ffffff');
$text = get_option('vp_text_color', '#1a1a1a');
$accent = get_option('vp_accent_color', '#9f1239');
$duration = get_option('vp_display_seconds', 6);
$min_int = get_option('vp_min_interval', 8);
$max_int = get_option('vp_max_interval', 20);
$shuffle = get_option('vp_shuffle', 1);
?>
تنظیمات نمایش اعلان خرید
برای افزودن اعلانهای خرید، از منوی
افزودن خرید جدید
استفاده کنید.
طراحی شده توسط علیرضا رحمتی | اینستاگرام : alireza.webcode
'vitrin_purchase',
'post_status' => 'publish',
'posts_per_page' => 50,
'orderby' => 'date',
'order' => 'DESC',
]);
if (empty($posts)) {
return;
}
$items = [];
foreach ($posts as $p) {
$minutes = intval(get_post_meta($p->ID, '_vp_minutes', true)) ?: 5;
$items[] = [
'name' => wp_strip_all_tags(get_the_title($p)),
'city' => wp_strip_all_tags(get_post_meta($p->ID, '_vp_city', true)),
'product' => wp_strip_all_tags(get_post_meta($p->ID, '_vp_product', true)),
'link' => esc_url(get_post_meta($p->ID, '_vp_link', true)),
'minutes' => max(1, $minutes),
];
}
$settings = [
'position' => get_option('vp_position', 'top-left'),
'bgColor' => get_option('vp_bg_color', '#ffffff'),
'textColor' => get_option('vp_text_color', '#1a1a1a'),
'accentColor' => get_option('vp_accent_color', '#9f1239'),
'displaySeconds' => intval(get_option('vp_display_seconds', 6)),
'minInterval' => intval(get_option('vp_min_interval', 8)),
'maxInterval' => intval(get_option('vp_max_interval', 20)),
'shuffle' => (bool) get_option('vp_shuffle', 1),
];
wp_register_script('vp-purchase-notice', false, [], '1.2', true);
wp_enqueue_script('vp-purchase-notice');
wp_localize_script('vp-purchase-notice', 'VP_DATA', [
'items' => $items,
'settings' => $settings,
]);
wp_add_inline_script('vp-purchase-notice', vitrin_purchase_js());
}, 20);
add_action('wp_head', function () {
if (!get_option('vp_enabled', 1) || is_admin()) {
return;
}
echo '';
});
function vitrin_purchase_css() {
return << 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = items[i];
items[i] = items[j];
items[j] = tmp;
}
}
document.addEventListener('DOMContentLoaded', function () {
if (!document.body || !items.length) {
return;
}
var wrap = document.createElement('div');
wrap.className = 'vp-notice-wrap vp-' + settings.position;
wrap.style.setProperty('--vp-bg', settings.bgColor || '#ffffff');
wrap.style.setProperty('--vp-text', settings.textColor || '#1a1a1a');
wrap.style.setProperty('--vp-accent', settings.accentColor || '#9f1239');
document.body.appendChild(wrap);
var data = items[0];
var durationMs = settings.displaySeconds * 1000;
var card = document.createElement('div');
card.className = 'vp-notice-card';
card.innerHTML =
'' +
'' +
'' +
'
' +
'
' + escapeHtml(data.name) + '' + (data.city ? ' از ' + escapeHtml(data.city) : '') + '
' +
'
' + escapeHtml(data.product) + ' رو خرید کرد
' +
'
' + escapeHtml(data.minutes) + ' دقیقه پیش
' +
'
' +
'
' +
'';
if (data.link) {
card.addEventListener('click', function (e) {
if (e.target.closest('.vp-notice-close')) {
return;
}
window.open(data.link, '_blank', 'noopener');
});
}
var closeBtn = card.querySelector('.vp-notice-close');
var dismissed = false;
var hideTimer;
var remaining = durationMs;
var startedAt = Date.now();
closeBtn.addEventListener('click', function (e) {
e.stopPropagation();
dismiss();
});
wrap.innerHTML = '';
wrap.appendChild(card);
try {
if (window.localStorage) {
localStorage.setItem(storageKey, '1');
}
} catch (e) {}
var bar = card.querySelector('.vp-notice-progress-bar');
requestAnimationFrame(function () {
card.classList.add('vp-show');
requestAnimationFrame(function () {
bar.style.transition = 'transform ' + remaining + 'ms linear';
bar.style.transform = 'scaleX(0)';
});
});
startTimer();
function startTimer() {
startedAt = Date.now();
hideTimer = setTimeout(dismiss, remaining);
}
function pauseTimer() {
clearTimeout(hideTimer);
remaining -= Date.now() - startedAt;
if (remaining < 300) {
remaining = 300;
}
bar.style.transition = 'none';
bar.style.transform = 'scaleX(' + getScaleX(bar) + ')';
}
function resumeTimer() {
startTimer();
requestAnimationFrame(function () {
bar.style.transition = 'transform ' + remaining + 'ms linear';
bar.style.transform = 'scaleX(0)';
});
}
card.addEventListener('mouseenter', pauseTimer);
card.addEventListener('mouseleave', resumeTimer);
function getScaleX(el) {
var transform = getComputedStyle(el).transform;
if (transform === 'none') {
return 1;
}
var match = transform.match(/matrix\\(([^)]+)\\)/);
if (!match) {
return 1;
}
return parseFloat(match[1].split(',')[0]) || 0;
}
function dismiss() {
if (dismissed) {
return;
}
dismissed = true;
clearTimeout(hideTimer);
card.classList.remove('vp-show');
setTimeout(function () {
if (wrap.parentNode) {
wrap.parentNode.removeChild(wrap);
}
}, 400);
}
function escapeHtml(str) {
if (str === null || typeof str === 'undefined') {
return '';
}
return String(str).replace(/[&<>"']/g, function (m) {
return {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}[m];
});
}
});
})();
JS;
}
--- Snippet #6: bala ---
Active: YES | Scope: global
Code:
/* =========================
1. ADMIN SETTINGS PAGE
========================= */
add_action('admin_menu', function () {
add_menu_page(
'Top Bar Settings',
'Top Bar',
'manage_options',
'al-topbar-settings',
'al_topbar_settings_page',
'dashicons-megaphone',
80
);
});
function al_topbar_settings_page() {
if (isset($_POST['al_topbar_save'])) {
update_option('al_topbar_messages', sanitize_textarea_field($_POST['al_topbar_messages']));
echo '';
}
$messages = get_option('al_topbar_messages', "🔥 تخفیف ویژه امروز\n🚀 ارسال سریع\n💎 کیفیت حرفهای");
?>
table_name = $wpdb->prefix . 'phone_lead_snippet_leads';
// ایجاد جدول پایگاهداده در اولین اجرا
if ( is_admin() ) {
$this->maybe_create_table();
}
// تزریق مستقیم و خودکار پاپآپ به انتهای تمام صفحات سایت
add_action( 'wp_footer', array( $this, 'inject_popup_to_footer' ) );
// کدهای CSS و JS
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
// هندل کردن ثبت AJAX فرم
add_action( 'wp_ajax_pls_submit_lead', array( $this, 'submit_lead' ) );
add_action( 'wp_ajax_nopriv_pls_submit_lead', array( $this, 'submit_lead' ) );
// پنل مدیریت
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
add_action( 'admin_post_pls_export_csv', array( $this, 'export_csv' ) );
add_action( 'admin_post_pls_delete_lead', array( $this, 'delete_lead' ) );
}
private function maybe_create_table() {
global $wpdb;
if ( $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" ) != $this->table_name ) {
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE {$this->table_name} (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
phone VARCHAR(255) NOT NULL,
page_url TEXT NULL,
user_ip VARCHAR(100) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
}
}
public function enqueue_assets() {
wp_register_style( 'pls-style', false );
wp_enqueue_style( 'pls-style' );
// استایلهای پاپآپ
$css = "
.plp-overlay{
position:fixed;
inset:0;
background:rgba(15,23,42,.5);
backdrop-filter:blur(4px);
z-index:999999;
display:none;
align-items:center;
justify-content:center;
padding:16px;
}
.plp-overlay.plp-open{
display:flex;
}
.plp-modal{
width:100%;
max-width:400px;
background:#fff;
border-radius:20px;
overflow:hidden;
box-shadow:0 30px 80px rgba(2,6,23,.22);
transform:translateY(10px) scale(.98);
opacity:0;
transition:all .25s ease;
direction:rtl;
position:relative;
}
.plp-overlay.plp-open .plp-modal{
transform:translateY(0) scale(1);
opacity:1;
}
.plp-top{
padding:26px 24px 20px;
background:linear-gradient(135deg,#1e293b,#0f172a);
color:#fff;
position:relative;
}
.plp-badge{
display:inline-block;
font-size:11px;
font-weight:700;
background:rgba(255,255,255,.12);
border:1px solid rgba(255,255,255,.18);
border-radius:999px;
padding:4px 10px;
margin-bottom:12px;
color: #38bdf8;
}
.plp-title{
margin:0 0 8px;
font-size:20px;
line-height:1.5;
font-weight:800;
color:#fff;
}
.plp-desc{
margin:0;
font-size:13px;
line-height:1.8;
color:rgba(255,255,255,.85);
}
.plp-close{
position:absolute;
top:16px;
left:16px;
width:32px;
height:32px;
border:none;
border-radius:50%;
background:rgba(255,255,255,.1);
color:#fff;
font-size:22px;
cursor:pointer;
display:flex;
align-items:center;
justify-content:center;
line-height: 1;
transition: background .2s;
}
.plp-close:hover{
background:rgba(255,255,255,.2);
}
.plp-body{
padding:22px;
background: #fff;
}
.plp-field{
display:block;
width:100%;
height:50px;
border:1px solid #e2e8f0;
border-radius:12px;
padding:0 16px;
font-size:14px;
background:#f8fafc;
box-sizing:border-box;
outline:none;
transition:border-color .2s ease, box-shadow .2s ease;
text-align: center;
}
.plp-field:focus{
border-color:#0f172a;
box-shadow:0 0 0 4px rgba(15,23,42,.08);
background:#fff;
}
.plp-submit{
width:100%;
height:50px;
margin-top:12px;
border:none;
border-radius:12px;
background:linear-gradient(135deg,#0f172a,#1e293b);
color:#fff;
font-size:15px;
font-weight:800;
cursor:pointer;
transition:transform .15s ease, opacity .15s ease;
}
.plp-submit:hover{
transform:translateY(-1px);
opacity: 0.95;
}
.plp-submit:disabled{
opacity:.7;
cursor:not-allowed;
transform:none;
}
.plp-note{
margin-top:12px;
font-size:11px;
color:#64748b;
text-align:center;
line-height:1.8;
}
.plp-message{
display:none;
margin-top:12px;
padding:11px 12px;
border-radius:10px;
font-size:13px;
line-height:1.8;
text-align: center;
}
.plp-message.plp-success{
display:block;
background:#ecfdf5;
color:#166534;
border:1px solid #bbf7d0;
}
.plp-message.plp-error{
display:block;
background:#fef2f2;
color:#991b1b;
border:1px solid #fecaca;
}
@media (max-width:480px){
.plp-top{
padding:20px 18px 16px;
}
.plp-title{
font-size:18px;
}
.plp-body{
padding:18px;
}
}";
wp_add_inline_style( 'pls-style', $css );
wp_register_script( 'pls-script', false, array(), null, true );
wp_enqueue_script( 'pls-script' );
wp_localize_script(
'pls-script',
'PLP_DATA',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'pls_nonce' ),
)
);
// جاوااسکریپت با کوکی ۳۰ روزه
$js = "
document.addEventListener('DOMContentLoaded', function () {
function setPLPCookie(name, value, days) {
var expires = '';
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = '; expires=' + date.toUTCString();
}
document.cookie = name + '=' + (value || '') + expires + '; path=/';
}
function getPLPCookie(name) {
var nameEQ = name + '=';
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// بستن با پسزمینه
document.querySelectorAll('.plp-overlay').forEach(function (overlay) {
overlay.addEventListener('click', function (e) {
if (e.target === overlay) {
overlay.classList.remove('plp-open');
setPLPCookie('plp_dismissed', '1', 30);
}
});
});
// بستن با ضربدر
document.querySelectorAll('[data-plp-close]').forEach(function (button) {
button.addEventListener('click', function () {
var overlay = button.closest('.plp-overlay');
if (overlay) {
overlay.classList.remove('plp-open');
setPLPCookie('plp_dismissed', '1', 30);
}
});
});
// بستن با Esc
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') {
document.querySelectorAll('.plp-overlay.plp-open').forEach(function (overlay) {
overlay.classList.remove('plp-open');
setPLPCookie('plp_dismissed', '1', 30);
});
}
});
// ارسال فرم
document.querySelectorAll('.plp-form').forEach(function (form) {
form.addEventListener('submit', function (e) {
e.preventDefault();
var phone = form.querySelector('.plp-phone');
var button = form.querySelector('.plp-submit');
var message = form.querySelector('.plp-message');
message.className = 'plp-message';
message.style.display = 'none';
message.textContent = '';
if (!phone.value.trim()) {
message.className = 'plp-message plp-error';
message.textContent = 'لطفاً شماره تماس را وارد کنید.';
message.style.display = 'block';
phone.focus();
return;
}
button.disabled = true;
button.textContent = 'در حال ارسال...';
var formData = new FormData();
formData.append('action', 'pls_submit_lead');
formData.append('nonce', PLP_DATA.nonce);
formData.append('phone', phone.value.trim());
formData.append('page_url', window.location.href);
fetch(PLP_DATA.ajax_url, {
method: 'POST',
body: formData
})
.then(function (response) {
return response.json();
})
.then(function (response) {
if (response.success) {
message.className = 'plp-message plp-success';
message.textContent = response.data.message;
message.style.display = 'block';
form.reset();
setPLPCookie('plp_dismissed', '1', 30);
setTimeout(function () {
var overlay = form.closest('.plp-overlay');
if (overlay) overlay.classList.remove('plp-open');
}, 1500);
} else {
message.className = 'plp-message plp-error';
message.textContent = response.data.message || 'خطا در ثبت اطلاعات.';
message.style.display = 'block';
}
})
.catch(function () {
message.className = 'plp-message plp-error';
message.textContent = 'خطا در ارتباط با سرور.';
message.style.display = 'block';
})
.finally(function () {
button.disabled = false;
button.textContent = 'ثبت شماره تماس';
});
});
});
// باز شدن خودکار بعد از ۴ ثانیه
var autoOverlay = document.getElementById('plp-auto-popup');
if (autoOverlay && !getPLPCookie('plp_dismissed')) {
setTimeout(function () {
if (!getPLPCookie('plp_dismissed')) {
autoOverlay.classList.add('plp-open');
}
}, 4000);
}
});";
wp_add_inline_script( 'pls-script', $js );
}
// تزریق مستقیم کد HTML به فوتر
public function inject_popup_to_footer() {
// برای جلوگیری از باز شدن پاپآپ در صفحات ادمین
if ( is_admin() ) {
return;
}
?>
'شماره تماس را وارد کنید.' ) );
}
$inserted = $wpdb->insert(
$this->table_name,
array(
'phone' => $phone,
'page_url' => $page_url,
'user_ip' => $user_ip,
'created_at' => current_time( 'mysql' ),
),
array( '%s', '%s', '%s', '%s' )
);
if ( false === $inserted ) {
wp_send_json_error( array( 'message' => 'خطایی رخ داد، مجدداً تلاش کنید.' ) );
}
wp_send_json_success( array( 'message' => 'شماره شما با موفقیت ثبت شد! به زودی خبرتان میکنیم.' ) );
}
public function admin_menu() {
add_menu_page(
'شمارههای دریافتی',
'شمارههای دریافتی',
'manage_options',
'plp-phone-leads',
array( $this, 'admin_page' ),
'dashicons-phone',
26
);
}
public function admin_page() {
global $wpdb;
$per_page = 20;
$paged = isset( $_GET['paged'] ) ? max( 1, (int) $_GET['paged'] ) : 1;
$offset = ( $paged - 1 ) * $per_page;
$month = isset( $_GET['filter_month'] ) ? sanitize_text_field( wp_unslash( $_GET['filter_month'] ) ) : '';
$where = '1=1';
$params = array();
if ( ! empty( $month ) && preg_match( '/^\d{4}-\d{2}$/', $month ) ) {
$where .= ' AND DATE_FORMAT(created_at, %s) = %s';
$params[] = '%Y-%m';
$params[] = $month;
}
$count_sql = "SELECT COUNT(*) FROM {$this->table_name} WHERE {$where}";
if ( ! empty( $params ) ) {
$total_items = (int) $wpdb->get_var( $wpdb->prepare( $count_sql, ...$params ) );
} else {
$total_items = (int) $wpdb->get_var( $count_sql );
}
$total_pages = max( 1, (int) ceil( $total_items / $per_page ) );
$data_sql = "SELECT * FROM {$this->table_name} WHERE {$where} ORDER BY id DESC LIMIT %d OFFSET %d";
$data_params = $params;
$data_params[] = $per_page;
$data_params[] = $offset;
if ( ! empty( $data_params ) ) {
$rows = $wpdb->get_results( $wpdb->prepare( $data_sql, ...$data_params ) );
} else {
$rows = $wpdb->get_results( $data_sql );
}
$months = $wpdb->get_col(
"SELECT DISTINCT DATE_FORMAT(created_at, '%Y-%m') AS month_val
FROM {$this->table_name}
ORDER BY month_val DESC"
);
$export_url = add_query_arg(
array(
'action' => 'pls_export_csv',
'filter_month' => $month,
),
admin_url( 'admin-post.php' )
);
?>
لیست شمارههای ثبتشده در پاپآپ
تعداد کل: شماره
| ماه انتخابشده:
| شناسه |
شماره تماس |
صفحه ثبت درخواست |
IP کاربر |
تاریخ ثبت |
عملیات |
| id; ?> |
phone ); ?> |
page_url ) ) : ?>
page_url ); ?>
|
user_ip ); ?> |
created_at ); ?> |
حذف شماره
|
| هیچ شمارهای برای این فیلتر پیدا نشد. |
1 ) {
echo '
';
echo paginate_links(
array(
'base' => add_query_arg(
array(
'page' => 'plp-phone-leads',
'filter_month' => $month,
'paged' => '%#%',
),
admin_url( 'admin.php' )
),
'format' => '',
'current' => $paged,
'total' => $total_pages,
'prev_text' => 'قبلی',
'next_text' => 'بعدی',
)
);
echo '
';
}
?>
table_name} WHERE {$where} ORDER BY id DESC";
if ( ! empty( $params ) ) {
$rows = $wpdb->get_results( $wpdb->prepare( $sql, ...$params ), ARRAY_A );
} else {
$rows = $wpdb->get_results( $sql, ARRAY_A );
}
$filename = 'zerocalorie-leads';
if ( $month ) {
$filename .= '-' . $month;
} else {
$filename .= '-' . date( 'Y-m-d' );
}
header( 'Content-Type: text/csv; charset=utf-8' );
header( 'Content-Disposition: attachment; filename=' . $filename . '.csv' );
$output = fopen( 'php://output', 'w' );
fwrite( $output, "\xEF\xBB\xBF" );
fputcsv( $output, array( 'ردیف', 'شماره تماس', 'صفحه ثبت', 'IP کاربر', 'تاریخ ثبت' ) );
foreach ( $rows as $row ) {
fputcsv(
$output,
array(
$row['id'],
$row['phone'],
$row['page_url'],
$row['user_ip'],
$row['created_at'],
)
);
}
fclose( $output );
exit;
}
public function delete_lead() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'شما دسترسی کافی ندارید.' );
}
$id = isset( $_GET['id'] ) ? (int) $_GET['id'] : 0;
if ( ! $id || ! check_admin_referer( 'pls_delete_lead_' . $id ) ) {
wp_die( 'درخواست نامعتبر است.' );
}
global $wpdb;
$wpdb->delete( $this->table_name, array( 'id' => $id ), array( '%d' ) );
wp_safe_redirect( admin_url( 'admin.php?page=plp-phone-leads' ) );
exit;
}
}
new Phone_Lead_Snippet_Manager();
--- Snippet #8: foot ---
Active: YES | Scope: global
Code:
/**
* Title: Phone Lead Footer Shortcode Form
* Description: فرم ساده دریافت شماره با شورتکد و ذخیره در همان جدول پاپآپ قبلی
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Phone_Lead_Footer_Shortcode_Form {
private $table_name;
public function __construct() {
global $wpdb;
$this->table_name = $wpdb->prefix . 'phone_lead_snippet_leads';
add_shortcode( 'pls_footer_lead_form', array( $this, 'render_shortcode' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
add_action( 'wp_ajax_pls_footer_submit_lead', array( $this, 'submit_lead' ) );
add_action( 'wp_ajax_nopriv_pls_footer_submit_lead', array( $this, 'submit_lead' ) );
}
public function enqueue_assets() {
wp_register_style( 'pls-footer-form-style', false );
wp_enqueue_style( 'pls-footer-form-style' );
$css = "
.pls-footer-lead-wrap{
width:100%;
max-width:420px;
direction:rtl;
}
.pls-footer-lead-form{
display:flex;
gap:10px;
align-items:center;
flex-wrap:wrap;
}
.pls-footer-lead-input{
flex:1 1 220px;
min-width:220px;
height:44px;
padding:0 14px;
border:1px solid #d1d5db;
border-radius:8px;
background:#fff;
color:#111827;
box-sizing:border-box;
}
.pls-footer-lead-submit{
height:44px;
padding:0 16px;
border:none;
border-radius:8px;
background:#111827;
color:#fff;
cursor:pointer;
white-space:nowrap;
}
.pls-footer-lead-submit:disabled{
opacity:.7;
cursor:not-allowed;
}
.pls-footer-lead-message{
width:100%;
margin-top:10px;
font-size:13px;
line-height:1.8;
display:none;
}
.pls-footer-lead-message.is-success{
display:block;
color:#166534;
}
.pls-footer-lead-message.is-error{
display:block;
color:#b91c1c;
}";
wp_add_inline_style( 'pls-footer-form-style', $css );
wp_register_script( 'pls-footer-form-script', false, array(), null, true );
wp_enqueue_script( 'pls-footer-form-script' );
wp_localize_script(
'pls-footer-form-script',
'PLS_FOOTER_FORM_DATA',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'pls_footer_form_nonce' ),
)
);
$js = "
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('.pls-footer-lead-form').forEach(function (form) {
form.addEventListener('submit', function (e) {
e.preventDefault();
var phoneInput = form.querySelector('.pls-footer-lead-input');
var submitBtn = form.querySelector('.pls-footer-lead-submit');
var messageBox = form.parentNode.querySelector('.pls-footer-lead-message');
if (!phoneInput || !submitBtn || !messageBox) {
return;
}
messageBox.className = 'pls-footer-lead-message';
messageBox.style.display = 'none';
messageBox.textContent = '';
if (!phoneInput.value.trim()) {
messageBox.className = 'pls-footer-lead-message is-error';
messageBox.textContent = 'لطفا شماره خود را وارد کنید.';
messageBox.style.display = 'block';
phoneInput.focus();
return;
}
submitBtn.disabled = true;
submitBtn.textContent = 'در حال ثبت...';
var formData = new FormData();
formData.append('action', 'pls_footer_submit_lead');
formData.append('nonce', PLS_FOOTER_FORM_DATA.nonce);
formData.append('phone', phoneInput.value.trim());
formData.append('page_url', window.location.href);
fetch(PLS_FOOTER_FORM_DATA.ajax_url, {
method: 'POST',
body: formData
})
.then(function (response) {
return response.json();
})
.then(function (response) {
if (response.success) {
messageBox.className = 'pls-footer-lead-message is-success';
messageBox.textContent = response.data.message;
messageBox.style.display = 'block';
form.reset();
} else {
messageBox.className = 'pls-footer-lead-message is-error';
messageBox.textContent = response.data.message || 'خطا در ثبت اطلاعات.';
messageBox.style.display = 'block';
}
})
.catch(function () {
messageBox.className = 'pls-footer-lead-message is-error';
messageBox.textContent = 'خطا در ارتباط با سرور.';
messageBox.style.display = 'block';
})
.finally(function () {
submitBtn.disabled = false;
submitBtn.textContent = 'ثبت شماره';
});
});
});
});";
wp_add_inline_script( 'pls-footer-form-script', $js );
}
public function render_shortcode() {
ob_start();
?>
'شماره تماس را وارد کنید.' ) );
}
$inserted = $wpdb->insert(
$this->table_name,
array(
'phone' => $phone,
'page_url' => $page_url,
'user_ip' => $user_ip,
'created_at' => current_time( 'mysql' ),
),
array( '%s', '%s', '%s', '%s' )
);
if ( false === $inserted ) {
wp_send_json_error( array( 'message' => 'خطایی رخ داد، دوباره تلاش کنید.' ) );
}
wp_send_json_success( array( 'message' => 'شماره با موفقیت ثبت شد.' ) );
}
}
new Phone_Lead_Footer_Shortcode_Form();
--- Snippet #9: off ---
Active: YES | Scope: global
Code:
/**
* Title: Zero Calorie SMS Coupons (Fixed Version)
* Description: Independent SMS coupon sender and conversion report for Zero Calories.
* Version: 1.2.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class ZC_SMS_Coupon_System {
private $leads_table;
private $logs_table;
private $ippanel_username = 'u09128343711';
private $ippanel_password = 'Software$123123';
private $sender_number = '+983000505';
private $pattern_code = 'gdqyv37zj3evc2u';
public function __construct() {
global $wpdb;
// اصلاح نام جدول لید به جدول واقعی شما
$this->leads_table = $wpdb->prefix . 'phone_lead_snippet_leads';
$this->logs_table = $wpdb->prefix . 'zc_sms_coupons';
if ( is_admin() ) {
$this->maybe_create_table();
add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
}
// هوک شدن به اکشن فرم لید
add_action( 'wp_ajax_lpw_submit_lead', array( $this, 'capture_lead_request' ), 1 );
add_action( 'wp_ajax_nopriv_lpw_submit_lead', array( $this, 'capture_lead_request' ), 1 );
add_action( 'woocommerce_order_status_processing', array( $this, 'track_coupon_usage' ), 10, 1 );
add_action( 'woocommerce_order_status_completed', array( $this, 'track_coupon_usage' ), 10, 1 );
}
public function maybe_create_table() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $this->logs_table;
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
$sql = "CREATE TABLE {$table_name} (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
lead_id BIGINT UNSIGNED DEFAULT NULL,
email VARCHAR(190) DEFAULT '',
phone VARCHAR(20) NOT NULL,
coupon_code VARCHAR(32) NOT NULL,
coupon_id BIGINT UNSIGNED NOT NULL,
sms_status VARCHAR(20) NOT NULL DEFAULT 'pending',
sms_response TEXT DEFAULT NULL,
is_used TINYINT(1) NOT NULL DEFAULT 0,
order_id BIGINT UNSIGNED DEFAULT NULL,
created_at DATETIME NOT NULL,
sent_at DATETIME DEFAULT NULL,
used_at DATETIME DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY uniq_phone (phone),
UNIQUE KEY uniq_coupon_code (coupon_code),
KEY lead_id (lead_id),
KEY sms_status (sms_status),
KEY is_used (is_used)
) {$charset_collate};";
dbDelta( $sql );
}
public function capture_lead_request() {
// در جدول جدید شما ایمیل اجباری نیست، پس فقط شماره را چک میکنیم
$phone = isset( $_POST['phone'] ) ? $this->sanitize_iranian_phone( wp_unslash( $_POST['phone'] ) ) : '';
if ( ! $phone ) {
return;
}
// ثبت اجرای تابع بعد از اتمام ذخیرهسازی لید توسط افزونه اصلی
register_shutdown_function( array( $this, 'handle_after_lead_saved' ), $phone );
}
public function handle_after_lead_saved( $phone ) {
if ( ! $phone || ! class_exists( 'WooCommerce' ) ) {
return;
}
global $wpdb;
// چک کردن تکراری نبودن در جدول لاگ خودمان
$already_sent = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$this->logs_table} WHERE phone = %s LIMIT 1", $phone ) );
if ( $already_sent ) {
return;
}
// جستجوی آخرین رکورد در جدول لیدهای واقعی شما
$lead = $wpdb->get_row(
$wpdb->prepare(
"SELECT id, phone FROM {$this->leads_table} WHERE phone = %s ORDER BY id DESC LIMIT 1",
$phone
)
);
if ( ! $lead ) {
return;
}
$coupon = $this->create_woocommerce_coupon();
if ( ! $coupon ) {
return;
}
$inserted = $wpdb->insert(
$this->logs_table,
array(
'lead_id' => (int) $lead->id,
'phone' => $phone,
'coupon_code' => $coupon['code'],
'coupon_id' => $coupon['id'],
'sms_status' => 'pending',
'created_at' => current_time( 'mysql' ),
),
array( '%d', '%s', '%s', '%d', '%s', '%s' )
);
if ( ! $inserted ) {
return;
}
$log_id = (int) $wpdb->insert_id;
$sms_result = $this->send_pattern_sms( $phone, $coupon['code'] );
$wpdb->update(
$this->logs_table,
array(
'sms_status' => $sms_result['success'] ? 'sent' : 'failed',
'sms_response' => $sms_result['message'],
'sent_at' => current_time( 'mysql' ),
),
array( 'id' => $log_id ),
array( '%s', '%s', '%s' ),
array( '%d' )
);
}
private function sanitize_iranian_phone( $phone ) {
$phone = trim( (string) $phone );
$phone = str_replace( array( ' ', '-', '(', ')' ), '', $phone );
if ( strpos( $phone, '+98' ) === 0 ) { $phone = '0' . substr( $phone, 3 ); }
elseif ( strpos( $phone, '0098' ) === 0 ) { $phone = '0' . substr( $phone, 4 ); }
elseif ( strpos( $phone, '98' ) === 0 && strlen( $phone ) === 12 ) { $phone = '0' . substr( $phone, 2 ); }
$phone = preg_replace( '/[^0-9]/', '', $phone );
if ( preg_match( '/^09[0-9]{9}$/', $phone ) ) { return $phone; }
return '';
}
private function create_woocommerce_coupon() {
$attempts = 0;
while ( $attempts < 10 ) {
$code = $this->generate_coupon_code( 5 );
if ( ! wc_get_coupon_id_by_code( $code ) ) {
$coupon_id = wp_insert_post( array(
'post_title' => $code,
'post_status' => 'publish',
'post_type' => 'shop_coupon',
'post_author' => 1,
) );
if ( is_wp_error( $coupon_id ) || ! $coupon_id ) return false;
$expiry_timestamp = current_time( 'timestamp' ) + ( 2 * HOUR_IN_SECONDS );
update_post_meta( $coupon_id, 'discount_type', 'fixed_cart' );
update_post_meta( $coupon_id, 'coupon_amount', '50000' );
update_post_meta( $coupon_id, 'individual_use', 'yes' );
update_post_meta( $coupon_id, 'minimum_amount', '2500000' );
update_post_meta( $coupon_id, 'usage_limit', '1' );
update_post_meta( $coupon_id, 'date_expires', $expiry_timestamp );
return array( 'id' => (int) $coupon_id, 'code' => $code );
}
$attempts++;
}
return false;
}
private function generate_coupon_code( $length = 5 ) {
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$code = 'ZC-'; // پیشوند برای شناسایی راحتتر
for ( $i = 0; $i < $length; $i++ ) { $code .= $chars[ wp_rand( 0, strlen( $chars ) - 1 ) ]; }
return $code;
}
private function get_ippanel_token() {
$response = wp_remote_post( 'https://edge.ippanel.com/v1/auth/login', array(
'timeout' => 20,
'headers' => array( 'Content-Type' => 'application/json' ),
'body' => wp_json_encode( array( 'username' => $this->ippanel_username, 'password' => $this->ippanel_password ) ),
) );
if ( is_wp_error( $response ) ) return false;
$body = json_decode( wp_remote_retrieve_body( $response ), true );
return ! empty( $body['data']['token'] ) ? $body['data']['token'] : false;
}
private function send_pattern_sms( $phone, $coupon_code ) {
$token = $this->get_ippanel_token();
if ( ! $token ) return array( 'success' => false, 'message' => 'IPPANEL login failed' );
$response = wp_remote_post( 'https://edge.ippanel.com/v1/messages/patterns/send', array(
'timeout' => 20,
'headers' => array( 'Authorization' => $token, 'Content-Type' => 'application/json' ),
'body' => wp_json_encode( array(
'pattern_code' => $this->pattern_code,
'originator' => $this->sender_number,
'recipient' => $phone,
'values' => array( 'code' => $coupon_code ),
) ),
) );
if ( is_wp_error( $response ) ) return array( 'success' => false, 'message' => 'Network error' );
$http_code = (int) wp_remote_retrieve_response_code( $response );
return ( $http_code >= 200 && $http_code < 300 ) ? array( 'success' => true, 'message' => 'Sent' ) : array( 'success' => false, 'message' => 'Send failed' );
}
public function track_coupon_usage( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$codes = $order->get_coupon_codes();
if ( empty( $codes ) ) return;
global $wpdb;
foreach ( $codes as $code ) {
$wpdb->update( $this->logs_table, array( 'is_used' => 1, 'order_id' => $order_id, 'used_at' => current_time( 'mysql' ) ), array( 'coupon_code' => strtoupper( $code ) ), array( '%d', '%d', '%s' ), array( '%s' ) );
}
}
public function add_admin_menu() {
add_menu_page( 'گزارش پیامکهای تخفیف', 'گزارش پیامک تخفیف', 'manage_options', 'zc-sms-reports', array( $this, 'render_reports_page' ), 'dashicons-chart-line', 56 );
}
public function render_reports_page() {
global $wpdb;
$total_sent = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE sms_status = 'sent'" );
$total_failed = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE sms_status = 'failed'" );
$total_used = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE is_used = 1" );
$records = $wpdb->get_results( "SELECT phone, coupon_code, sms_status, sms_response, is_used, created_at FROM {$this->logs_table} ORDER BY id DESC LIMIT 50" );
?>
گزارش پیامکهای تخفیف
ارسال موفق:
ارسال ناموفق:
استفاده شده:
| شماره | کد تخفیف | وضعیت | استفاده | تاریخ | پاسخ سرور |
| phone; ?> | coupon_code; ?> | sms_status; ?> | is_used ? 'بله' : 'خیر'; ?> | created_at; ?> | sms_response; ?> |
get_id();
?>