Last active
April 23, 2019 20:57
-
-
Save eighty20results/b23ca11d8c2e043ad0eb1e4817c3f53d to your computer and use it in GitHub Desktop.
Protect PowerPress Podcast Feeds, but let members access them with their custom RSS key. Requires both BluBrry PowerPress plugin, and the PMPro Member RSS add-on.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: E20R - PowerPress Podcast Feed Protection for Paid Memberships Pro | |
Plugin URI: https://eighty20results.com/paid-memberships-pro/do-it-for-me/ | |
Description: Verify PMPro RSS Member Key when accessing PowerPress feed | |
Version: 1.2 | |
Author: Eighty / 20 Results by Wicked Strong Chicks, LLC <[email protected]> | |
Author URI: https://eighty20results.com/thomas-sjolshagen/ | |
License URI: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html | |
License: GPLv2 or later | |
* Copyright (C) 2017-2018 Thomas Sjolshagen - Eighty / 20 Results by Wicked Strong Chicks, LLC | |
* | |
* This program is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU General Public License | |
* as published by the Free Software Foundation; either version 2 | |
* of the License, or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this program; if not, write to the Free Software | |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
*/ | |
class pmproPowerPress { | |
/** | |
* @var null|pmproPowerPress | |
*/ | |
private static $instance = null; | |
/** | |
* @var array $error_msg Error Messages | |
*/ | |
private $error_msg = array(); | |
/** | |
* @var array $error_class - CSS class (notice- prefixed) for the error message type | |
*/ | |
private $error_class = array(); | |
/** | |
* pmproPowerPress constructor. | |
*/ | |
private function __construct() { | |
} | |
/** | |
* Load action and filter hooks for the plugin | |
*/ | |
public function loadHooks() { | |
add_action( 'admin_init', array( $this, 'checkDependencies' ), 10 ); | |
add_action( 'admin_notices', array( $this, 'loadAdminNotices' ), 10 ); | |
add_action( 'init', array( $this, 'addFeedHandlers' ), - 999 ); | |
add_filter( 'pmpromrss_feeds', array( $this, 'addFeedsToRSSLinks' ), 10, 1 ); | |
add_filter( 'rss_enclosure', array( $this, 'rssEnclosure' ), 20, 1 ); | |
add_filter( 'pmpro_rss_text_filter', array( $this, 'setAccessDeniedMessage' ), 5, 1 ); | |
add_filter( 'plugin_row_meta', array( $this, 'pluginRowMeta' ), 10, 2 ); | |
} | |
/** | |
* Fetch list of Podcast Feeds from PowerPress's settings | |
* | |
* @return array | |
* | |
* @access private | |
*/ | |
private function getPowerPressFeeds() { | |
$settings = get_option( 'powerpress_general' ); | |
$feeds = array_merge( $settings['custom_feeds'], | |
array_merge( | |
$settings['custom_feeds'], | |
array( | |
'podcast' => apply_filters( | |
'pmpro_powerpress_default_feed_label', | |
__( 'Default PowerPress Podcast Feed', 'pmpro-powerpress-feed-protection' ) | |
), | |
) | |
) | |
); | |
return $feeds; | |
} | |
/** | |
* Include PowerPress feeds in listing on PMPro Account page | |
* | |
* @param array $feeds | |
* | |
* @return array | |
*/ | |
public function addFeedsToRSSLinks( $feeds ) { | |
$default_url = get_bloginfo_rss( 'url' ); | |
foreach ( $this->getPowerPressFeeds() as $slug => $name ) { | |
$feeds[ $name ] = "{$default_url}/{$slug}/"; | |
} | |
return $feeds; | |
} | |
/** | |
* Using the "Message for RSS Feed" message as a template, create the appropriate (expanded) error message when | |
* a user should NOT have access to a feed. | |
* | |
* @param string $text | |
* | |
* @return string | |
*/ | |
public function setAccessDeniedMessage( $text ) { | |
global $powerpress_feed; | |
global $current_user; | |
global $pmpromrss_user_id; | |
global $post; | |
$post_id = null; | |
if ( ! empty( $post->ID ) ) { | |
$post_id = $post->ID; | |
} | |
if ( is_user_logged_in() ) { | |
$user_id = $current_user->ID; | |
} else { | |
$user_id = $pmpromrss_user_id; | |
} | |
// Process PowerPress feeds | |
$feeds = $this->getPowerPressFeeds(); | |
// Check access to the podcast post/page | |
$access = pmpro_has_membership_access( $post_id, $user_id, true ); | |
// Grab the default text for the RSS Text PMPro Advanced Settings page | |
$denied_text = stripslashes( pmpro_getOption( "rsstext" ) ); | |
$pmpro_content_message_pre = '<div class="pmpro_content_message">'; | |
$pmpro_content_message_post = '</div>'; | |
$sr_search = array( "!!login_url!!", "!!levels!!", "!!referrer!!", "!!podcast_feed!!" ); | |
$sr_replace = array( | |
wp_login_url(), | |
!empty($access[2]) ? pmpro_implodeToEnglish( $access[2] ) : '', | |
urlencode( site_url( $_SERVER['REQUEST_URI'] ) ), | |
$feeds[ $powerpress_feed['feed-slug'] ], | |
); | |
$access_denied_message = $pmpro_content_message_pre . str_replace( $sr_search, $sr_replace, $denied_text ) . $pmpro_content_message_post; | |
if ( empty( $user_id ) || false == $access[0] ) { | |
$text = $access_denied_message; | |
} | |
return $text; | |
} | |
/** | |
* Process the PowerPress podcast feed for access | |
* | |
* @param mixed $var1 | |
* @param string $feed_slug | |
*/ | |
public function processFeeds( $var1, $feed_slug ) { | |
global $current_user; | |
global $pmpromrss_user_id; | |
global $post; | |
$post_id = null; | |
if ( isset( $post->ID ) ) { | |
$post_id = $post->ID; | |
} | |
if ( is_user_logged_in() ) { | |
$user_id = $current_user->ID; | |
} else { | |
$user_id = $pmpromrss_user_id; | |
} | |
$access = pmpro_has_membership_access( $post_id, $user_id, true ); | |
if ( ! is_array( $access ) && true == $access ) { | |
return; | |
} | |
if ( empty( $user_id ) || ( is_array( $access ) && false == $access[0] ) ) { | |
// Remove the default PMPro Membership RSS access denied message handler | |
remove_filter( 'pmpro_rss_text_filter', 'pmprorss_pmpro_rss_text_filter' ); | |
// Apply any/all other filters | |
$denied_text = apply_filters( "pmpro_rss_text_filter", stripslashes( pmpro_getOption( "rsstext" ) ) ); | |
wp_die( $denied_text ); | |
} | |
} | |
/** | |
* Add handlers for each of the PowerPress feeds configured | |
*/ | |
public function addFeedHandlers() { | |
// Only process if PowerPress is active | |
if ( ! function_exists( 'powerpress_is_podcast_feed' ) ) { | |
return; | |
} | |
foreach ( $this->getPowerPressFeeds() as $feed_slug => $feed_name ) { | |
add_action( "do_feed_{$feed_slug}", array( $this, 'processFeeds' ), 10, 2 ); | |
} | |
} | |
/** | |
* Remove the enclosure setting if not able to access post/page/feed | |
* (Should never get there) | |
* | |
* @param string $enclosure | |
* | |
* @return string | |
*/ | |
public function rssEnclosure( $enclosure ) { | |
global $current_user; | |
global $pmpromrss_user_id; | |
global $post; | |
$post_id = null; | |
if ( isset( $post->ID ) ) { | |
$post_id = $post->ID; | |
} | |
if ( is_user_logged_in() ) { | |
$user_id = $current_user->ID; | |
} else { | |
$user_id = $pmpromrss_user_id; | |
} | |
$has_access = pmpro_has_membership_access( $post_id, $user_id ); | |
if ( false == $has_access ) { | |
$enclosure = ""; | |
} | |
return $enclosure; | |
} | |
/** | |
* Load any admin notices/warnings/errors | |
*/ | |
public function loadAdminNotices() { | |
if ( ! empty( $this->error_msg ) && ! empty( $this->error_class ) ) { | |
foreach ( $this->error_msg as $key => $msg ) { | |
?> | |
<div class="notice notice-<?php esc_attr_e( $this->error_class[ $key ] ); ?> is-dismissible"> | |
<p><?php echo $msg; ?></p> | |
</div> | |
<?php | |
} | |
} | |
$this->error_class = array(); | |
$this->error_msg = array(); | |
} | |
/** | |
* Check dependencies for this site | |
*/ | |
public function checkDependencies() { | |
$has_PowerPress = function_exists( 'powerpress_premium_content_authorized_filter' ); | |
$has_PMProRSS = function_exists( 'pmpromrss_pmpro_has_membership_access_filter' ); | |
$has_PMPro = function_exists( 'pmpro_has_membership_access' ); | |
if ( is_admin() ) { | |
if ( false === $has_PowerPress ) { | |
$this->error_msg[] = sprintf( | |
__( "Error: The Blubrry '<a href=\"%s\" target=\"_blank\">PowerPress</a>' plug-in must be installed and active!", "pmpro-powerpress-feed-protection" ), | |
'https://wordpress.org/plugins/powerpress/' | |
); | |
$this->error_class[] = 'error'; | |
} | |
if ( false === $has_PMPro ) { | |
$this->error_msg[] = sprintf( | |
__( "Error: The '<a href=\"%s\" target=\"_blank\">Paid Memberships Pro</a>' plugin must be installed and active!", "pmpro-powerpress-feed-protection" ), | |
'https://wordpress.org/plugins/paid-memberships-pro/' | |
); | |
$this->error_class[] = 'error'; | |
} | |
if ( false === $has_PMProRSS ) { | |
$this->error_msg[] = sprintf( | |
__( "Error: The Paid Memberships Pro '<a href=\"%s\" target=\"_blank\">Member RSS</a>' Add-on must be installed and active!", "pmpro-powerpress-feed-protection" ), | |
'https://www.paidmembershipspro.com/add-ons/pmpro-member-rss/' | |
); | |
$this->error_class[] = 'error'; | |
} | |
} | |
} | |
/** | |
* Add Link to PMPro Support Forum on Plugins page | |
* | |
* @param array $links | |
* @param string $file | |
* | |
* @return array | |
*/ | |
public function pluginRowMeta( $links, $file ) { | |
if ( false !== strpos( $file, 'pmpro-powerpress-feed-protection.php' ) ) { | |
$links[] = sprintf( '<a href="%s" title="%s" target="_blank">%s</a>', | |
esc_url( 'https://paidmembershipsorp.com/support/' ), | |
__( 'Visit the Customer Support Forum', 'paid-memberships-pro' ), | |
__( 'Support', 'paid-memberships-pro' ) | |
); | |
} | |
return $links; | |
} | |
/** | |
* Get or create instance of this class (pmproPowerPress) | |
* | |
* @return pmproPowerPress | |
*/ | |
public static function getInstance() { | |
if ( is_null( self::$instance ) ) { | |
self::$instance = new self; | |
} | |
return self::$instance; | |
} | |
} | |
add_action( 'plugins_loaded', array( pmproPowerPress::getInstance(), ''loadHooks ) ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment