Skip to content

Instantly share code, notes, and snippets.

@ronalfy
Created November 2, 2020 15:03
Show Gist options
  • Save ronalfy/e76159f0c1e9e87e8abaad1a7843ba6e to your computer and use it in GitHub Desktop.
Save ronalfy/e76159f0c1e9e87e8abaad1a7843ba6e to your computer and use it in GitHub Desktop.
PMPro - Function for Getting Membership Levels for Postt
<?php
/**
* Function for determining levels needed for post/page.
*
* You can add this recipe to your site by creating a custom plugin
* or using the Code Snippets plugin available for free in the WordPress repository.
* Read this companion article for step-by-step directions on either method.
* https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/
*/
/**
* Returns membership levels for a post/page.
*
* Return Format: Array
(
[0] => stdClass Object
(
[id] => 10
[name] => Parent
)
[1] => stdClass Object
(
[id] => 11
[name] => Yearly
)
)
*/
function my_pmpro_get_levels_for_post( $post_id = 0 ) {
global $wpdb;
if ( 0 === $post_id ) {
return array();
}
$mypost = get_post( $post_id );
if ( isset( $mypost->post_type ) && $mypost->post_type == 'post' ) {
$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 . "')";
}
} else {
// are any membership levels associated with this page?
$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 . "'";
}
$post_membership_levels = $wpdb->get_results( $sqlQuery );
return $post_membership_levels;
}
/**
* Example of checking for membership levels.
*/
function my_pmpro_check_membership_for_post() {
$post_id = get_queried_object_id();
my_pmpro_get_levels_for_post( $post_id );
}
add_action( 'wp', 'my_pmpro_check_membership_for_post' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment