Skip to content

Instantly share code, notes, and snippets.

@andrewlimaza
Last active November 10, 2023 13:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save andrewlimaza/7403caee0b1149b0bde3c8d501f7e7ea to your computer and use it in GitHub Desktop.
Save andrewlimaza/7403caee0b1149b0bde3c8d501f7e7ea to your computer and use it in GitHub Desktop.
Restrict Custom Post Type Categories For Paid Memberships Pro.
<?php
/**
* Restricts content based on a CPT post's category.
* If a CPT has a category restricted by a membership, then run restricton code
* Please adjust the filter name to be 'pmpro_has_membership_access_filter_<<cpt_name>>'
* Add this code to your PMPro Customizations Plugin - https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/
*/
function my_restrict_CPT_categories( $hasaccess, $post, $user, $post_membership_levels ) {
global $wpdb;
if ( ! $hasaccess ) {
return $hasaccess;
}
$post_categories = wp_get_post_categories( $post->ID );
if ( ! empty( $post_categories ) ) {
$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 = '" . $post->ID . "')";
$results = $wpdb->get_results( $sqlQuery );
if ( ! $results ) {
$hasaccess = true;
}
// if the user isn't logged-in, restrict content.
if ( !is_user_logged_in() ) {
$hasaccess = false;
}
$required_levels = array();
foreach ( $results as $level ) {
$required_levels[] = $level->id;
}
if ( ! empty( $user ) ) {
$user_levels = pmpro_getMembershipLevelsForUser($user->ID);
// Bail if the user doesn't have any levels.
if ( empty( $user_levels ) ) {
return $hasaccess;
}
$my_levels = array();
foreach($user_levels as $curlevel) {
$my_levels[] = $curlevel->id;
}
if( count( array_intersect( $my_levels, $required_levels ) ) > 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;
}
}
}
return $hasaccess;
}
add_filter( 'pmpro_has_membership_access_filter_lessons', 'my_restrict_CPT_categories', 10, 4 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment