آموزش های وردپرس

در شرح پلاگین tiny mass mailer – قسمت دوم

بسم الله الرحمن الرحیم

سلام

نکته هایی از قسمت اول شرح پلاگین میلر ریز مونده بود که اینجا عرض می کنم خدمت دوستان.

خب باید دوتا آپشن به این سیستم اضافه میشد:

  • یکی اینکه آمار ایمیلهایی که باز میشه رو ثبت کنه(تعداد باز شدن ایمیل)
  • و دومی اینکه لینکهایی که باز میشه رو هم آمار بگیره(تعداد کلیک)

ثبت آمار باز کردن ایمیلها

راه حلی که برای مورد اول به ذهنم رسید استفاده از یک عکس با src خاصی بود که یک کدPHP در انتظارش بود که به محض باز شدن با پارامترهایی که بهش پاس داده میشد آمار رو ثبت و نهایتا عکس کذایی رو نشون می داد،لازم به ذکره عکس مورد نظر یک پیکسل در یک پیکسل در نظر گرفته شد تا به چشم نیاد.

خب،اول باید موقع ثبت ارسال جدید این عکس رو خودکار اضافه می کردم به انتهای متن،عکس این هست:


$txt = $txt . '<hr/><img src="'.get_bloginfo('siteurl').'/?tinymassmailer_t='.$send_id.'">';

 

پارامتر $send_id برای ثبت آمار موقع باز شدن عکس استفاده میشه،طبیعیه که پارامترهای دیگه ای هم میشد اضاف کرد.

و این هم کد منتظر عکس بالا:


$_tinymassmailer_make_tracking_transient = '_tinymassmailer_make_tracking_run_check_'.$_SERVER['REMOTE_ADDR'];

	if(isset($_GET['tinymassmailer_t'])){
		$sImage = _tinymassmailer_PATH.'css/img/live.jpg';
		if(get_transient( $_tinymassmailer_make_tracking_transient )) {		header("Content-Type: image/jpeg");	echo file_get_contents($sImage);die();	};
		set_transient( $_tinymassmailer_make_tracking_transient, 'locked_for_10_seconds', 10 );

		//update opens emails
		global $wpdb;
		$send_id =(int)($_GET['tinymassmailer_t']);
		$tiniymassm_sends =$wpdb->prefix.'tiniymassm_sends';
		$row = $wpdb->get_row("select * from $tiniymassm_sends where id=$send_id");
		if(!$row) return;

		$new_opens = (int)$row->opens;
		$new_opens += 1;
		$wpdb->update($tiniymassm_sends,
			array('opens' => $new_opens),
			array('id' => $send_id),
			array('%d'),
			array('%d')
			);			

		header("Content-Type: image/jpeg");
		echo file_get_contents($sImage);
		die();
	}

توی کد بالا بعد از گرفتن آمار عکس به خروجی فرستاده شده

توجه:توی قسمت قبل از یه فایل برای حد تداخل اجرای هم زمان استفاده کرده بودیم،به دلایلی ترجیح دادم از set_transient استفاده کنم،که ان شاءالله بعد در موردش بحث خواهیم کرد.

 

ثبت کلیکها به هنگام کلیک بر روی لینک در ایمیل

باید آمار کلیک ها رو هم در می آوردم،برای این کار به هنگام ثبت ارسال تمام لینکها رو آنا عوض کردم تا وقت کلیک به آدرس مشخض شده برن و بعد از ثبت آمار به لینک اصلی هدایت بشن.

بخوانید:  آیا وردپرس هم ویروسی می شود؟

به دلایلی برای این ویرایش از Regex استفاده نکردم،چون درست و درمون فارسی رو ساپورت نمیکنه،پس تنها راهی که به ذهنم رسید استفاده از simple_html_dom عزیز بود:


$html = str_get_html($txt);
$url = get_bloginfo('siteurl').'/?tinymassmailer_c='.$send_id.'&tmm_url=';
foreach($html->find('a') as $key => $v){
$html->find('a' , $key)->href =  $url.str_replace('"' , '' ,$html->find('a' , $key)->href);
}

$txt = $html;

اما کد PHP منتظر این لینک:


if(isset($_GET['tinymassmailer_c'])){
$url = trim($_GET['tmm_url']);
if(get_transient( $_tinymassmailer_make_tracking_transient )) { header('location:'.$url); die(); };
global $wpdb;
$send_id =(int)($_GET['tinymassmailer_c']);
$tiniymassm_sends =$wpdb->prefix.'tiniymassm_sends';
$row = $wpdb->get_row("select * from $tiniymassm_sends where id=$send_id");
if(!$row) return;

$new_clicks = (int)$row->clicks;
$new_clicks += 1;
$wpdb->update($tiniymassm_sends,
array('clicks' => $new_clicks),
array('id' => $send_id),
array('%d'),
array('%d')
);

//add url hits to DB

$tiniymassm_urls =$wpdb->prefix.'tiniymassm_urls';
$url_res = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tiniymassm_urls where `url` = '%s'" , array($url)));
if($url_res){
$wpdb->update(
$tiniymassm_urls,
array(
'hits' => $url_res->hits+1
),
array('id' => $url_res->id),
array('%d'),
array('%d')
);
}else{
$wpdb->insert(
$tiniymassm_urls,
array(
'url'         => $url,
'hits'        =>    1 ,
),
array('%s' , '%d' , '%d')
);
}

header('location:'.$url);
die();

}

دریافت آخرین کاربر بعدی در MYSQL

یه نکته ی دیگه ی این پلاگین این بود که نیاز بود برای هر ارسال آی دی یوزر بعد رو واکشی و به ایمیلش ارسال داشته باشم،اما مشکل این هست که خیلی از بانکهای اطلاعاتی مثل روز اولشون به ترتیب شماره گذاری شده نمی مونند،به هرحال شاید یوزری حذف بشه و یا ویرایش و این ترتیب به هم بریزه،پس راه حل چی بود؟

ببینید:


$wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID > $last_id ORDER BY ID LIMIT 1;");

این میگه اولین آی دی ای رو برام برگردون که از آخرین آی دی من بزرگتر باشه 🙂

نکات دیگه ای هم هست که از گفتنش صرف نظر می کنم.

اگر از این مطالب استفاده بردین،صلواتی برای یاد شهدا و تسریع ظهور بفرستید.

Related Posts

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *