Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1 @@
<?php // Silence is golden.

View File

@@ -0,0 +1,570 @@
<?php
/**
* Membership Actions
*
* @package restrict-content-pro
* @copyright Copyright (c) 2020, Sandhills Development, LLC
* @license GPL2+
* @since 3.0
*/
use RCP\Membership_Level;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Toggles off auto renew for a membership
*
* @since 3.4
*/
function rcp_process_membership_toggle_auto_renew_off() {
if ( ! isset( $_GET['rcp-action'] ) || $_GET['rcp-action'] !== 'disable_auto_renew' || empty( $_GET['membership-id'] ) ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'rcp_toggle_auto_renew_off' ) ) {
return;
}
$current_user = wp_get_current_user();
$membership = rcp_get_membership( absint( $_GET['membership-id'] ) );
if ( ! $membership instanceof RCP_Membership ) {
return;
}
// Bail if this user isn't actually the customer associated with this membership.
if ( $membership->get_user_id() != $current_user->ID ) {
wp_die( __( 'You do not have permission to perform this action.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 403 ) );
}
$success = $membership->toggle_auto_renew_off();
$redirect = remove_query_arg( array( 'rcp-action', '_wpnonce', 'membership-id' ), rcp_get_current_url() );
if ( true === $success ) {
$membership->add_note( __( 'Auto renew was disabled by the customer.', 'rcp' ) );
$redirect = add_query_arg( array(
'rcp-message' => 'auto-renew-disabled'
), $redirect );
} elseif( is_wp_error( $success ) ) {
$redirect = add_query_arg( array(
'rcp-message' => 'auto-renew-disable-failure',
'rcp-auto-renew-message' => rawurlencode( $success->get_error_message() )
), $redirect );
}
wp_redirect( $redirect );
exit;
}
add_action( 'template_redirect', 'rcp_process_membership_toggle_auto_renew_off' );
/**
* Toggles on auto renew for a membership
*
* @since 3.4
*/
function rcp_process_membership_toggle_auto_renew_on() {
if ( ! isset( $_GET['rcp-action'] ) || $_GET['rcp-action'] !== 'enable_auto_renew' || empty( $_GET['membership-id'] ) ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'rcp_toggle_auto_renew_on' ) ) {
return;
}
$current_user = wp_get_current_user();
$membership = rcp_get_membership( absint( $_GET['membership-id'] ) );
if ( ! $membership instanceof RCP_Membership ) {
return;
}
// Bail if this user isn't actually the customer associated with this membership.
if ( $membership->get_user_id() != $current_user->ID ) {
wp_die( __( 'You do not have permission to perform this action.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 403 ) );
}
$success = $membership->toggle_auto_renew_on();
$redirect = remove_query_arg( array( 'rcp-action', '_wpnonce', 'membership-id' ), rcp_get_current_url() );
if ( true === $success ) {
$membership->add_note( __( 'Auto renew was enabled by the customer.', 'rcp' ) );
$redirect = add_query_arg( array(
'rcp-message' => 'auto-renew-enabled'
), $redirect );
} elseif( is_wp_error( $success ) ) {
$redirect = add_query_arg( array(
'rcp-message' => 'auto-renew-enable-failure',
'rcp-auto-renew-message' => rawurlencode( $success->get_error_message() )
), $redirect );
}
wp_redirect( $redirect );
exit;
}
add_action( 'template_redirect', 'rcp_process_membership_toggle_auto_renew_on' );
/**
* Process membership cancellation via "Cancel" link.
*
* @see rcp_get_membership_cancel_url()
*
* @since 3.0
* @return void
*/
function rcp_process_membership_cancellation() {
if ( ! isset( $_GET['rcp-action'] ) || $_GET['rcp-action'] !== 'cancel' ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'rcp-cancel-nonce' ) ) {
return;
}
$membership = false;
$current_user = wp_get_current_user();
if ( ! empty( $_GET['membership-id'] ) ) {
$membership = rcp_get_membership( absint( $_GET['membership-id'] ) );
} elseif ( ! empty( $_GET['member-id'] ) ) {
// Support for old method of cancellation by user ID.
$customer = rcp_get_customer_by_user_id( get_current_user_id() );
$membership = rcp_get_customer_single_membership( $customer->get_user_id() );
}
// Bail if not successful in locating a membership.
if ( empty( $membership ) ) {
return;
}
// Bail if this user isn't actually the customer associated with this membership.
if ( $membership->get_user_id() != $current_user->ID ) {
wp_die( __( 'You do not have permission to perform this action.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 403 ) );
}
$success = $membership->cancel_payment_profile();
$redirect = remove_query_arg( array( 'rcp-action', '_wpnonce', 'membership-id', 'member-id' ), rcp_get_current_url() );
if ( is_wp_error( $success ) && false !== strpos( 'paypal', $membership->get_gateway() ) ) {
// No profile ID stored, so redirect to PayPal to cancel manually
$redirect = 'https://www.paypal.com/cgi-bin/customerprofileweb?cmd=_manage-paylist';
}
if ( true === $success ) {
$membership->add_note( sprintf( __( 'Membership cancelled by customer %s (#%d).', 'rcp' ), $current_user->user_login, $current_user->ID ) );
do_action( 'rcp_process_member_cancellation', get_current_user_id() );
$redirect = add_query_arg( array(
'profile' => 'cancelled',
'membership_id' => urlencode( $membership->get_id() )
), $redirect );
} elseif ( is_wp_error( $success ) ) {
$redirect = add_query_arg( 'cancellation_failure', urlencode( $success->get_error_message() ), $redirect );
}
wp_redirect( $redirect );
exit;
}
add_action( 'template_redirect', 'rcp_process_membership_cancellation' );
/**
* When a payment is completed, increment the `times_billed` for the corresponding membership.
*
* @param int $payment_id ID of the payment.
*
* @since 3.0
* @return void
*/
function rcp_increment_membership_times_billed( $payment_id ) {
/**
* @var RCP_Payments $rcp_payments_db
*/
global $rcp_payments_db;
$payment = $rcp_payments_db->get_payment( $payment_id );
if ( empty( $payment->membership_id ) ) {
return;
}
$membership = rcp_get_membership( $payment->membership_id );
if ( ! empty( $membership ) ) {
$membership->increment_times_billed();
}
}
add_action( 'rcp_update_payment_status_complete', 'rcp_increment_membership_times_billed', 999 );
/**
* Run a second membership status transition hook that includes the new status in the hook name. For example:
* rcp_transition_membership_status_active
* rcp_transition_membership_status_expired
*
* @param string $old_status Previous status, before the update.
* @param string $new_status New status being set.
* @param int $membership_id ID of the membership.
*
* @since 3.0
* @return void
*/
function rcp_transition_membership_status_hook( $old_status, $new_status, $membership_id ) {
/**
* @param string $old_status
* @param int $membership_id
*/
do_action( 'rcp_transition_membership_status_' . sanitize_key( $new_status ), $old_status, $membership_id );
if ( has_action( 'rcp_set_status' ) || has_action( 'rcp_set_status_' . $new_status ) ) {
$membership = rcp_get_membership( $membership_id );
$member = new RCP_Member( $membership->get_user_id() );
/**
* @deprecated 3.0 Use `rcp_transition_membership_status` instead.
*/
do_action( 'rcp_set_status', $new_status, $member->ID, $old_status, $member );
/**
* @deprecated 3.0 Use `rcp_transition_membership_status_{$new_status}` instead.
*/
do_action( "rcp_set_status_{$new_status}", $member->ID, $old_status, $member );
}
}
add_action( 'rcp_transition_membership_status', 'rcp_transition_membership_status_hook', 10, 3 );
/**
* Removes the membership level assigned role from a customer when their membership expires.
*
* Note: `administrator` role is never removed.
*
* @param string $old_status Previous membership status.
* @param int $membership_id ID of the membership.
*
* @since 3.0
* @return void
*/
function rcp_update_expired_membership_role( $old_status, $membership_id ) {
$membership = rcp_get_membership( $membership_id );
$membership_level = rcp_get_membership_level( $membership->get_object_id() );
$default_role = get_option( 'default_role', 'subscriber' );
if ( $membership_level instanceof Membership_Level && $membership_level->get_role() !== $default_role && 'administrator' !== $membership_level->get_role() ) {
$user = get_userdata( $membership->get_user_id() );
$user->remove_role( $membership_level->get_role() );
}
}
add_action( 'rcp_transition_membership_status_expired', 'rcp_update_expired_membership_role', 10, 2 );
/**
* Add a log when the membership expires.
*
* @param string $old_status Previous membership status.
* @param int $membership_id ID of the membership.
*
* @since 3.4
*/
function rcp_add_membership_expired_log( $old_status, $membership_id ) {
$membership = rcp_get_membership( $membership_id );
RCP\Logs\add_log( array(
'object_type' => 'membership',
'object_id' => $membership_id,
'user_id' => $membership->get_user_id(),
'type' => 'membership_expired',
'title' => __( 'Membership expired', 'rcp' ),
) );
}
add_action( 'rcp_transition_membership_status_expired', 'rcp_add_membership_expired_log', 10, 2 );
/**
* When a membership's object ID changes, remove the user role from the old level, and add the user role from the
* new level. This isn't actually used, but is just here in case people do weird things.
*
* @param int $old_object_id Old membership level ID.
* @param int $new_object_id New membership level ID.
* @param int $membership_id ID of the membership.
*
* @since 3.0
* @return void
*/
function rcp_update_user_role_on_membership_object_id_transition( $old_object_id, $new_object_id, $membership_id ) {
if ( $old_object_id == $new_object_id || 'new' == $old_object_id ) {
return;
}
$old_membership_level = rcp_get_membership_level( $old_object_id );
$new_membership_level = rcp_get_membership_level( $new_object_id );
$membership = rcp_get_membership( $membership_id );
if ( ! $membership instanceof RCP_Membership || ! $new_membership_level instanceof Membership_Level ) {
return;
}
// Don't try to change anything if the membership isn't active.
if ( ! $membership->is_active() ) {
return;
}
rcp_log( sprintf( 'Detected object ID change for membership #%d. Editing user role.', $membership_id ) );
$user = get_userdata( $membership->get_user_id() );
if ( empty( $user ) ) {
rcp_log( 'Invalid user. Exiting.' );
return;
}
/*
* Remove the old role.
* Note: `administrator` role is never removed.
*/
$old_role = get_option( 'default_role', 'subscriber' );
$old_role = !$old_membership_level instanceof Membership_Level ? $old_membership_level->get_role() : $old_role;
if ( 'administrator' !== $old_role ) {
rcp_log( sprintf( 'Removing role %s from user #%d.', $old_role, $user->ID ) );
$user->remove_role( $old_role );
}
/*
* Add the new role.
*/
$new_role = $new_membership_level->get_role();
$new_role = apply_filters( 'rcp_default_user_level', $new_role, $new_membership_level->get_id() );
if ( ! in_array( $new_role, $user->roles ) ) {
rcp_log( sprintf( 'Adding role %s to user #%d.', $new_role, $user->ID ) );
$user->add_role( $new_role );
}
}
add_action( 'rcp_transition_membership_object_id', 'rcp_update_user_role_on_membership_object_id_transition', 10, 3 );
/**
* Run activation sequence if new membership is being added with status "active". This adds the user role to
* the customer and sends the activation email.
*
* @param int $membership_id
* @param array $data
*
* @since 3.0
*/
function rcp_activate_membership_on_insert( $membership_id, $data ) {
$membership = rcp_get_membership( $membership_id );
if ( 'active' == $membership->get_status() ) {
$membership->activate();
}
}
add_action( 'rcp_new_membership_added', 'rcp_activate_membership_on_insert', 10, 2 );
/**
* When a new membership is added as an upgrade/downgrade from another membership, add a note to the new membership.
*
* @param int $membership_id
* @param array $data
*
* @since 3.0.3
*/
function rcp_add_membership_level_change_note( $membership_id, $data ) {
$membership = rcp_get_membership( $membership_id );
// Add user note designating this as an upgrade/downgrade.
if ( $membership->was_upgrade() ) {
$old_membership = rcp_get_membership( $membership->get_upgraded_from() );
$note = sprintf( __( 'Membership changed from %s (ID #%d) to %s (ID #%d).', 'rcp' ), $old_membership->get_membership_level_name(), $old_membership->get_id(), $membership->get_membership_level_name(), $membership->get_id() );
$membership->add_note( $note );
$membership->get_customer()->add_note( $note );
}
}
add_action( 'rcp_new_membership_added', 'rcp_add_membership_level_change_note', 10, 2 );
/**
* Disable other memberships when a new membership is activated.
*
* If multiple memberships is not enabled: all other memberships get disabled.
* If multiple memberships is enabled: only the membership this one was upgraded from gets disabled.
*
* @param int $membership_id
* @param RCP_Membership $membership
*
* @since 3.0
* @return void
*/
function rcp_disable_memberships_on_activate( $membership_id, $membership ) {
if ( ! rcp_multiple_memberships_enabled() ) {
/*
* If multiple memberships is NOT enabled, then we always disable all other memberships
* when a new one is activated. We only allow one at a time.
*/
$membership->get_customer()->disable_memberships( $membership_id );
} elseif ( $membership->was_upgrade() ) {
/*
* If multiple memberships IS enabled, then we only disable the membership this new one
* was upgraded/downgraded from.
*/
$previous_membership_id = $membership->get_upgraded_from();
$previous_membership = rcp_get_membership( $previous_membership_id );
if ( ! empty( $previous_membership ) ) {
$previous_membership->disable();
}
}
}
add_action( 'rcp_membership_pre_activate', 'rcp_disable_memberships_on_activate', 10, 2 );
/**
* Disable memberships when a membership is renewed.
*
* This was introduced along with payment recovery because that feature made it so
* old memberships might be re-enabled, but not necessarily activated. So we need
* a secondary check to make sure multiple memberships get properly disabled.
*
* @param string $expiration New expiration date.
* @param int $membership_id ID of the membership.
* @param RCP_Membership $membership Membership object.
*
* @since 3.2.3
* @return void
*/
function rcp_disable_memberships_on_renewal( $expiration, $membership_id, $membership ) {
if ( ! rcp_multiple_memberships_enabled() ) {
/*
* If multiple memberships is NOT enabled, then we always disable all other memberships
* when a new one is activated. We only allow one at a time.
*/
if ( ! empty( $membership ) ) {
$membership->get_customer()->disable_memberships( $membership_id );
}
} elseif ( $membership->was_upgrade() ) {
/*
* If multiple memberships IS enabled, then we only disable the membership this new one
* was upgraded/downgraded from.
*/
$previous_membership_id = $membership->get_upgraded_from();
$previous_membership = rcp_get_membership( $previous_membership_id );
if ( ! empty( $previous_membership ) ) {
$previous_membership->disable();
}
}
}
add_action( 'rcp_membership_post_renew', 'rcp_disable_memberships_on_renewal', 10, 3 );
/**
* Removes the expiration/renewal reminder flags when a membership is renewed. This allows the reminders to be re-sent
* for the next membership period.
*
* @param string $expiration New expiration date.
* @param int $membership_id ID of the membership.
* @param RCP_Membership $membership Membership object.
*
* @since 3.0
* @return void
*/
function rcp_remove_membership_reminder_flags( $expiration, $membership_id, $membership ) {
global $wpdb;
$membership_meta_table = restrict_content_pro()->membership_meta_table->get_table_name();
$query = $wpdb->prepare( "DELETE FROM {$membership_meta_table} WHERE rcp_membership_id = %d AND meta_key LIKE %s", $membership->get_id(), '_reminder_sent_%' );
$wpdb->query( $query );
// Let's also remove our deprecated keys. We can remove this sometime in the future.
$user_id = $membership->get_user_id();
if ( ! empty( $user_id ) ) {
$query = $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key LIKE %s", $user_id, '_rcp_reminder_sent_' . absint( $membership->get_id() ) . '_%' );
$wpdb->query( $query );
}
}
add_action( 'rcp_membership_post_renew', 'rcp_remove_membership_reminder_flags', 10, 3 );
/**
* Disable memberships when a user account is deleted. This cancels recurring billing and disables the
* memberships, as they're irrelevant without a user account.
*
* @param int $user_id ID of the user being deleted.
* @param bool $reassign ID of the user to reassign posts and links to.
*
* @since 3.0
* @return void
*/
function rcp_disable_memberships_on_user_delete( $user_id, $reassign ) {
$customer = rcp_get_customer_by_user_id( $user_id );
// No customer - bail.
if ( empty( $customer ) ) {
return;
}
rcp_log( sprintf( 'Disabling memberships for customer #%d, as associated user account #%d was deleted.', $customer->get_id(), $user_id ) );
// Disable memberships.
$customer->disable_memberships();
// Delete customer.
rcp_delete_customer( $customer->get_id() );
}
add_action( 'delete_user', 'rcp_disable_memberships_on_user_delete', 10, 2 );

View File

@@ -0,0 +1,665 @@
<?php
/**
* Membership Functions
*
* @package restrict-content-pro
* @copyright Copyright (c) 2018, Restrict Content Pro team
* @license GPL2+
* @since 3.0
*/
use RCP\Membership_Level;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Get a single membership by its ID.
*
* @param int $membership_id
*
* @since 3.0
* @return RCP_Membership|false
*/
function rcp_get_membership( $membership_id ) {
$memberships = new RCP\Database\Queries\Membership();
return $memberships->get_item( $membership_id );
}
/**
* Get a membership by a field/value pair.
*
* @param string $field Column to search in.
* @param string $value Value of the row.
*
* @since 3.0
* @return RCP_Membership|false
*/
function rcp_get_membership_by( $field = '', $value = '' ) {
/*
* We don't use \RCP\Database\Queries\Membership::get_item_by() because that may return
* disabled memberships, and thus have unexpected results. Using rcp_get_memberships()
* allows us to check enabled memberships only more easily.
*/
$memberships = rcp_get_memberships( array(
$field => $value,
'number' => 1
) );
if ( empty( $memberships ) ) {
return false;
}
return reset( $memberships );
}
/**
* Returns an array of all memberships.
*
* @param array $args {
* Optional. Array or query string of membership query parameters.
* Default empty.
*
* @type int $id A membership ID to only return that membership. Default empty.
* @type array $id__in Array of membership IDs to include. Default empty.
* @type array $id__not_in Array of membership IDs to exclude. Default empty.
* @type int $customer_id A customer ID to only return this customer's memberships. Default
* empty.
* @type array $customer_id__in Array of customer IDs to include. Default empty.
* @type array $customer_id__not_in Array of customer IDs to exclude. Default empty.
* @type string $object_id An object ID to only return memberships for this object. Default
* empty.
* @type array $object_id__in Array of object IDs to include. Default empty.
* @type array $object_id__not_in Array of object IDs to exclude. Default empty.
* @type string $object_type An object type to only return this type. Default empty.
* @type array $object_type__in Array of object types to include. Default empty.
* @type array $object_type__not_in Array of object types to exclude. Default empty.
* @type string $currency A currency to only show memberships using this currency. Default
* empty.
* @type array $date_query Query all datetime columns together. See WP_Date_Query.
* @type array $created_date_query Date query clauses to limit memberships by. See WP_Date_Query.
* Default null.
* @type array $trial_end_date_query Date query clauses to limit by. See WP_Date_Query. Default null.
* @type array $renewed_date_query Date query clauses to limit by. See WP_Date_Query. Default null.
* @type array $cancellation_date_query Date query clauses to limit by. See WP_Date_Query. Default null.
* @type array $expiration_date_query Date query clauses to limit by. See WP_Date_Query. Default null.
* @type array $date_modified_query Date query clauses to limit by. See WP_Date_Query. Default null.
* @type int $auto_renew Auto renewal status. Default null.
* @type string $status A status to filter by. Default null for all statuses.
* @type array $status__in Array of statuses to include. Default empty.
* @type array $status__not_in Array of statuses to exclude. Default empty.
* @type string $gateway_customer_id A gateway customer ID to search for. Default empty.
* @type string $gateway_subscription_id A gateway subscription ID to search for. Default empty.
* @type string $gateway A gateway to filter by. Default empty.
* @type string $subscription_key A subscription key to filter by. Default empty.
* @type int $upgraded_from A membership ID this membership upgraded from. Default empty.
* @type int $disabled Whether or not to show disabled memberships. Set to `0` to only
* include enabled memberships, set to `1` to only include disabled
* memberships, set to empty string to include both. Default 0.
* @type bool $count Whether to return a membership count (true) or array of membership
* objects. Default false.
* @type string $fields Item fields to return. Accepts any column known names
* or empty (returns an array of complete membership objects). Default
* empty.
* @type int $number Limit number of memberships to retrieve. Default 20.
* @type int $offset Number of memberships to offset the query. Used to build LIMIT
* clause. Default 0.
* @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
* @type string|array $orderby Accepts 'id', 'object_id', 'object_type', 'currency',
* `initial_amount`, `recurring_amount`, `created_date`,
* `trial_end_date`, `cancellation_date`, `expiration_date`,
* `times_billed`, `maximum_renewals`, `status`,
* `gateway_customer_id`, `gateway_subscription_id`, and
* `subscription_key`. Also accepts false, an empty array, or 'none'
* to disable `ORDER BY` clause. Default 'id'.
* @type string $order How to order results. Accepts 'ASC', 'DESC'. Default 'DESC'.
* @type string $search Search term(s) to retrieve matching memberships for. Default empty.
* @type bool $update_cache Whether to prime the cache for found memberships. Default false.
* }
*
* @since 3.0
* @return RCP_Membership[] Array of RCP_Membership objects.
*/
function rcp_get_memberships( $args = array() ) {
$args = wp_parse_args( $args, array(
'number' => 20,
'disabled' => 0
) );
$memberships = new RCP\Database\Queries\Membership();
return $memberships->query( $args );
}
/**
* Count the number of memberships.
*
* @param array $args Array of query arguments to override the defaults.
*
* @see rcp_get_memberships() for accepted arguments.
*
* @since 3.0
* @return int
*/
function rcp_count_memberships( $args = array() ) {
$args = wp_parse_args( $args, array(
'count' => true,
'disabled' => 0
) );
$memberships = new RCP\Database\Queries\Membership( $args );
return absint( $memberships->found_items );
}
/**
* Query for and return array of membership counts, keyed by status.
*
* @param array $args Query arguments to override the defaults.
*
* @since 3.0
* @return array
*/
function rcp_get_membership_counts( $args = array() ) {
$args = wp_parse_args( $args, array(
'count' => true,
'disabled' => 0,
'groupby' => 'status'
) );
$memberships = new RCP\Database\Queries\Membership( $args );
return rcp_format_counts( $memberships, $args['groupby'] );
}
/**
* Add a new membership.
*
* @param array $data {
* Array of arguments.
*
* @type int $customer_id Required. ID of the customer.
* @type int $object_id Optional. Object ID. Typically the membership level ID.
* @type string $object_type Optional. Object type. Default is `membership`.
* @type string $currency Optional. Currency used for the membership. Default is the return value of
* `rcp_get_currency()`.
* @type string $initial_amount Optional. Amount charged on initial registration.
* @type string $recurring_amount Optional. Amount charged on renewals.
* @type string $created_date Optional. Date the membership was created. Default is now.
* @type string $trial_end_date Optional. Date the integrated free trial ends. Leave blank for no trial.
* @type string $renewed_date Optional. Date the membership was last renewed. Leave blank for none.
* @type string $cancellation_date Optional. Date this membership was cancelled.
* @type string $expiration_date Optional. Expiration date. Leave blank to auto calculate.
* @type bool $auto_renew Optional. Whether or not this membership automatically renews. Default is
* false.
* @type int $times_billed Optional. Number of times this membership has been billed for so far.
* Default is 0.
* @type int $maximum_renewals Optional. Maximum number of renewals to process. Default is 0 for
* indefinite.
* @type string $status Optional. Membership status. Default is `pending`.
* @type string $gateway_customer_id Optional. Customer ID at the payment gateway.
* @type string $gateway_subscription_id Optional. Subscription ID at the payment gateway.
* @type string $gateway Optional. Payment gateway used for this membership.
* @type string $signup_method Optional. Method used to signup. Default is `live`.
* @type string $subscription_key Optional. Subscription key.
* @type string $notes Optional. Membership notes.
* @type int $upgraded_from Optional. ID of the membership this one was upgraded from.
* @type string $date_modified Optional. Date the membership was last modified.
* @type int $disabled Optional. Whether or not this membership is disabled
* (`0` = not disabled; `1` = disabled). Default is `0`.
* }
*
* @since 3.0
* @return int|false ID of the new membership, or false on failure.
*/
function rcp_add_membership( $data = array() ) {
$defaults = array(
'customer_id' => 0,
'user_id' => null,
'object_id' => 0,
'object_type' => 'membership',
'currency' => rcp_get_currency(),
'initial_amount' => false,
'recurring_amount' => false,
'created_date' => current_time( 'mysql' ),
'expiration_date' => '',
'auto_renew' => false,
'times_billed' => 0,
'maximum_renewals' => 0,
'status' => 'pending',
'signup_method' => 'live',
'disabled' => 0
);
$data = wp_parse_args( $data, $defaults );
// Customer ID is required.
if ( empty( $data['customer_id'] ) ) {
rcp_log( sprintf( 'Failed to add new membership - customer ID is missing. Data: %s', var_export( $data, true ) ) );
return false;
}
$membership_level = rcp_get_membership_level( $data['object_id'] );
if ( ! $membership_level instanceof Membership_Level ) {
return false;
}
$customer = rcp_get_customer( $data['customer_id'] );
$has_trial = $membership_level->has_trial() || ( $membership_level->is_free() && ! $membership_level->is_lifetime() );
$set_trial = ( $has_trial && ! $customer->has_trialed() );
$expiration_date = ! empty( $data['object_id'] ) ? rcp_calculate_subscription_expiration( $data['object_id'], $set_trial ) : '';
// Populate user_id if not provided.
if ( empty( $data['user_id'] ) && $customer instanceof RCP_Customer ) {
$data['user_id'] = $customer->get_user_id();
}
// Convert "free" status to "active".
if ( ! empty( $data['status'] ) && 'free' === $data['status'] ) {
$data['status'] = 'active';
}
if ( has_filter( 'rcp_member_calculated_expiration' ) ) {
/**
* @deprecated 3.0 Use `rcp_membership_calculated_expiration_date` instead.
*/
$expiration_date = apply_filters( 'rcp_member_calculated_expiration', $expiration_date, $customer->get_user_id(), $customer->get_member() );
}
// Auto calculate expiration.
if ( empty( $data['expiration_date'] ) && ! empty( $expiration_date ) ) {
$data['expiration_date'] = $expiration_date;
}
if ( 'none' == $data['expiration_date'] ) {
$data['expiration_date'] = null;
}
// Auto calculate trial end date.
if ( $set_trial && empty( $data['trial_end_date'] ) && ! empty( $expiration_date ) ) {
$data['trial_end_date'] = $expiration_date;
}
// If amounts were not provided, attempt to guess them from the membership level.
if ( false === $data['initial_amount'] ) {
$data['initial_amount'] = $membership_level->get_fee() + $membership_level->get_price();
}
if ( false === $data['recurring_amount'] ) {
$data['recurring_amount'] = $membership_level->get_price();
}
// Make sure all empty amounts are `0.00` for consistency.
if ( empty( $data['initial_amount'] ) || '0' == $data['initial_amount'] ) {
$data['initial_amount'] = '0.00';
}
if ( empty( $data['recurring_amount'] ) || '0' == $data['recurring_amount'] ) {
$data['recurring_amount'] = '0.00';
}
// Change auto renew to an integer.
$data['auto_renew'] = ! empty( $data['auto_renew'] ) ? 1 : 0;
// Remove "notes" for our log because it's annoying.
$log_data = $data;
if ( isset( $log_data['notes'] ) ) {
unset( $log_data['notes'] );
}
rcp_log( sprintf( 'Adding new membership. Data: %s', var_export( $log_data, true ) ) );
$memberships = new RCP\Database\Queries\Membership();
$membership_id = $memberships->add_item( $data );
if ( $membership_id ) {
/**
* Triggers after a new membership is added.
*
* @param int $membership_id ID of the membership that was just added.
* @param array $data Membership data.
*
* @since 3.0
*/
do_action( 'rcp_new_membership_added', $membership_id, $data );
return $membership_id;
}
return false;
}
/**
* Update a membership record in the database.
*
* @param int $membership_id ID of the membership to update.
* @param array $data {
* Array of data to update. Accepts:
*
* @type int $customer_id Required. ID of the customer.
* @type int $object_id Optional. Object ID. Typically the membership level ID.
* @type string $object_type Optional. Object type. Default is `membership`.
* @type string $currency Optional. Currency used for the membership. Default is the return value of
* `rcp_get_currency()`.
* @type string $initial_amount Optional. Amount charged on initial registration.
* @type string $recurring_amount Optional. Amount charged on renewals.
* @type string $created_date Optional. Date the membership was created. Default is now.
* @type string $trial_end_date Optional. Date the integrated free trial ends. Leave blank for no trial.
* @type string $renewed_date Optional. Date the membership was last renewed.
* @type string $cancellation_date Optional. Date this membership was cancelled.
* @type string $expiration_date Optional. Expiration date. Leave blank to auto calculate.
* @type bool $auto_renew Optional. Whether or not this membership automatically renews. Default is
* false.
* @type int $times_billed Optional. Number of times this membership has been billed for so far.
* Default is 0.
* @type int $maximum_renewals Optional. Maximum number of renewals to process. Default is 0 for
* indefinite.
* @type string $status Optional. Membership status. Default is `pending`.
* @type string $gateway_customer_id Optional. Customer ID at the payment gateway.
* @type string $gateway_subscription_id Optional. Subscription ID at the payment gateway.
* @type string $gateway Optional. Payment gateway used for this membership.
* @type string $signup_method Optional. Method used to signup. Default is `live`.
* @type string $subscription_key Optional. Subscription key.
* @type string $notes Optional. Membership notes.
* @type int $upgraded_from Optional. ID of the membership this one was upgraded from.
* @type int $disabled Optional. Whether or not this membership is disabled
* (`0` = not disabled; `1` = disabled). Default is `0`.
* }
*
* @since 3.0
* @return bool True on success, false on failure.
*/
function rcp_update_membership( $membership_id, $data = array() ) {
$membership = rcp_get_membership( $membership_id );
return $membership->update( $data );
}
/**
* Delete a membership record
*
* This will rarely want to be done. Most memberships should probably be disabled instead.
*
* @see RCP_Membership::disable()
*
* @param int $membership_id ID of the membership to delete.
*
* @since 3.0
* @return bool
*/
function rcp_delete_membership( $membership_id ) {
//@todo other stuff to clean up
$memberships = new \RCP\Database\Queries\Membership();
return $memberships->delete_item( $membership_id );
}
/**
* Get the prorate credit amount for a membership.
*
* @param int $membership_id ID of the membership to check.
*
* @since 3.0
* @return float|int
*/
function rcp_get_membership_prorate_credit( $membership_id ) {
$membership = rcp_get_membership( $membership_id );
return $membership->get_prorate_credit_amount();
}
/**
* Determines whether or not a membership can have the billing card updated.
*
* @param int|RCP_Membership $membership_id_or_object ID of the membership or membership object.
*
* @since 3.0
* @return bool
*/
function rcp_can_update_membership_billing_card( $membership_id_or_object ) {
if ( ! is_object( $membership_id_or_object ) ) {
$membership = rcp_get_membership( $membership_id_or_object );
} else {
$membership = $membership_id_or_object;
}
if ( empty( $membership ) ) {
return false;
}
return $membership->can_update_billing_card();
}
/**
* Get the renewal URL for a membership.
*
* @param int $membership_id
*
* @since 3.1
* @return string
*/
function rcp_get_membership_renewal_url( $membership_id ) {
$url = add_query_arg( array(
'registration_type' => 'renewal',
'membership_id' => urlencode( $membership_id )
), rcp_get_registration_page_url() );
return $url;
}
/**
* Get the upgrade URL for a membership.
*
* @param int $membership_id
*
* @since 3.1
* @return string
*/
function rcp_get_membership_upgrade_url( $membership_id ) {
$url = add_query_arg( array(
'registration_type' => 'upgrade',
'membership_id' => urlencode( $membership_id )
),rcp_get_registration_page_url() );
return $url;
}
/**
* Get the cancellation URL for a membership.
*
* @param int $membership_id ID of the membership to get the cancel URL for.
*
* @since 3.0
* @return string
*/
function rcp_get_membership_cancel_url( $membership_id ) {
$url = '';
$membership = rcp_get_membership( $membership_id );
if ( $membership->is_recurring() ) {
$url = wp_nonce_url( add_query_arg( array( 'rcp-action' => 'cancel', 'membership-id' => urlencode( $membership_id ) ) ), 'rcp-cancel-nonce' );
}
/**
* @deprecated 3.0 Use `rcp_membership_cancel_url` instead.
*/
$url = apply_filters( 'rcp_member_cancel_url', $url, $membership->get_user_id() );
/**
* Filters the membership cancel URL.
*
* @param string $url Cancellation URL.
* @param int $membership_id ID of the membership.
* @param RCP_Membership $membership Membership object.
*
* @since 3.0
*/
$url = apply_filters( 'rcp_membership_cancel_url', $url, $membership_id, $membership );
return $url;
}
/**
* Cancel membership payment profile at the payment gateway.
*
* @param int $membership_id ID of the membership.
* @param bool $set_status Whether or not to set the membership status to "cancelled".
*
* @since 3.0
* @return true|WP_Error
*/
function rcp_cancel_membership_payment_profile( $membership_id, $set_status = true ) {
$membership = rcp_get_membership( $membership_id );
return $membership->cancel_payment_profile( $set_status );
}
/**
* Determines if a membership can be cancelled on site.
*
* @param int $membership_id ID of the membership.
*
* @since 3.0
* @return bool
*/
function rcp_can_membership_be_cancelled( $membership_id ) {
$membership = rcp_get_membership( $membership_id );
return $membership->can_cancel();
}
/**
* Determines if a membership is recurring.
*
* @param int $membership_id ID of the membership to check.
*
* @since 3.0
* @return bool
*/
function rcp_membership_is_recurring( $membership_id ) {
$membership = rcp_get_membership( $membership_id );
return $membership->is_recurring();
}
/**
* Determines if a membership is expired.
*
* @param int $membership_id ID of the membership to check.
*
* @since 3.0
* @return bool
*/
function rcp_membership_is_expired( $membership_id ) {
$membership = rcp_get_membership( $membership_id );
return $membership->is_expired();
}
/**
* Determines if a membership is active.
*
* @param int $membership_id ID of the membership to check.
*
* @since 3.0
* @return bool
*/
function rcp_membership_is_active( $membership_id ) {
$membership = rcp_get_membership( $membership_id );
return $membership->is_active();
}
/**
* Determines whether a membership grants access to a specific access level.
*
* @param int $membership_id ID of the membership to check.
* @param int $access_level Access level to compare against.
*
* @since 3.0
* @return bool
*/
function rcp_membership_has_access_level( $membership_id, $access_level = 0 ) {
$membership = rcp_get_membership( $membership_id );
return $membership->has_access_level( $access_level );
}
/**
* Whether or not customers can have multiple memberships at a time.
*
* @since 3.0
* @return bool
*/
function rcp_multiple_memberships_enabled() {
global $rcp_options;
return isset( $rcp_options['multiple_memberships'] );
}
/**
* Prints or returns a membership status in a nice format that is localized.
*
* @param int $membership_id ID of the membership.
* @param bool $echo Whether to print (TRUE) or return (FALSE) the status.
*
* @since 3.0
* @return string
*/
function rcp_print_membership_status( $membership_id, $echo = true ) {
$membership = rcp_get_membership( $membership_id );
$status = $membership->get_status();
$print_status = rcp_get_status_label( $status );
if ( $echo ) {
echo $print_status;
}
return $print_status;
}

View File

@@ -0,0 +1,93 @@
<?php
/**
* Membership Meta Functions
*
* @package restrict-content-pro
* @copyright Copyright (c) 2019, Restrict Content Pro team
* @license GPL2+
* @since 3.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Add meta data field to a membership.
*
* @param int $membership_id Membership ID.
* @param string $meta_key Meta data name.
* @param mixed $meta_value Meta data value. Must be serializable if non-scalar.
* @param bool $unique Optional. Whether the same key should not be added. Default false.
*
* @since 3.0
* @return false|int
*/
function rcp_add_membership_meta( $membership_id, $meta_key, $meta_value, $unique = false ) {
return add_metadata( 'rcp_membership', $membership_id, $meta_key, $meta_value, $unique );
}
/**
* Remove meta data matching criteria from a membership.
*
* You can match based on the key, or key and value. Removing based on key and value, will keep from removing duplicate
* meta data with the same key. It also allows removing all meta data matching key, if needed.
*
* @param int $membership_id Membership ID.
* @param string $meta_key Meta data name.
* @param mixed $meta_value Meta data value. Must be serializable if non-scalar. Default empty.
*
* @since 3.0
* @return false|int
*/
function rcp_delete_membership_meta( $membership_id, $meta_key, $meta_value = '' ) {
return delete_metadata( 'rcp_membership', $membership_id, $meta_key, $meta_value );
}
/**
* Retrieve membership meta field for a membership.
*
* @param int $membership_id Membership ID.
* @param string $key Optional. The meta key to retrieve. By default, returns data for all keys. Default
* empty.
* @param bool $single Optional, default is false. If true, return only the first value of the specified
* meta_key. This parameter has no effect if meta_key is not specified.
*
* @since 3.0
* @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true.
*/
function rcp_get_membership_meta( $membership_id, $key = '', $single = false ) {
return get_metadata( 'rcp_membership', $membership_id, $key, $single );
}
/**
* Update membership meta field based on membership ID.
*
* Use the $prev_value parameter to differentiate between meta fields with the
* same key and membership ID.
*
* If the meta field for the membership does not exist, it will be added.
*
* @param int $membership_id Membership ID.
* @param string $meta_key Meta data key.
* @param mixed $meta_value Meta data value. Must be serializable if non-scalar.
* @param mixed $prev_value Optional. Previous value to check before removing. Default empty.
*
* @since 3.0
* @return int|false Meta ID if the key didn't exist, true on successful update, false on failure.
*/
function rcp_update_membership_meta( $membership_id, $meta_key, $meta_value, $prev_value = '' ) {
return update_metadata( 'rcp_membership', $membership_id, $meta_key, $meta_value, $prev_value );
}
/**
* Delete everything from membership meta matching meta key.
*
* @param string $meta_key Key to search for when deleting.
*
* @since 3.0
* @return bool Whether the membership meta key was deleted from the database.
*/
function rcp_delete_membership_meta_by_key( $meta_key ) {
return delete_metadata( 'rcp_membership', null, $meta_key, '', true );
}