423 lines
9.7 KiB
PHP
423 lines
9.7 KiB
PHP
<?php
|
|
/**
|
|
* MemberPress Rules class.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @package OMAPI
|
|
* @author Eduardo Nakatsuka
|
|
*/
|
|
|
|
// Exit if accessed directly.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* MemberPress_Rules class.
|
|
*
|
|
* @since 2.13.0
|
|
*/
|
|
class OMAPI_MemberPress_Rules extends OMAPI_Rules_Base {
|
|
|
|
/**
|
|
* Holds the meta fields used for checking output statuses.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $fields = array(
|
|
'show_to_mbp_membership_member',
|
|
'show_not_to_mbp_membership_member',
|
|
'show_to_mbp_group_member',
|
|
'show_not_to_mbp_group_member',
|
|
'show_on_mbp_group_pages',
|
|
'show_on_mbp_membership_pages',
|
|
'show_on_mbp_register_pages',
|
|
'show_on_mbp_checkout_pages',
|
|
'is_mbp_register',
|
|
'is_mbp_checkout',
|
|
'is_mbp_thank_you',
|
|
'show_on_mbp_course_pages',
|
|
'show_on_mbp_lesson_pages',
|
|
'show_on_mbp_quiz_pages',
|
|
);
|
|
|
|
/**
|
|
* MeprUser object
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @var MeprUser
|
|
*/
|
|
protected $mp_user;
|
|
|
|
/**
|
|
* Whether user is on the checkout page.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $is_checkout = false;
|
|
|
|
/**
|
|
* Check for MP rules.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @throws OMAPI_Rules_True If rule matches.
|
|
* @return void
|
|
*/
|
|
public function run_checks() {
|
|
|
|
// If MP is not active we can ignore the MP specific settings.
|
|
if ( ! OMAPI_MemberPress::is_active() ) {
|
|
return;
|
|
}
|
|
|
|
if( ! empty( $_GET['action'] ) && 'checkout' === $_GET['action'] ) {
|
|
$this->set_is_checkout( true );
|
|
}
|
|
|
|
if ( is_user_logged_in() ) {
|
|
$this->mp_user = new MeprUser( get_current_user_id() );
|
|
$this->exclude_if_member_not_allowed();
|
|
}
|
|
|
|
$mp_checks = array(
|
|
'show_on_mbp_group_pages' => array( $this, 'is_on_page' ),
|
|
'show_on_mbp_membership_pages' => array( $this, 'is_on_page' ),
|
|
'show_on_mbp_register_pages' => array( $this, 'is_on_membership_register_page' ),
|
|
'show_on_mbp_checkout_pages' => array( $this, 'is_on_membership_checkout_page' ),
|
|
'is_mbp_register' => array( $this, 'is_on_register_page' ),
|
|
'is_mbp_checkout' => array( $this, 'is_on_checkout_page' ),
|
|
'is_mbp_thank_you' => array( $this, 'is_on_thank_you_page' ),
|
|
'show_on_mbp_course_pages' => array( $this, 'is_on_page' ),
|
|
'show_on_mbp_lesson_pages' => array( $this, 'is_on_page' ),
|
|
'show_on_mbp_quiz_pages' => array( $this, 'is_on_page' ),
|
|
);
|
|
|
|
foreach ( $mp_checks as $field => $callback ) {
|
|
// If field is empty, then we don't need to check this.
|
|
if ( $this->rules->field_empty( $field ) ) {
|
|
continue;
|
|
}
|
|
|
|
$rule_value = $this->rules->get_field_value( $field );
|
|
$this->rules
|
|
->set_global_override( false )
|
|
->set_advanced_settings_field( $field, $rule_value );
|
|
|
|
if ( call_user_func( $callback, $rule_value ) ) {
|
|
throw new OMAPI_Rules_True( $field );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if campaign prevented from showing based on applicable membership/groups.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @throws OMAPI_Rules_False
|
|
* @return void
|
|
*/
|
|
public function exclude_if_member_not_allowed() {
|
|
|
|
// * Does user exist? If no, Nothing to do.
|
|
if ( empty( $this->mp_user->ID ) ) {
|
|
return false;
|
|
}
|
|
|
|
// * Are there selected memberships?
|
|
$required_memberships = $this->rules->field_not_empty_array( 'show_to_mbp_membership_member' );
|
|
if ( $required_memberships ) {
|
|
// * Is user NOT ACTIVE in one of the selected memberships?
|
|
if ( ! $this->is_active_on_memberships( $required_memberships ) ) {
|
|
// * then fail!
|
|
throw new OMAPI_Rules_False( 'show_to_mbp_membership_member' );
|
|
}
|
|
}
|
|
|
|
// * Are there selected excluded memberships?
|
|
$excluded_memberships = $this->rules->field_not_empty_array( 'show_not_to_mbp_membership_member' );
|
|
if ( $excluded_memberships ) {
|
|
// * Is user ACTIVE in one of the selected excluded memberships?
|
|
if ( $this->is_active_on_memberships( $excluded_memberships ) ) {
|
|
// * then fail!
|
|
throw new OMAPI_Rules_False( 'show_not_to_mbp_membership_member' );
|
|
}
|
|
}
|
|
|
|
// * Are there selected groups?
|
|
$required_groups = $this->rules->field_not_empty_array( 'show_to_mbp_group_member' );
|
|
if ( $required_groups ) {
|
|
// * Is user NOT ACTIVE in one of the selected groups?
|
|
if ( ! $this->is_active_on_groups( $required_groups ) ) {
|
|
// * then fail!
|
|
throw new OMAPI_Rules_False( 'show_to_mbp_group_member' );
|
|
}
|
|
}
|
|
|
|
// * Are there selected excluded groups?
|
|
$excluded_groups = $this->rules->field_not_empty_array( 'show_not_to_mbp_group_member' );
|
|
if ( $excluded_groups ) {
|
|
// * Is user ACTIVE in one of the selected excluded groups?
|
|
if ( $this->is_active_on_groups( $excluded_groups ) ) {
|
|
// * then fail!
|
|
throw new OMAPI_Rules_False( 'show_not_to_mbp_group_member' );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if the user is logged in and subscribed to any product in the group.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param array $group_ids Array of group IDs.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_active_on_groups( $group_ids ) {
|
|
// Stash our checks in a static variable
|
|
// So we only do the fetch/checks once per page-load.
|
|
static $cached = array();
|
|
|
|
foreach ( $group_ids as $group_id ) {
|
|
if ( isset( $cached[ $group_id ] ) ) {
|
|
if ( $cached[ $group_id ] ) {
|
|
return true;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
$cached[ $group_id ] = false;
|
|
$group = new MeprGroup( $group_id );
|
|
|
|
// If we can't find this group, then it's not considered active.
|
|
if ( ! empty( $group->ID ) ) {
|
|
// Check if user is subscribed to any products of a group.
|
|
foreach ( $group->products() as $group_product ) {
|
|
if ( $this->mp_user->is_already_subscribed_to( $group_product->ID ) ) {
|
|
$cached[ $group_id ] = true;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the If the page is a Membership.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_register_page() {
|
|
return $this->is_product( $this->rules->post_id )
|
|
? ! $this->is_checkout
|
|
: false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is active on any of the given memberships.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param array $membership_ids Array of membership IDs.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_active_on_memberships( $membership_ids ) {
|
|
foreach ( $membership_ids as $membership ) {
|
|
if ( $this->mp_user->is_active_on_membership( $membership ) ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is on a thank you page.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_thank_you_page() {
|
|
$options = MeprOptions::fetch();
|
|
|
|
if (
|
|
! empty( $options->thankyou_page_id )
|
|
&& $this->is_current_post_id( $options->thankyou_page_id )
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
$product = new MeprProduct();
|
|
$all_memberpress_posts = $product->get_all();
|
|
|
|
foreach ( $all_memberpress_posts as $post ) {
|
|
if (
|
|
! empty( $post->thankyou_page_id )
|
|
&& $this->is_current_post_id( $post->thankyou_page_id )
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is on a checkout page.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_checkout_page() {
|
|
return $this->is_product( $this->rules->post_id )
|
|
? $this->is_checkout
|
|
: false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is on a membership register page.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param array $memberships Array of membership IDs.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_membership_register_page( $memberships ) {
|
|
foreach ( $memberships as $membership ) {
|
|
|
|
if ( ! $this->is_current_post_id( $membership ) ) {
|
|
continue;
|
|
}
|
|
|
|
// If page is not a Membership, go to the next loop.
|
|
if ( ! $this->is_product( $this->rules->post_id ) ) {
|
|
continue;
|
|
}
|
|
|
|
return ! $this->is_checkout;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is on a membership checkout page.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param array $memberships Array of membership IDs.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_membership_checkout_page( $memberships ) {
|
|
foreach ( $memberships as $membership ) {
|
|
if ( ! $this->is_current_post_id( $membership ) ) {
|
|
continue;
|
|
}
|
|
|
|
// If page is not a Membership, go to the next loop.
|
|
if ( ! $this->is_product( $membership ) ) {
|
|
continue;
|
|
}
|
|
|
|
return $this->is_checkout;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the current user is on a page of given IDs.
|
|
*
|
|
* @param array $page_ids Array of page IDs.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function is_on_page( $page_ids ) {
|
|
foreach ( $page_ids as $page_id ) {
|
|
if ( $this->is_current_post_id( $page_id ) ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if given id is a product.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param int $product_id Product/post ID.
|
|
*
|
|
* @return bool Whether given id is a product.
|
|
*/
|
|
public function is_product( $product_id ) {
|
|
$product = $this->get_product( $product_id );
|
|
|
|
return ! empty( $product->ID );
|
|
|
|
}
|
|
|
|
/**
|
|
* Get memberpress product.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param int $product_id Product/post ID.
|
|
*
|
|
* @return MeprProduct Memberpress product object.
|
|
*/
|
|
public function get_product( $product_id ) {
|
|
static $products = array();
|
|
if ( empty( $products[ $product_id ] ) ) {
|
|
$products[ $product_id ] = new MeprProduct( $product_id );
|
|
}
|
|
|
|
return $products[ $product_id ];
|
|
}
|
|
|
|
/**
|
|
* Determines if current post is the same one being passed in.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param int $post_id Current post id.
|
|
*
|
|
* @return boolean Whether current post is the same one being passed in.
|
|
*/
|
|
public function is_current_post_id( $post_id ) {
|
|
return intval( $this->rules->post_id ) === intval( $post_id );
|
|
}
|
|
|
|
/**
|
|
* Set the is_checkout property.
|
|
*
|
|
* @since 2.13.0
|
|
*
|
|
* @param boolean $is_checkout The property value.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function set_is_checkout( $is_checkout ) {
|
|
$this->is_checkout = (bool) $is_checkout;
|
|
}
|
|
}
|