Files
roi-theme/wp-content/plugins/rcp-rest-api/includes/routes/v1/class-memberships-route.php
root a22573bf0b 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>
2025-11-03 21:04:30 -06:00

407 lines
11 KiB
PHP
Executable File

<?php
/**
* Membership Route
*
* @package rcp
* @copyright Copyright (c) 2019, Restrict Content Pro team
* @license GPL2+
* @since 1.1
*/
class RCP_REST_API_Membership_Route_V1 extends RCP_REST_API_Route {
/**
* Array of whitelisted membership fields.
*
* @var array
*/
private $membership_fields;
/**
* Get things started
*
* @since 1.0
*/
public function init() {
$this->id = 'memberships';
// Whitelist of membership fields that can be altered and their associated query arg name.
$this->membership_fields = array(
'id',
'customer_id',
'object_id',
'object_type',
'currency',
'initial_amount',
'recurring_amount',
'created_date',
'trial_end_date',
'renewed_date',
'cancellation_date',
'expiration_date',
'payment_plan_completed_date',
'auto_renew',
'times_billed',
'maximum_renewals',
'status',
'gateway_customer_id',
'gateway_subscription_id',
'gateway',
'signup_method',
'subscription_key',
'notes',
'upgraded_from',
'disabled'
);
}
/**
* Register our routes
*
* @since 1.0
*/
public function register_v1_routes() {
parent::register_v1_routes();
// Renew a membership
register_rest_route( 'rcp/v1', '/' . $this->id . '/(?P<id>\d+)/renew', array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'renew_membership' ),
'permission_callback' => array( $this, 'can_edit' ),
'args' => array(
'id' => array(
'required' => true,
'sanitize_callback' => function ( $param, $request, $key ) {
return absint( $param );
}
),
'recurring' => array(
'sanitize_callback' => function ( $param, $request, $key ) {
return filter_var( $param, FILTER_VALIDATE_BOOLEAN );
}
),
'status' => array(
'default' => 'active',
'validate_callback' => function ( $param, $request, $key ) {
$statuses = array( 'pending', 'active', 'cancelled', 'expired' );
return in_array( $param, $statuses );
},
'sanitize_callback' => function ( $param, $request, $key ) {
return sanitize_text_field( strtolower( $param ) );
}
),
'expiration' => array(
'validate_callback' => function ( $param, $request, $key ) {
return false !== strtotime( $param );
},
'sanitize_callback' => function ( $param, $request, $key ) {
return date( 'Y-m-d H:i:s', strtotime( $param ) );
}
),
)
) );
// Cancel a membership
register_rest_route( 'rcp/v1', '/' . $this->id . '/(?P<id>\d+)/cancel', array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'cancel_membership' ),
'permission_callback' => array( $this, 'can_edit' ),
'args' => array(
'id' => array(
'required' => true,
'sanitize_callback' => function ( $param, $request, $key ) {
return absint( $param );
}
)
)
) );
}
/**
* @param RCP_Membership $membership
*
* @since 1.1
* @return object
*/
private function format_membership( RCP_Membership $membership ) {
$data = new stdClass();
$data->id = $membership->get_id();
$data->customer_id = $membership->get_customer_id();
$data->object_id = $membership->get_object_id();
$data->object_type = $membership->get_object_type();
$data->currency = $membership->get_currency();
$data->initial_amount = $membership->get_initial_amount();
$data->recurring_amount = $membership->get_recurring_amount();
$data->created_date = $membership->get_created_date( false );
$data->trial_end_date = $membership->get_trial_end_date();
$data->renewed_date = $membership->get_renewed_date( false );
$data->cancellation_date = $membership->get_cancellation_date( false );
$data->expiration_date = $membership->get_expiration_date( false );
$data->payment_plan_completed_date = $membership->get_payment_plan_completed_date();
$data->auto_renew = $membership->is_recurring();
$data->times_billed = $membership->get_times_billed();
$data->maximum_renewals = $membership->get_maximum_renewals();
$data->status = $membership->get_status();
$data->gateway_customer_id = $membership->get_gateway_customer_id();
$data->gateway_subscription_id = $membership->get_gateway_subscription_id();
$data->gateway = $membership->get_gateway();
$data->signup_method = $membership->get_signup_method();
$data->subscription_key = $membership->get_subscription_key();
$data->notes = $membership->get_notes();
$data->upgraded_from = $membership->get_upgraded_from();
$data->disabled = $membership->is_disabled();
return $data;
}
/**
* Get data
*
* If the `id` parameter is provided then information about a single membership is retrieved.
* Otherwise, an array of membership results is returned.
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response
*/
public function get_data( WP_REST_Request $request ) {
if ( $request->get_param( 'id' ) ) {
/**
* Get single membership by ID.
*/
$membership = rcp_get_membership( absint( $request->get_param( 'id' ) ) );
if ( empty( $membership ) ) {
return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 );
}
return new WP_REST_Response( $this->format_membership( $membership ) );
} else {
/**
* Get array of memberships.
*/
$memberships = rcp_get_memberships( $this->query_args );
if ( ! empty( $memberships ) ) {
$response = array_map( array( $this, 'format_membership' ), $memberships );
} else {
$response = new WP_Error( 'no_memberships', __( 'No memberships found', 'rcp-rest-api' ), array( 'status' => 404 ) );
}
return new WP_REST_Response( $response );
}
}
/**
* Renew a membership
*
* @param WP_REST_Request $request
*
* @since 1.2
* @return WP_REST_Response Updated membership object on success.
*/
public function renew_membership( WP_REST_Request $request ) {
$membership = rcp_get_membership( $request->get_param( 'id' ) );
if ( ! $membership instanceof RCP_Membership ) {
return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 );
}
$recurring = $request->has_param( 'recurring' ) ? $request->get_param( 'recurring' ) : $membership->is_recurring();
$status = $request->get_param( 'status' );
$expiration = $request->get_param( 'expiration' );
$result = $membership->renew( $recurring, $status, $expiration );
if ( ! $result ) {
return new WP_REST_Response( new WP_Error( 'membership_renewal_failed', __( 'Renewal failed', 'rcp-rest' ), array( 'status' => 400 ) ), 400 );
}
return new WP_REST_Response( $this->format_membership( $membership ) );
}
/**
* Cancel a membership
*
* @param WP_REST_Request $request
*
* @since 1.2
* @return WP_REST_Response Updated membership object on success.
*/
public function cancel_membership( WP_REST_Request $request ) {
$membership = rcp_get_membership( $request->get_param( 'id' ) );
if ( ! $membership instanceof RCP_Membership ) {
return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ), 404 );
}
if ( $membership->can_cancel() ) {
// Cancel recurring billing if possible.
$cancelled = $membership->cancel_payment_profile();
if ( is_wp_error( $cancelled ) ) {
return new WP_REST_Response( new WP_Error( $cancelled->get_error_code(), $cancelled->get_error_message(), array( 'status' => 400 ) ), 400 );
}
} else {
// Just changes the membership status.
$membership->cancel();
}
return new WP_REST_Response( $this->format_membership( $membership ) );
}
/**
* Add a new membership
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response ID of the newly created membership on success.
*/
public function new_post_data( WP_REST_Request $request ) {
$args = array();
foreach ( $request->get_params() as $key => $value ) {
if ( in_array( $key, $this->membership_fields ) ) {
$args[$key] = wp_slash( $value );
}
}
// Customer ID is required.
if ( ! $request->get_param( 'customer_id' ) ) {
$response = new WP_Error( 'missing_customer_id', __( 'No customer ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
// Object ID is required.
if ( ! $request->get_param( 'object_id' ) ) {
$response = new WP_Error( 'missing_object_id', __( 'No object ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
$membership_id = rcp_add_membership( $args );
if ( empty( $membership_id ) ) {
return new WP_REST_Response( new WP_Error( 'create_failed', __( 'Failed to add new membership', 'rcp-rest' ), array( 'status' => 500 ) ) );
}
return new WP_REST_Response( absint( $membership_id ) );
}
/**
* Update an existing membership
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response
*/
public function update_post_data( WP_REST_Request $request ) {
if ( $request->has_param( 'ID' ) ) {
$request->set_param( 'id', $request->get_param( 'ID' ) );
}
if ( ! $request->get_param( 'id' ) ) {
$response = new WP_Error( 'missing_id', __( 'No membership ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
$args = array();
foreach ( $request->get_params() as $key => $value ) {
if ( in_array( $key, $this->membership_fields ) ) {
$args[ $key ] = wp_slash( $value );
}
}
$updated = rcp_update_membership( absint( $request->get_param( 'id' ) ), $args );
if ( $updated ) {
$response = 1;
} else {
$response = new WP_Error( 'update_failed', __( 'Update Failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
return new WP_REST_Response( $response );
}
/**
* Delete a membership
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response
*/
public function delete_data( WP_REST_Request $request ) {
if ( $request->has_param( 'ID' ) ) {
$request->set_param( 'id', $request->get_param( 'ID' ) );
}
$membership = rcp_get_membership( absint( $request->get_param( 'id' ) ) );
if ( empty( $membership ) ) {
return new WP_REST_Response( new WP_Error( 'invalid_membership', __( 'Invalid membership', 'rcp-rest' ), array( 'status' => 404 ) ) );
}
$membership->disable();
return new WP_REST_Response( 1 );
}
/**
* Determine if authenticated user has permission to access response data
*
* @since 1.1
* @return bool
*/
public function can_view() {
return current_user_can( 'rcp_view_members' );
}
/**
* Determine if authenticated user has permission to edit data
*
* @since 1.1
* @return bool
*/
public function can_edit() {
return current_user_can( 'rcp_manage_members' );
}
}