مقدمه
وردپرس به عنوان یکی از محبوبترین سیستمهای مدیریت محتوا، امکانات گستردهای را در اختیار توسعهدهندگان قرار میدهد. یکی از نیازهای اساسی بسیاری از وبسایتها، سیستم اعلانات پیشرفته است که میتواند برای نمایش پیامهای مهم، تبلیغات، اطلاعیهها و سایر محتوای ضروری مورد استفاده قرار گیرد. در این مقاله به بررسی روشهای توسعه یک سیستم اعلانات پیشرفته برای وردپرس میپردازیم.
نیازمندیهای سیستم اعلانات پیشرفته
۱. ویژگیهای کلیدی
- پشتیبانی از انواع محتوا (متنی، HTML، تصاویر، ویدئو)
- زمانبندی نمایش (تاریخ شروع و پایان)
- هدفگیری پیشرفته (صفحات خاص، دستهبندیها، کاربران خاص)
- طرحبندیهای قابل تنظیم (موقعیتهای مختلف در صفحه، استایلهای متفاوت)
- آمار و گزارشگیری (تعداد نمایش، کلیکها، نرخ تبدیل)
- پشتیبانی از چندزبانی
- ریسپانسیو بودن (سازگاری با دستگاههای مختلف)
۲. فناوریهای مورد نیاز
- PHP (برای توسعه پلاگین وردپرس)
- JavaScript/jQuery (برای تعاملات front-end)
- CSS (برای استایلدهی)
- پایگاه داده MySQL (برای ذخیرهسازی اطلاعات)
- APIهای وردپرس (برای یکپارچهسازی با هسته وردپرس)
مراحل توسعه سیستم اعلانات پیشرفته
۱. طراحی معماری سیستم
graph TD
A[پنل مدیریت] --> B[ذخیرهسازی در دیتابیس]
B --> C[نمایش در front-end]
C --> D[ردیابی آمار]
D --> A۲. ایجاد پلاگین پایه
/*
Plugin Name: سیستم اعلانات پیشرفته
Description: یک سیستم اعلانات پیشرفته برای وردپرس
Version: 1.0
Author: نام شما
*/
if (!defined('ABSPATH')) {
exit;
}۳. ایجاد جداول دیتابیس
function aan_create_database_tables() {
global $wpdb;
$table_name = $wpdb->prefix . 'advanced_alerts';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
title varchar(255) NOT NULL,
content text NOT NULL,
alert_type varchar(50) NOT NULL,
start_date datetime NOT NULL,
end_date datetime NOT NULL,
pages text,
user_roles text,
display_count int(11) DEFAULT 0,
click_count int(11) DEFAULT 0,
status tinyint(1) DEFAULT 1,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'aan_create_database_tables');۴. ایجاد منوی مدیریت
function aan_admin_menu() {
add_menu_page(
'اعلانات پیشرفته',
'اعلانات',
'manage_options',
'advanced-alerts',
'aan_admin_page',
'dashicons-megaphone',
30
);
add_submenu_page(
'advanced-alerts',
'اعلانات جدید',
'افزودن جدید',
'manage_options',
'advanced-alerts-new',
'aan_admin_new_page'
);
add_submenu_page(
'advanced-alerts',
'آمار اعلانات',
'آمار',
'manage_options',
'advanced-alerts-stats',
'aan_admin_stats_page'
);
}
add_action('admin_menu', 'aan_admin_menu');۵. ایجاد فرم مدیریت اعلانات
function aan_admin_page() {
// کدهای نمایش لیست اعلانات
include plugin_dir_path(__FILE__) . 'templates/admin-list.php';
}
function aan_admin_new_page() {
// کدهای فرم ایجاد اعلان جدید
include plugin_dir_path(__FILE__) . 'templates/admin-new.php';
}۶. نمایش اعلانات در front-end
function aan_display_alerts() {
global $wpdb;
$table_name = $wpdb->prefix . 'advanced_alerts';
$current_page_id = get_the_ID();
$current_user = wp_get_current_user();
$current_user_roles = $current_user->roles;
$query = "SELECT * FROM $table_name
WHERE status = 1
AND start_date <= NOW()
AND end_date >= NOW()";
$alerts = $wpdb->get_results($query);
foreach ($alerts as $alert) {
// بررسی شرایط نمایش
$display = true;
// بررسی صفحات
if (!empty($alert->pages)) {
$pages = unserialize($alert->pages);
if (!in_array($current_page_id, $pages)) {
$display = false;
}
}
// بررسی نقش کاربر
if (!empty($alert->user_roles)) {
$roles = unserialize($alert->user_roles);
$intersect = array_intersect($current_user_roles, $roles);
if (empty($intersect)) {
$display = false;
}
}
if ($display) {
// افزایش شمارنده نمایش
$wpdb->update(
$table_name,
array('display_count' => $alert->display_count + 1),
array('id' => $alert->id)
);
// نمایش اعلان
echo '<div class="advanced-alert" data-alert-id="' . $alert->id . '">';
echo apply_filters('the_content', $alert->content);
echo '</div>';
}
}
}
add_action('wp_footer', 'aan_display_alerts');۷. افزودن استایلها و اسکریپتها
function aan_enqueue_scripts() {
// استایلهای CSS
wp_enqueue_style(
'advanced-alerts-css',
plugin_dir_url(__FILE__) . 'assets/css/style.css',
array(),
'1.0'
);
// اسکریپتهای JavaScript
wp_enqueue_script(
'advanced-alerts-js',
plugin_dir_url(__FILE__) . 'assets/js/script.js',
array('jquery'),
'1.0',
true
);
// انتقال دادهها به JavaScript
wp_localize_script(
'advanced-alerts-js',
'aan_ajax_object',
array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aan_nonce')
)
);
}
add_action('wp_enqueue_scripts', 'aan_enqueue_scripts');۸. پیادهسازی AJAX برای ردیابی کلیکها
jQuery(document).ready(function($) {
$(document).on('click', '.advanced-alert', function() {
var alert_id = $(this).data('alert-id');
$.ajax({
url: aan_ajax_object.ajax_url,
type: 'POST',
data: {
action: 'aan_track_click',
alert_id: alert_id,
nonce: aan_ajax_object.nonce
},
success: function(response) {
console.log('Click tracked');
}
});
});
});function aan_track_click() {
check_ajax_referer('aan_nonce', 'nonce');
if (isset($_POST['alert_id'])) {
global $wpdb;
$table_name = $wpdb->prefix . 'advanced_alerts';
$alert_id = intval($_POST['alert_id']);
$wpdb->query(
$wpdb->prepare(
"UPDATE $table_name SET click_count = click_count + 1 WHERE id = %d",
$alert_id
)
);
}
wp_die();
}
add_action('wp_ajax_aan_track_click', 'aan_track_click');
add_action('wp_ajax_nopriv_aan_track_click', 'aan_track_click');ویژگیهای پیشرفته برای توسعه بیشتر
۱. هدفگیری پیشرفته
- موقعیت جغرافیایی: نمایش اعلانات بر اساس موقعیت کاربر
- دستگاه: نمایش متفاوت برای موبایل و دسکتاپ
- رفتار کاربر: نمایش اعلانات بر اساس صفحات بازدید شده قبلی
۲. A/B Testing
- ایجاد چندین نسخه از یک اعلان
- نمایش تصادفی به کاربران مختلف
- مقایسه عملکرد نسخههای مختلف
۳. یکپارچهسازی با ابزارهای تحلیلی
- Google Analytics
- Facebook Pixel
- ابزارهای تحلیل داخلی
۴. پشتیبانی از کش
- استفاده از WP Cache برای بهبود عملکرد
- پیادهسازی کش اختصاصی برای اعلانات
امنیت سیستم
۱. اعتبارسنجی دادههای ورودی
function aan_save_alert($data) {
global $wpdb;
$table_name = $wpdb->prefix . 'advanced_alerts';
$clean_data = array(
'title' => sanitize_text_field($data['title']),
'content' => wp_kses_post($data['content']),
'alert_type' => sanitize_key($data['alert_type']),
'start_date' => sanitize_text_field($data['start_date']),
'end_date' => sanitize_text_field($data['end_date']),
'pages' => isset($data['pages']) ? array_map('intval', $data['pages']) : array(),
'user_roles' => isset($data['user_roles']) ? array_map('sanitize_key', $data['user_roles']) : array(),
'status' => isset($data['status']) ? 1 : 0
);
if (isset($data['id']) && is_numeric($data['id'])) {
// بهروزرسانی اعلان موجود
$wpdb->update(
$table_name,
$clean_data,
array('id' => intval($data['id']))
);
} else {
// ایجاد اعلان جدید
$wpdb->insert($table_name, $clean_data);
}
}۲. بررسی قابلیتهای کاربر
if (!current_user_can('manage_options')) {
wp_die(__('شما مجوز دسترسی به این صفحه را ندارید.'));
}۳. استفاده از nonce برای فرمها
wp_nonce_field('aan_save_alert_nonce', 'aan_nonce');بهینهسازی عملکرد
۱. استفاده از کوئریهای بهینه
function aan_get_active_alerts() {
global $wpdb;
$table_name = $wpdb->prefix . 'advanced_alerts';
return $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM $table_name
WHERE status = 1
AND start_date <= %s
AND end_date >= %s",
current_time('mysql'),
current_time('mysql')
)
);
}۲. محدود کردن تعداد اعلانات همزمان
function aan_display_alerts() {
$alerts = aan_get_active_alerts();
if (count($alerts) > 3) {
$alerts = array_slice($alerts, 0, 3);
}
// بقیه کدها
}۳. استفاده از ترانزینتها برای کش کردن
function aan_get_alerts_transient() {
$alerts = get_transient('aan_active_alerts');
if (false === $alerts) {
$alerts = aan_get_active_alerts();
set_transient('aan_active_alerts', $alerts, HOUR_IN_SECONDS);
}
return $alerts;
}نتیجهگیری
توسعه یک سیستم اعلانات پیشرفته برای وردپرس نیازمند درک خوبی از معماری وردپرس، APIهای آن و اصول توسعه پلاگینهاست. سیستم طراحی شده در این مقاله میتواند به عنوان پایهای برای توسعههای بیشتر استفاده شود. با افزودن ویژگیهایی مانند هدفگیری پیشرفته، A/B testing و یکپارچهسازی با ابزارهای تحلیلی، میتوان سیستم را به ابزاری قدرتمند برای مدیریت اعلانات و تبلیغات تبدیل کرد.
همچنین توجه به اصول امنیتی و بهینهسازی عملکرد در طول توسعه ضروری است تا سیستم در عین ارائه امکانات پیشرفته، ایمن و سریع باقی بماند.