lisaleague
3/29/2012 - 1:56 AM

Pay Per Post for WordPress with Paid Memberships Pro

Pay Per Post for WordPress with Paid Memberships Pro

<?php
/*
	Limiting posts per user.
	Enable the Paid Memberships Pro plugin and then add this code to your functions.php or as a stand alone plugin.
	Be sure to read through this code carefully. Update each function to suit your needs.
	This code has not been tested. Feel free to post issues in the comments.
*/
//increment post limit when checking out
function my_pmpro_after_checkout($user_id)
{
	//might want to make this based on membership level
	$old_value = get_user_meta($user_id, "user_post_limit", true);
	update_user_meta($user_id, "user_post_limit", intval($old_value)+1, $old_value);
	
	//make the user an author (ignore people who can already edit posts)
	if(!user_can($user_id, "edit_posts"))
	{
		//upgrade the user to an author
		$wp_user_object = new WP_User($user_id);								
		$wp_user_object->set_role('author');
	}
}
add_action("pmpro_after_checkout", "my_pmpro_after_checkout");

//Check limit before publishing.
function my_limit_num_posts($post_id)
{
	global $wpdb;
	$thepost = get_post($post_id);
	$author_id = $thepost->post_author;
	
	//ignore admins
	if(!user_can($author_id, "manage_options"))
	{	
		//how many posts have I published this month?
		$sqlQuery = "SELECT COUNT(ID) FROM $wpdb->posts WHERE post_author = '" . $author_id . "' AND post_type = 'post' AND post_status = 'publish' AND post_date >= '" . date("Y-m-d 00:00:00") . "' ";	
		
		//use this query to get how many posts overall:
		//$sqlQuery = "SELECT COUNT(ID) FROM $wpdb->posts WHERE post_author = '" . $author_id . "' AND post_type = 'post' AND post_status = 'publish' ";	
		
		$npublished = $wpdb->get_var($sqlQuery);
		
		//what's my limit?
		$user_post_limit = get_user_meta($author_id, "user_post_limit", true);	
			
		//am I over my limit?
		if($npublished > $user_post_limit)
		{
			$upost = array();
			$upost['ID'] = $post_id;
			$upost['post_status'] = 'draft';	//force it back to draft
			wp_update_post($upost);
			
			//show an error message
			add_filter('redirect_post_location','my_message_limit');				
		}
	}
}
add_action('publish_post', 'my_limit_num_posts');

/*
	These functions pass a message # through the URL after saving to show the user why the post wasn't published.
*/
function my_message_limit($loc) 
{
	//message=6 is the published message
	if(strpos($loc, "&message=6"))	
		return add_query_arg(array('message'=>'1', 'mymsg'=>'1'), $loc);			
	else
		return add_query_arg('mymsg', '1', $loc);			
}  
add_action('admin_notices', 'my_error_message');
function my_error_message() 
{
	if(!empty($_REQUEST['mymsg']) && $_REQUEST['mymsg'] == "1")
	{
		echo '<div class="error"><p>Your have reached your posts per month limit. <strong>This post was not published.</strong> Upgrading your account may increase your limit.</p></div>';
	}	
}
?>