Current File : /home/pacjaorg/www/copwordpres/wp-content/plugins/optinmonster/OMAPI/MemberPress/Rules.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;
}
}