Adsense Revenue Sharing Mod for 8.2

Register an Account
Pligg Chat Room
Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 11-30-2006, 02:41 AM
Casual Pligger
 
Join Date: Jun 2006
Location: Dover, NH
Posts: 49
Here it is, the mod you’ve all been waiting for, and if it looks intimidating… that’s because it is. Before we get started, here’s some key information:
  • WARNING: You should not attempt to implement this mod on your own unless you are very comfortable with the Pligg source and know how to make database modifications with phpMyAdmin.
  • This write up is for version 8.2 beta, do not try to implement this mod if you have an older version of Pligg, it won’t work.
  • The line numbers for the code snippets are approximations and may not match your files exactly. I’ve included a line or two of code above and below each snip to help make sure you’re adding the code to the right spot in the file.
  • If you’re uncomfortable implementing this mod, but you really want it, I can install it on your site for you. If you’re interested, PM me for pricing information and please take me up on this. In fact I’m counting on a couple of installs to help me recover from the insane amount of time it took to type this up.
Once implemented, here’s how this mod works:
Users may add an Adsense ID and Adsense Channel (optional) to their account settings. If they set they’re Adsense ID, from that point forward, every time a story they posted is viewed, there’s a chance their ads are displayed. The optional Adsense Channel allows the user to track how many impressions and clicks their ads are getting through their Adsense account. You set the default revenue share percent for all users while implementing the mod, but after that, you may adjust any user’s revenue sharing percent through the user administration menu. So for example if you want to reward one particular member for their recent participation, you can bump just that one user’s revenue share from 50% to 80%. The way this mod is set up, there is no revenue sharing for ads on the front page summary, or any other pages on the site, just the full story pages where you can submit comments. As a safety precaution to protect your users, as long as they’re logged into their user account, they’ll never be shown their own ads in an attempt to help prevent them from accidentally clicking them and getting banned from Google.
On to the changes…

1.) Database Changes:
Using phpMyAdmin, login to your Pligg database and add the following fields to the end of the users table:
google_adsense_id VARCHAR(64) not null
google_adsense_channel VARCHAR(64) not null
google_adsense_percent TINYINT(3) UNSIGNED not null 50*
*Default Value: This is the default percent revenue sharing value you want to automatically assign all new and current users of your site. I don’t recommend changing this once you’ve set it, so think long and hard on what you want it to be. In this example, when the author’s stories are viewed, their ads are shown 50% of the time. You can set it anywhere between 0-100.

2.) Root files:
admin_users.php: add the following code snip to approximately line 101:
Code:
$userdata->email=trim($_GET["email"]);
//***** PlugIM.com mod: Adsense Revenue Sharing
$userdata->google_adsense_percent=trim($_GET["google_adsense_percent"]);
//***** End PlugIM.com mod
$userdata->store();
profile.php: add the following 2 code snips:
Approximately line 129 (in the show_profile() function):
Code:
$main_smarty->assign('user_email', $user->email);
//***** PlugIM.com mod: Adsense Revenue Sharing
$main_smarty->assign('google_adsense_id', $user->google_adsense_id);
$main_smarty->assign('google_adsense_channel', $user->google_adsense_channel);
//***** End PlugIM.com mod
$main_smarty->assign('user_login', $user->username);
Approximately line 182 (in the save_profile() function):
Code:
	$user->email=cleanit($_POST['email']);
}
//***** PlugIM.com mod: Adsense Revenue Sharing
$user->google_adsense_id=cleanit($_POST['google_adsense_id']);
$user->google_adsense_channel=cleanit($_POST['google_adsense_channel']);
//***** End PlugIM.com mod	
$user->url=cleanit($_POST['url']);
user.php: search for $link->print_summary(); It's in 4 different places in the file: approximately lines 196, 211, 226, and 241.
Replace all 4 of those lines with the following:
Code:
//***** PlugIM.com mod: Adsense Revenue Sharing
//$link->print_summary();			
$link->print_summary('summary');
//***** End PlugIM.com mod 

3.) Lib Files:
libs\link.php: add the following 3 code snips:
Approximately line 14 (in the Link class):
Code:
var $username = false;
//***** PlugIM.com mod: Adsense Revenue Sharing
var $google_adsense_id = '';
var $google_adsense_channel = '';
var $google_adsense_percent = '';
//***** End PlugIM.com mod	
var $randkey = 0;
Approximately line 192 (in the read() function):
Code:
$id = $this->id;
//***** PlugIM.com mod: Adsense Revenue Sharing
//if(($link = $db->get_row("SELECT links.*, users.user_login, users.user_email FROM links, users WHERE link_id = $id AND user_id=link_author"))) {
if(($link = $db->get_row("SELECT links.*, users.user_login, users.user_email, users.google_adsense_id, users.google_adsense_channel, users.google_adsense_percent FROM links, users WHERE link_id = $id AND user_id=link_author"))) {
//***** End PlugIM.com mod
	$this->author=$link->link_author;
	$this->author_email=$link->user_email;
	//***** PlugIM.com mod: Adsense Revenue Sharing
	$this->google_adsense_id = $link->google_adsense_id;
	$this->google_adsense_channel = $link->google_adsense_channel;
	$this->google_adsense_percent = $link->google_adsense_percent;
	//***** End PlugIM.com mod				
	$this->username=$link->user_login;
Approximately line 471 (in the fill_smarty($smarty, $type='full') function):
Code:
$smarty->assign('Avatar_ImgSrc', get_avatar('large', "", $this->username(), $this->author_email));
		
//***** PlugIM.com mod: Adsense Revenue Sharing
$smarty->assign('google_adsense_id', $this->google_adsense_id);
$smarty->assign('google_adsense_channel', $this->google_adsense_channel);
$smarty->assign('google_adsense_percent', $this->google_adsense_percent);
//***** End PlugIM.com mod	

$canIhaveAccess = 0;
libs\user.php: add the following 4 code snips:
Approximately line 18 (in the User class):
Code:
var $email = '';
//***** PlugIM.com mod: Adsense Revenue Sharing
var $google_adsense_id = '';
var $google_adsense_channel = '';
var $google_adsense_percent = 50;	// default to 50%*
//***** End PlugIM.com mod	
var $names = '';
*VERY IMPORTANT: This value MUST match the default value you assigned to google_adsense_percent in the Users table of the Pligg database!

Approximately line 62 (in the store() function):
Code:
$user_email = $db->escape($this->email);
//***** PlugIM.com mod: Adsense Revenue Sharing
$user_google_adsense_id = $db->escape($this->google_adsense_id);
$user_google_adsense_channel = $db->escape($this->google_adsense_channel);
$user_google_adsense_percent = $db->escape($this->google_adsense_percent);
//***** End PlugIM.com mod			
$user_names = $db->escape($this->names);
Approximately line 88 (also in the store() function):
Code:
} else {
	// Username is never updated
	//***** PlugIM.com mod: Adsense Revenue Sharing
	//$sql = "UPDATE users set user_avatar_source='$user_avatar_source', user_login='$user_login', user_occupation='$user_occupation', user_location='$user_location', public_email='$user_public_email', user_level='$user_level', user_karma=$user_karma, user_date=FROM_UNIXTIME($user_date), user_pass='$saltedpass', user_lang=$user_lang, user_email='$user_email', user_names='$user_names', user_url='$user_url', user_aim='$user_aim', user_msn='$user_msn', user_yahoo='$user_yahoo', user_gtalk='$user_gtalk', user_skype='$user_skype', user_irc='$user_irc' WHERE user_id=$this->id";
	$sql = "UPDATE users set user_avatar_source='$user_avatar_source', user_login='$user_login', google_adsense_id='$user_google_adsense_id', google_adsense_channel='$user_google_adsense_channel', google_adsense_percent='$user_google_adsense_percent', user_occupation='$user_occupation', user_location='$user_location', public_email='$user_public_email', user_level='$user_level', user_karma=$user_karma, user_date=FROM_UNIXTIME($user_date), user_pass='$saltedpass', user_lang=$user_lang, user_email='$user_email', user_names='$user_names', user_url='$user_url', user_aim='$user_aim', user_msn='$user_msn', user_yahoo='$user_yahoo', user_gtalk='$user_gtalk', user_skype='$user_skype', user_irc='$user_irc' WHERE user_id=$this->id";
	//***** End PlugIM.com mod
	//die($sql);
	$db->query($sql);
}
Approximately line 111 (in the read() function):
Code:
$this->pass = $user->user_pass;
//***** PlugIM.com mod: Adsense Revenue Sharing
$this->google_adsense_id = $user->google_adsense_id;
$this->google_adsense_channel = $user->google_adsense_channel;
$this->google_adsense_percent = $user->google_adsense_percent;
//***** End PlugIM.com mod				
$this->email = $user->user_email;
Continued in next post...

Last edited by Dravis; 12-15-2006 at 01:19 AM.
Reply With Quote
  #2 (permalink)  
Old 11-30-2006, 02:42 AM
Casual Pligger
 
Join Date: Jun 2006
Location: Dover, NH
Posts: 49
Continued from previous post...
libs\lang.conf: add the following code snip to the very end of the file:
Code:
//***** PlugIM.com mod: Adsense Revenue Sharing
//<SECTION>GOOGLE ADSENSE REVENUE SHARING</SECTION><ADDED></ADDED>
PLIGG_Visual_Google_Adsense_ID = "Google Adsense ID"
PLIGG_Visual_Google_Adsense_ID_Explain = "(begins with: pub-)"
PLIGG_Visual_Google_Adsense_Channel = "Adsense Channel (optional)"
PLIGG_Visual_Google_Adsense_Channel_Explain = "(numerical value)"
PLIGG_Visual_Google_Adsense_Only_Admins = "Only admins can see Google Adsense settings."
//***** End PlugIM.com mod 

4.) New File:
plugins\function.adsense.php: save this code as a new file named function.adsense.php and upload it to the plugins directory:
Code:
<?php
 /******************************************************************
* template_lite Adsense Plugin for Pligg
*
* Name: adsense
* Type: function
* Purpose: use the authors adsense ID or not?
* Author: Ryan 'Dravis' Knowles http://www.PlugIM.com
* Parameters:
*	params: parameters array
*	tpl: template_lite instance
* Returns: nothing, assigns new value to a template_lite variable
******************************************************************/
function tpl_function_adsense($params, &$tpl)
{
	// check to make sure this is a full story
	if (strcasecmp($tpl->get_template_vars("viewtype"), "full") != 0){
		// not a full story, no adsense sharing
		$tpl->assign($params['assign'], 0);
		return;
	}
	
	// check to see if the author has an adsense id on their profile
	if ($tpl->get_template_vars("google_adsense_id") == ""){
		// this author hasn't provided their adsense id, no sharing
		$tpl->assign($params['assign'], 0);
		return;
	}
	
	// make sure the logged in user isn't the same user who submitted the story
	// using a case insensitive compare because the user name isn't case sensitive
	if (strcasecmp($tpl->get_template_vars("user_logged_in"), $tpl->get_template_vars("link_submitter")) == 0){
		// the user viewing the story is also the author, can't show them their own ads, no sharing
		$tpl->assign($params['assign'], 0);
		return;
	}

	// generate a random number between 1 and 100
	srand((float) microtime() * 10000000);
	$random = rand(1, 100);

	// check the random number against their adsense percent (defaults to 50% but can be adjusted)	
	if ($random > $tpl->get_template_vars("google_adsense_percent")){
		// if the random number is higher than their percent of revenue sharing, no sharing this time
		$tpl->assign($params['assign'], 0);
		return;
	}

	// passed all checks, use the users adsense ID for this page	
	$tpl->assign($params['assign'], 1);
	return;
}
?>

5.) Template files:
mollio-beat\profile_center.tpl: add the following code snip to approximately line 59:
Code:
<input type="text" name="msn" id="msn" tabindex="4" value="{$user_msn}">
</p></td>
</tr>
<!-- ***** PlugIM.com mod: Adsense Revenue Sharing -->
<tr>
<td><p class="l-mid"><label for="name" accesskey="1">{#PLIGG_Visual_Google_Adsense_ID#}:</label>
{if #PLIGG_Visual_Google_Adsense_ID_Explain# neq ""}
	<em>{#PLIGG_Visual_Google_Adsense_ID_Explain#}</em><br />
{/if}
<input type="text" name="google_adsense_id" id="google_adsense_id" tabindex="5" value="{$google_adsense_id}">
</p></td>
<td><p class="l-mid"><label for="name" accesskey="1">{#PLIGG_Visual_Google_Adsense_Channel#}:</label>
{if #PLIGG_Visual_Google_Adsense_Channel_Explain# neq ""}
	<em>{#PLIGG_Visual_Google_Adsense_Channel_Explain#}</em><br />
{/if}
<input type="text" name="google_adsense_channel" id="google_adsense_channel" tabindex="6" value="{$google_adsense_channel}">
</p></td>
</tr>
<tr><td style="background:#FFFFFF" colspan="2"><em>{#PLIGG_Visual_Google_Adsense_Only_Admins#}</em></td></tr>
<!-- ***** End PlugIM.com mod -->			
<tr>
<td><p class="l-mid"><label for="name" accesskey="1">{#PLIGG_Visual_Profile_PublicEmail#}:</label>
*Note: Don’t forget to update all the tabindex values the rest of the way down the template.
admin_templates\user_edit_center.tpl: add the following code snip to approximately line 16:
Code:
<form id="form1" name="form1" method="get" action="">
<input type=hidden name=user value="{$userdata[nr].user_login}">
<table style="border:none">
	<tr><td width="35%">Login:</td><td width="65%"><input name="login" value="{$userdata[nr].user_login}"></td></tr>
	{if $amIgod eq 1}
<tr><td>Level:</td><td>
<SELECT NAME="level">
	{html_options values=$levels output=$levels selected=$userdata[nr].user_level}
</SELECT>
	{/if}
	</td></tr>
	<tr><td>Email:</td><td><input name="email" value="{$userdata[nr].user_email}"></td></tr>
	<!-- ***** PlugIM.com mod: Adsense Revenue Sharing -->
	<tr><td>Adsense Revenue Share:</td><td><input size="1" name="google_adsense_percent" value="{$userdata[nr].google_adsense_percent}">%</td></tr>	
	<!-- ***** End PlugIM.com mod -->
	<tr><td colspan="2"><input type=submit name=mode value="save" class="log2"> <input type=button onclick="window.history.go(-1)" value="cancel" class="log2"></td></tr>
	<tr><td colspan="2"></td></tr>
*Note: I changed the way the table was being displayed in this template file, so I included the whole form instead of just the mod change
admin_templates\user_show_center.tpl: add the following code snip to approximately line 8:
Code:
<tr><td><b>Email: </b></td><td>{$userdata[nr].user_email}</td></tr>
<!-- ***** PlugIM.com mod: Adsense Revenue Sharing -->
<tr><td><b>Adsense Revenue Share: </b></td><td>{$userdata[nr].google_adsense_percent}%</td></tr>
<!-- ***** End PlugIM.com mod -->
<tr><td><strong>Last Login Date/Time:</strong> </td><td>{$userdata[nr].user_lastlogin}</td></tr>

6.) The Final Step:
WARNING: Messing this part up could seriously get your Adsense account banned.

Google's ONLY Adsense Revenue Sharing Rule to date: If you choose to display multiple Adsense blocks on the same page, EVERY block MUST reference the same Adsense ID number.

Fortunately this mod handles Google's requirement as long as one simple step is followed. See Displaying Multiple Adsense Blocks below:

mollio-beat\link_summary.tpl: add the following code snip wherever you want your first Google Adsense block to be displayed:
Code:
{adsense assign=users_adsense}
{if $users_adsense}
	<script type="text/javascript"><!--
		google_ad_client = "{$google_adsense_id}";
		google_alternate_ad_url = "";
		google_ad_width = 468;
		google_ad_height = 60;
		google_ad_format = "468x60_as";
		google_ad_type = "text";
		google_ad_channel ="{$google_adsense_channel}";
		google_color_border = "f6f6f6";
		google_color_bg = "f6f6f6";
		google_color_link = "330066";
		google_color_text = "000000";
		google_color_url = "330066";
		//-->
	</script>
	<script type="text/javascript"
	  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
	</script>
{else}				
	<script type="text/javascript"><!--
		google_ad_client = "Your Adsense ID number";
		google_alternate_ad_url = "";
		google_ad_width = 468;
		google_ad_height = 60;
		google_ad_format = "468x60_as";
		google_ad_type = "text";
		google_ad_channel ="Your Channel number";
		google_color_border = "f6f6f6";
		google_color_bg = "f6f6f6";
		google_color_link = "330066";
		google_color_text = "000000";
		google_color_url = "330066";
		//-->
	</script>
	<script type="text/javascript"
	  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
	</script>
{/if}
*VERY IMPORTANT: Make sure to fill in your Adsense ID number and optional Channel number where denoted in the code above.
**Note: You can change the color and google_ad_format variables above to whatever you want using the ad designer in your Adsense account.
Displaying Multiple Adsense Blocks:
Use the same code from the section above for your second and third Adsense blocks, just delete the first line of code: {adsense assign=users_adsense}

That line should only be in link_summary.tpl once for the very first Adsense block and that's it. As long as you follow this step, all of your Adsense blocks will always use the same Adsense ID number whether it's yours, or the author of the story.

That's it! Let the questions roll… I’ll check in a couple times a day to answer any questions and PM’s enquiring about availability and pricing to have me do the install for you. Enjoy!
Reply With Quote
  #3 (permalink)  
Old 11-30-2006, 03:35 AM
chuckroast's Avatar
Pligg Developer/Coder/Designer
Pligg Version: SVN
Pligg Template: Galleria
 
Join Date: Jun 2006
Posts: 3,835
Dravis

Great work!
This is one of the best write-ups I've seen in a long time.

Thanks again.


Download the full Pligg Module Pack





Reply With Quote
  #4 (permalink)  
Old 11-30-2006, 04:24 AM
savant's Avatar
Constant Pligger
 
Join Date: Apr 2006
Location: UK
Posts: 1,181
bravo! i really like the way you set it out (jealous) and a really nice mod.
Reply With Quote
  #5 (permalink)  
Old 11-30-2006, 06:21 AM
Casual Pligger
Pligg Version: 995
Pligg Template: Yget
 
Join Date: Sep 2006
Posts: 59
Thanks a million for the great mod, Dravis!

In step 5 you made the following note:
Don’t forget to update all the tabindex values the rest of the way down the template.

I understand that I should update all the tabindex, but so far I did not really understand how this should be done exactly. Any help or example will be highly appreciated.

Dubai
Reply With Quote
  #6 (permalink)  
Old 11-30-2006, 07:54 AM
Casual Pligger
 
Join Date: Jun 2006
Location: Dover, NH
Posts: 49
Quote:
Originally Posted by Dubai View Post
Thanks a million for the great mod, Dravis!

In step 5 you made the following note:
Don’t forget to update all the tabindex values the rest of the way down the template.

I understand that I should update all the tabindex, but so far I did not really understand how this should be done exactly. Any help or example will be highly appreciated.

Dubai
Dubai, that should actually probably say "rest of the way down the template file" rather than just "template". Basically you want to go down the rest of profile_center.tpl and bump all the tabindexes up by two because you've inserted 2 new input tags (google_adsense_id and google_adsense_channel). This keeps all the input fields in order when the user tabs through them entering data. I hope this clears it up for you, let me know if it's still not clear.

Thanks for the positive feedback so far guys.
Reply With Quote
  #7 (permalink)  
Old 11-30-2006, 09:09 AM
kbeeveer46's Avatar
Pligg Developer/Admin
Pligg Version: 0
Pligg Template: none
 
Join Date: Jun 2006
Location: Muncie, Indiana
Posts: 3,215
oh snap.. looks like I'm going to mess around with this and not study today. Oh well ; )
Reply With Quote
  #8 (permalink)  
Old 11-30-2006, 09:25 AM
Casual Pligger
Pligg Version: 995
Pligg Template: Yget
 
Join Date: Sep 2006
Posts: 59
Quote:
Originally Posted by Dravis View Post
Dubai, that should actually probably say "rest of the way down the template file" rather than just "template". Basically you want to go down the rest of profile_center.tpl and bump all the tabindexes up by two because you've inserted 2 new input tags (google_adsense_id and google_adsense_channel). This keeps all the input fields in order when the user tabs through them entering data. I hope this clears it up for you, let me know if it's still not clear.
You made it perfectly clear and you made my day!
Reply With Quote
  #9 (permalink)  
Old 11-30-2006, 09:12 PM
New Pligger
 
Join Date: Nov 2006
Posts: 3
Quote:
Originally Posted by Dravis View Post

3.) Lib Files:

libs\link.php: add the following 3 code snips:
Approximately line 14 (in the Link class):
Code:
var $username = false;
//***** PlugIM.com mod: Adsense Revenue Sharing
var $google_adsense_id = '';
var $google_adsense_channel = '';
var $google_adsense_percent = '';
//***** End PlugIM.com mod	
var $randkey = 0;
Approximately line 192 (in the read() function):
Code:
$id = $this->id;
//***** PlugIM.com mod: Adsense Revenue Sharing
//if(($link = $db->get_row("SELECT links.*, users.user_login, users.user_email FROM links, users WHERE link_id = $id AND user_id=link_author"))) {
if(($link = $db->get_row("SELECT links.*, users.user_login, users.user_email, users.google_adsense_id, users.google_adsense_channel, users.google_adsense_percent FROM links, users WHERE link_id = $id AND user_id=link_author"))) {
//***** End PlugIM.com mod
	$this->author=$link->link_author;
	$this->author_email=$link->user_email;
	//***** PlugIM.com mod: Adsense Revenue Sharing
	$this->google_adsense_id = $link->google_adsense_id;
	$this->google_adsense_channel = $link->google_adsense_channel;
	$this->google_adsense_percent = $link->google_adsense_percent;
	//***** End PlugIM.com mod				
	$this->username=$link->user_login;
Approximately line 471 (in the fill_smarty($smarty, $type='full') function):
Code:
$smarty->assign('Avatar_ImgSrc', get_avatar('large', "", $this->username(), $this->author_email));
		
//***** PlugIM.com mod: Adsense Revenue Sharing
$smarty->assign('google_adsense_id', $this->google_adsense_id);
$smarty->assign('google_adsense_channel', $this->google_adsense_channel);
$smarty->assign('google_adsense_percent', $this->google_adsense_percent);
//***** End PlugIM.com mod	

$canIhaveAccess = 0;
I'm having a small issue with part 3. /libs/link.php in the second apart at around line 192:

you call for this:
Code:
if(($link = $db->get_row("SELECT links.*, users.user_login, users.user_email, users.google_adsense_id, users.google_adsense_channel, users.google_adsense_percent FROM links, users WHERE link_id = $id AND user_id=link_author"))) {
yet mine looks like:
Code:
if(($link = $db->get_row("SELECT " . table_links . ".*, " . table_users . ".user_login, " . table_users . ".user_email FROM " . table_links . ", " . table_users . " WHERE link_id = $id AND user_id=link_author"))) {
I'm using the pligg from the svn/trunk, and I'm sure the only difference is how the line is formatted. I'm just not sure how to add the the adsense lines correctly


Thanks for the mod, this and the rss import are the reason I'm using pligg
Reply With Quote
  #10 (permalink)  
Old 11-30-2006, 09:30 PM
Casual Pligger
 
Join Date: Jun 2006
Location: Dover, NH
Posts: 49
lunatechinc, try this:
Code:
if(($link = $db->get_row("SELECT " . table_links . ".*, " . table_users . ".user_login, " . table_users . ".user_email, " . table_users . ".google_adsense_id, " . table_users . ".google_adsense_channel, " . table_users . ".google_adsense_percent FROM " . table_links . ", " . table_users . " WHERE link_id = $id AND user_id=link_author"))) {
I haven't tested it but I think it's formatted correctly and should work for you.
Reply With Quote
Reply

Thread Tools
Display Modes


Similar Threads
Thread Thread Starter Forum Replies Last Post
Google Adsense Revenue Sharing v0.1 error for 9.6 xbizsky Questions and Comments 8 11-16-2009 04:27 AM
Google adsense revenue sharing, question dadaas Questions and Comments 1 11-16-2009 04:19 AM
EASY NO WORRIES PAINLESS adsense revenue sharing mod placement mod guide johntheentrepreneur Questions and Comments 6 12-07-2008 02:05 AM
Google Adsense Revenue Sharing v0.1 problem? mapperkids Questions and Comments 2 08-17-2008 10:54 PM
Adsense Revenue Sharing Placement Question??? onouchs Questions and Comments 8 03-26-2007 06:14 PM


Pligg Modules and Pligg Templates from Pligg Pro Find support on the Pligg CMS Forum - 24 hours a day! Make a donation to support Pligg CMS development