- 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>
407 lines
11 KiB
PHP
Executable File
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' );
|
|
}
|
|
|
|
} |