Skip to content

Instantly share code, notes, and snippets.

@femiyb
Created January 3, 2020 10:06
Show Gist options
  • Save femiyb/a85cfcb23b3efd0be5c80588080c19fa to your computer and use it in GitHub Desktop.
Save femiyb/a85cfcb23b3efd0be5c80588080c19fa to your computer and use it in GitHub Desktop.
Adds category restrictions to pages.
<?php
function add_taxonomies_to_pages()
{
register_taxonomy_for_object_type( 'post_tag', 'page' );
register_taxonomy_for_object_type( 'category', 'page' );
}
add_action( 'init', 'add_taxonomies_to_pages' );
function category_restriction_for_pages( $hasaccess, $mypost, $myuser, $post_membership_levels)
{
global $wpdb;
if(isset($mypost->post_type) && $mypost->post_type == "page")
{
$post_categories = wp_get_post_categories($mypost->ID);
if(!$post_categories)
{
//just check for entries in the memberships_pages table
$sqlQuery = "SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
}
else
{
//are any of the post categories associated with membership levels? also check the memberships_pages table
$sqlQuery = "(SELECT m.id, m.name FROM $wpdb->pmpro_memberships_categories mc LEFT JOIN $wpdb->pmpro_membership_levels m ON mc.membership_id = m.id WHERE mc.category_id IN(" . implode(",", $post_categories) . ") AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM $wpdb->pmpro_memberships_pages mp LEFT JOIN $wpdb->pmpro_membership_levels m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "')";
}
}
$post_membership_levels = $wpdb->get_results($sqlQuery);
$post_membership_levels_ids = array();
$post_membership_levels_names = array();
if(!$post_membership_levels)
{
$hasaccess = true;
}
else
{
//we need to see if the user has access
foreach($post_membership_levels as $level)
{
$post_membership_levels_ids[] = $level->id;
$post_membership_levels_names[] = $level->name;
}
//levels found. check if this is in a feed or if the current user is in at least one of those membership levels
if(is_feed())
{
//always block restricted feeds
$hasaccess = false;
}
elseif(!empty($myuser->ID))
{
$myuser->membership_level = pmpro_getMembershipLevelForUser($myuser->ID); // kept in for legacy filter users below.
$myuser->membership_levels = pmpro_getMembershipLevelsForUser($myuser->ID);
$mylevelids = array();
foreach($myuser->membership_levels as $curlevel) {
$mylevelids[] = $curlevel->id;
}
if(count($myuser->membership_levels)>0 && count(array_intersect($mylevelids, $post_membership_levels_ids))>0)
{
//the users membership id is one that will grant access
$hasaccess = true;
}
else
{
//user isn't a member of a level with access
$hasaccess = false;
}
}
else
{
//user is not logged in and this content requires membership
$hasaccess = false;
}
}
return $hasaccess;
}
add_filter("pmpro_has_membership_access_filter_page", "category_restriction_for_pages", 10, 4);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment