Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save andrewlimaza/263bd729877ff53e50bff298b30c0b7f to your computer and use it in GitHub Desktop.
Save andrewlimaza/263bd729877ff53e50bff298b30c0b7f to your computer and use it in GitHub Desktop.
Protect all child pages of a page protected by the "Protect Add-on Pages" add-on
<?php
/*
Plugin Name: Paid Memberships Pro - Protect Child Pages Add On
Plugin URI: http://www.paidmembershipspro.com/wp/pmpro-customizations/
Description: Apply protection to all child pages of a Add-on Page that's protected.
Version: .1
Author: Thomas Sjolshagen @ Stranger Studios <[email protected]>
Author URI: https://eighty20results.com/thomas-sjolshagen/
*/
/**
* Apply protection of parent page to child pages.
*
* @param $hasaccess
* @param $thepost
* @param $theuser
* @param $post_membership_levels
* @return bool
*
* @since v.1
*/
function pmproap_hide_child_posts( $hasaccess, $thepost, $theuser, $post_membership_levels) {
global $pmpro_inaccessible_parent;
global $pmpro_pages;
if ( in_array( $thepost->ID, $pmpro_pages ) ) {
return $hasaccess;
}
$pmpro_inaccessible_parent = null;
//if PMPro says false already, return false
if ( ! $hasaccess ) {
return $hasaccess;
}
//if PMPro Addon Packages is not installed, return
if ( ! function_exists('pmproap_hasAccess') || ! function_exists( 'pmproap_isPostLocked' ) ) {
return $hasaccess;
}
// If the parent post isn't locked down with Add On packages, Lets just bail.
if ( !pmproap_isPostLocked( $thepost->post_parent ) ) {
return $hasaccess;
}
// this post/page doesn't have a parent so nothing to check.
if ( empty( $thepost->post_parent ) ) {
return $hasaccess;
}
if ( ! pmproap_hasAccess($theuser->ID, $thepost->post_parent) ) {
$pmpro_inaccessible_parent = $thepost->post_parent;
$hasaccess = false;
}
return $hasaccess;
}
add_filter("pmpro_has_membership_access_filter", "pmproap_hide_child_posts", 10, 4);
/**
* Show a link to checkout for the addon package for child-posts of a Add-on protected parent page
* @param $text
* @return string
*/
function pmproap_pmpro_text_filter_for_child_posts($text) {
global $current_user, $post, $pmpro_currency_symbol;
global $pmpro_inaccessible_parent;
global $pmpro_pages;
if (empty($post->post_parent) || ( !empty($post->post_parent) && in_array( $post->post_parent, $pmpro_pages) )) {
error_log("No parent post configured, so exiting");
return $text;
}
if ( ! pmproap_hasAccess($current_user->ID, $post->post_parent) ) {
//which level to use for checkout link?
$text_level_id = pmproap_getLevelIDForCheckoutLink($post->post_parent, $current_user->ID);
//what's the price
$pmproap_price = get_post_meta($post->post_parent, "_pmproap_price", true);
//check for all access levels
$all_access_levels = apply_filters("pmproap_all_access_levels", array(), $current_user->ID, $post->post_parent);
//update text
if (!empty($all_access_levels)) {
$level_names = array();
foreach ($all_access_levels as $level_id) {
$level = pmpro_getLevel($level_id);
$level_names[] = $level->name;
}
error_log("Set additional access text for all access levels");
$text = "<p>This content requires that you purchase additional access. The price is " . $pmpro_currency_symbol . $pmproap_price . " or free for our " . pmpro_implodeToEnglish($level_names) . " members.</p>";
$text .= "<p><a href=\"" . pmpro_url("checkout", "?level=" . $text_level_id . "&ap=" . $post->post_parent) . "\">Purchase this Content (" . pmpro_formatPrice($pmproap_price) . ")</a> <a href=\"" . pmpro_url("levels") . "\">Choose a Membership Level</a></p>";
} elseif( !empty($text_level_id)) {
error_log("Set additional access text for all level: {$text_level_id}");
$text = "<p>This content requires that you purchase additional access. The price is " . pmpro_formatPrice($pmproap_price) . ".</p>";
$text .= "<p><a href=\"" . pmpro_url("checkout", "?level=" . $text_level_id . "&ap=" . $post->post_parent) . "\">Click here to checkout</a></p>";
}
}
return $text;
}
add_filter("pmpro_non_member_text_filter", "pmproap_pmpro_text_filter_for_child_posts", 15);
add_filter("pmpro_not_logged_in_text_filter", "pmproap_pmpro_text_filter_for_child_posts", 15);
@andrewlimaza
Copy link
Author

This will only hide child pages, if the parent page is restricted with Add On Packages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment