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,312 @@
<?php
/**
* Customer Route
*
* @package rcp
* @copyright Copyright (c) 2019, Restrict Content Pro team
* @license GPL2+
* @since 1.1
*/
class RCP_REST_API_Customer_Route_V1 extends RCP_REST_API_Route {
/**
* Array of whitelisted customer fields.
*
* @var array
*/
private $customer_fields;
/**
* Get things started
*
* @since 1.0
*/
public function init() {
$this->id = 'customers';
// Whitelist of customer fields that can be altered and their associated query arg name.
$this->customer_fields = array(
'id',
'user_id',
'user_args',
'date_registered',
'email_verification',
'has_trialed',
'last_login',
'ips',
'notes'
);
}
/**
* @param RCP_Customer $customer
*
* @since 1.1
* @return object
*/
private function format_customer( RCP_Customer $customer ) {
$data = new stdClass();
$data->id = $customer->get_id();
$data->user_id = $customer->get_user_id();
$data->date_registered = $customer->get_date_registered( false );
$data->email_verification = $customer->get_email_verification_status();
$data->last_login = $customer->get_last_login( false );
$data->ips = $customer->get_ips();
$data->notes = $customer->get_notes();
$membership_ids = array();
$memberships = $customer->get_memberships();
if ( ! empty( $memberships ) ) {
foreach ( $memberships as $membership ) {
/**
* @var RCP_Membership $membership
*/
$membership_ids[] = $membership->get_id();
}
}
$data->memberships = array_map( 'absint', $membership_ids );
return $data;
}
/**
* Get data
*
* If the `id` parameter is provided then information about a single customer is retrieved.
* Otherwise, an array of customer results is returned.
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response
*/
public function get_data( WP_REST_Request $request ) {
$invalid_customer = new WP_Error( 'invalid_customer', __( 'Invalid customer', 'rcp-rest' ), array( 'status' => 404 ) );
if ( $request->get_param( 'id' ) ) {
/**
* Get single customer by ID.
*/
$customer = rcp_get_customer( absint( $request->get_param( 'id' ) ) );
if ( empty( $customer ) ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
return new WP_REST_Response( $this->format_customer( $customer ) );
} elseif ( $request->get_param( 'user_id' ) ) {
/**
* Get single customer by user ID.
*/
$customer = rcp_get_customer_by_user_id( absint( $request->get_param( 'user_id' ) ) );
if ( empty( $customer ) ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
return new WP_REST_Response( $this->format_customer( $customer ) );
} elseif ( $request->get_param( 'user_email' ) ) {
/**
* Get a single customer by email.
*/
$user = get_user_by( 'email', $request->get_param( 'user_email' ) );
if ( ! $user instanceof WP_User ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
$customer = rcp_get_customer_by_user_id( absint( $user->ID ) );
if ( ! $customer instanceof RCP_Customer ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
return new WP_REST_Response( $this->format_customer( $customer ) );
} elseif( $request->get_param( 'user_login' ) ) {
/**
* Get a single customer by user login.
*/
$user = get_user_by( 'login', $request->get_param( 'user_login' ) );
if ( ! $user instanceof WP_User ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
$customer = rcp_get_customer_by_user_id( absint( $user->ID ) );
if ( ! $customer instanceof RCP_Customer ) {
return new WP_REST_Response( $invalid_customer, 404 );
}
return new WP_REST_Response( $this->format_customer( $customer ) );
} else {
/**
* Get array of customers.
*/
$customers = rcp_get_customers( $request->get_params() );
if ( ! empty( $customers ) ) {
$response = array_map( array( $this, 'format_customer' ), $customers );
} else {
$response = new WP_Error( 'no_customers', __( 'No customers found', 'rcp-rest-api' ), array( 'status' => 404 ) );
}
return new WP_REST_Response( $response );
}
}
/**
* Add a new customer
*
* @param WP_REST_Request $request
*
* @since 1.1
* @return WP_REST_Response ID of the newly created customer 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->customer_fields ) ) {
$args[ $key ] = wp_slash( $value );
}
}
$customer_id = rcp_add_customer( $args );
if ( empty( $customer_id ) ) {
$invalid_customer = new WP_Error( 'create_failed', __( 'Failed to add new customer', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $invalid_customer );
}
return new WP_REST_Response( absint( $customer_id ) );
}
/**
* Update an existing customer
*
* @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 customer 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->customer_fields ) ) {
$args[ $key ] = wp_slash( $value );
}
}
$updated = rcp_update_customer( 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 customer
*
* @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' ) );
}
if ( ! $request->get_param( 'id' ) ) {
$response = new WP_Error( 'missing_id', __( 'No customer ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
$deleted = rcp_delete_customer( absint( $request->get_param( 'id' ) ) );
if ( $deleted ) {
$response = 1;
} else {
$response = new WP_Error( 'delete_failed', __( 'Delete Failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
return new WP_REST_Response( $response );
}
/**
* 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' );
}
}

View File

@@ -0,0 +1,67 @@
<?php
class RCP_REST_API_Earnings_Route_V1 extends RCP_REST_API_Route {
/**
* @var RCP_Payments $db
*/
protected $db;
/**
* Get things started
*
* @since 1.0
*/
public function init() {
$this->id = 'earnings';
$this->db = new RCP_Payments;
}
/**
* Retrieve response data
*
* @since 1.0
*/
public function get_data( WP_REST_Request $request ) {
$current_time = current_time( 'timestamp' );
$today = array(
'day' => date( 'd', $current_time ),
'month' => date( 'n', $current_time ),
'year' => date( 'Y', $current_time )
);
$month = array(
'month' => date( 'n', $current_time ),
'year' => date( 'Y', $current_time )
);
$year = array(
'year' => date( 'Y', $current_time )
);
$response = array(
'today' => $this->db->get_earnings( array( 'date' => $today ) ),
'month' => $this->db->get_earnings( array( 'date' => $month ) ),
'year' => $this->db->get_earnings( array( 'date' => $year ) ),
'currency' => array(
'code' => rcp_get_currency(),
'symbol' => rcp_get_currency_symbol()
)
);
return new WP_REST_Response( $response );
}
/**
* Determine if authenticated user has permission to access response data
*
* @since 1.0
*/
public function can_view() {
return current_user_can( 'rcp_view_payments' );
}
}

View File

@@ -0,0 +1,196 @@
<?php
/**
* Membership Levels Route
*
* @package rcp-rest-api
* @copyright Copyright (c) 2018, Restrict Content Pro team
* @license GPL2+
* @since 1.1
*/
class RCP_REST_API_Membership_Level_Route_V1 extends RCP_REST_API_Route {
/**
* @var RCP_Levels $db
*/
protected $db;
/**
* Get things started
*
* @access public
* @since 1.1
* @return void
*/
public function init() {
$this->id = 'levels';
$this->db = new RCP_Levels();
}
/**
* Retrieve response data
*
* @param WP_REST_Request $request
*
* @access public
* @since 1.1
* @return RCP_REST_API_Level|WP_Error|WP_REST_Response
*/
public function get_data( WP_REST_Request $request ) {
if ( $request->get_param( 'id' ) ) {
// Get a single membership level.
$level = new RCP_REST_API_Level( $request->get_param( 'id' ) );
if ( empty( $level->id ) ) {
$level = new WP_Error( 'no_level', __( 'Invalid membership level', 'rcp-rest' ), array( 'status' => 404 ) );
}
return $level;
}
// Get multiple levels.
return new WP_REST_Response( $this->get_levels() );
}
/**
* Create a new membership level.
*
* @param WP_REST_Request $request
*
* @access public
* @since 1.1
* @return WP_REST_Response
*/
public function new_post_data( WP_REST_Request $request ) {
if ( ! $request->get_param( 'name' ) ) {
$response = new WP_Error( 'missing_name', __( 'No membership level name supplied', 'rcp-rest' ), array( 'status' => 500 ) );
}
if ( $request->get_param( 'trial_duration' ) && ( ! $request->get_param( 'price' ) || ! $request->get_param( 'duration' ) ) ) {
$response = new WP_Error( 'invalid_trial', __( 'Invalid trial configuration. A trial cannot be assigned to a free or lifetime membership.', 'rcp-rest' ), array( 'status' => 500 ) );
}
if ( empty( $response ) ) {
$level = new RCP_REST_API_Level();
$args = $level->sanitize_level_args( $request->get_params() );
$level_id = $this->db->insert( $args );
if ( $level_id ) {
$response = $level_id;
} else {
$response = new WP_Error( 'create_failed', __( 'Membership level creation failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
}
return new WP_REST_Response( $response );
}
/**
* Update an existing membership level.
*
* @param WP_REST_Request $request
*
* @access public
* @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 level ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
$level = new RCP_REST_API_Level( $request->get_param( 'id' ) );
$fields = (array) $level;
$args = wp_parse_args( $request->get_params(), $fields );
$args = $level->sanitize_level_args( $args );
if ( $this->db->update( $request->get_param( 'id' ), $args ) ) {
$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 level.
*
* @param WP_REST_Request $request
*
* @access public
* @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' ) );
}
$this->db->remove( $request->get_param( 'id' ) );
return new WP_REST_Response( 1 );
}
/**
* Retrieve membership levels.
*
* @access private
* @since 1.1
* @return array
*/
private function get_levels() {
$args = wp_parse_args( $this->query_args, array(
'status' => 'all',
'limit' => null,
'orderby' => 'list_order'
) );
$levels = $this->db->get_levels( $args );
return $levels;
}
/**
* Determine if authenticated user has permission to access response data
*
* @access public
* @since 1.1
* @return bool
*/
public function can_view() {
return current_user_can( 'rcp_view_levels' );
}
/**
* Determine if authenticated user has permission to edit data
*
* @access public
* @since 1.1
* @return bool
*/
public function can_edit() {
return current_user_can( 'rcp_manage_levels' );
}
}

View File

@@ -0,0 +1,408 @@
<?php
class RCP_REST_API_Member_Route_V1 extends RCP_REST_API_Route {
private $user_fields;
/**
* Get things started
*
* @since 1.0
*/
public function init() {
$this->id = 'members';
// White list of user fields that can be altered and their associated query arg name
$this->user_fields = array(
'ID' => 'ID',
'login' => 'user_login',
'first_name' => 'first_name',
'last_name' => 'last_name',
'display_name' => 'display_name',
'email' => 'user_email',
'password' => 'user_pass'
);
}
/**
* Retrieve response data
*
* @since 1.0
*/
public function get_data( WP_REST_Request $request ) {
if( $request->get_param( 'id' ) ) {
$member = new RCP_REST_API_Member( $request->get_param( 'id' ) );
if( ! empty( $member->ID ) ) {
$member->setup();
} else {
$member = new WP_Error( 'no_member', 'Invalid member', array( 'status' => 404 ) );
}
/**
* Filters the response for getting data about a single member.
*
* @param RCP_REST_API_Member|WP_Error $member Member object or WP_Error if member cannot be found.
* @param int $id ID of the member to retrieve.
* @param array $query_args Query arguments.
*
* @since 1.0
*/
$member = apply_filters( 'rcp_rest_api_get_member_response', $member, $request->get_param( 'id' ), $this->query_args );
return $member;
}
/**
* Filters the response for getting member data.
*
* @param array $response Array of members.
* @param array $query_args Query arguments for filtering results.
*
* @since 1.1
*/
$response = apply_filters( 'rcp_rest_api_get_members_response', $this->get_members(), $this->query_args );
return new WP_REST_Response( $response );
}
/**
* Retrieve response data for create requests
*
* @since 1.0
*/
public function new_post_data( WP_REST_Request $request ) {
$args = array();
foreach( $request->get_params() as $key => $value ) {
if( array_key_exists( $key, $this->user_fields ) ) {
$args[ $this->user_fields[ $key ] ] = wp_slash( $value );
}
}
// Status is required.
if( ! $request->get_param( 'status' ) ) {
$response = new WP_Error( 'missing_status', __( 'No status supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
if( empty( $args['user_pass'] ) ) {
$args['user_pass'] = wp_generate_password( 20 );
}
$user_id = wp_insert_user( $args );
if( is_wp_error( $user_id ) ) {
return new WP_REST_Response( $user_id );
} else {
$member = new RCP_REST_API_Member( $user_id );
if( $request->has_param( 'subscription' ) ) {
$member->set_subscription( sanitize_text_field( $request->get_param( 'subscription' ) ) );
}
if( $request->has_param( 'status' ) ) {
$member->set_status( sanitize_text_field( $request->get_param( 'status' ) ) );
}
if( $request->has_param( 'expiration' ) ) {
$member->set_expiration_date( $member->sanitize_expiration( $request->get_param( 'expiration' ) ) );
} else {
// Calculate automatically.
$expiration = rcp_calculate_subscription_expiration( $member->get_subscription_id() );
$member->set_expiration_date( $expiration );
}
if( $request->has_param( 'recurring' ) ) {
$member->set_recurring( filter_var( $request->get_param( 'recurring' ), FILTER_VALIDATE_BOOLEAN ) );
}
if( $request->has_param( 'profile_id' ) ) {
$member->set_payment_profile_id( sanitize_text_field( $request->get_param( 'profile_id' ) ) );
}
if( $request->has_param( 'merchant_subscription_id' ) ) {
$member->set_merchant_subscription_id( sanitize_text_field( $request->get_param( 'merchant_subscription_id' ) ) );
}
/**
* Filters the response for successfully adding a new member.
*
* @param int $response Designates a successful response.
* @param RCP_REST_API_Member $member Member object. This is an extension of `RCP_Member`, which extends `WP_User`.
* @param array $body Request parameters.
*
* @since 1.1
*/
$response = apply_filters( 'rcp_rest_api_add_member_response', 1, $member, $request->get_params() );
}
return new WP_REST_Response( $response );
}
/**
* Retrieve response data for update requests
*
* @since 1.0
*/
public function update_post_data( WP_REST_Request $request ) {
if ( $request->has_param( 'id' ) ) {
$request->set_param( 'ID', $request->get_param( 'id' ) );
}
$args = array();
foreach( $request->get_params() as $key => $value ) {
if( array_key_exists( $key, $this->user_fields ) ) {
$args[ $this->user_fields[ $key ] ] = wp_slash( $value );
}
}
if( ! $request->get_param( 'ID' ) ) {
$response = new WP_Error( 'missing_id', __( 'No user ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
if( wp_update_user( $args ) ) {
$member = new RCP_REST_API_Member( $args['ID'] );
if( $request->get_param( 'renew' ) ) {
// Renew membership.
$recurring = $request->has_param( 'recurring' ) ? filter_var( $request->get_param( 'recurring' ), FILTER_VALIDATE_BOOLEAN ) : false;
$member->renew( $recurring );
} elseif ( $request->get_param( 'cancel' ) ) {
// Cancel membership.
if ( $member->can_cancel() ) {
$cancelled = $member->cancel_payment_profile();
if ( true !== $cancelled ) {
$response = new WP_Error( 'cancellation_failed', __( 'Cancellation Failed', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
} else {
$member->cancel();
}
} else {
// Change general membership data.
if( $request->has_param( 'status' ) ) {
$member->set_status( sanitize_text_field( $request->get_param( 'status' ) ) );
}
if( $request->has_param( 'subscription' ) ) {
$member->set_subscription( sanitize_text_field( $request->get_param( 'subscription' ) ) );
}
if( $request->has_param( 'expiration' ) ) {
$member->set_expiration_date( $member->sanitize_expiration( $request->get_param( 'expiration' ) ) );
}
if( $request->has_param( 'recurring' ) ) {
$member->set_recurring( filter_var( $request->get_param( 'recurring' ), FILTER_VALIDATE_BOOLEAN ) );
}
if( $request->has_param( 'profile_id' ) ) {
$member->set_payment_profile_id( sanitize_text_field( $request->get_param( 'profile_id' ) ) );
}
if( $request->has_param( 'merchant_subscription_id' ) ) {
$member->set_merchant_subscription_id( sanitize_text_field( $request->get_param( 'merchant_subscription_id' ) ) );
}
}
/**
* Filters the response for successfully updating an existing member.
*
* @param int $response Designates a successful response.
* @param RCP_REST_API_Member $member Member object. This is an extension of `RCP_Member`, which extends `WP_User`.
* @param array $body Request parameters.
*
* @since 1.1
*/
$response = apply_filters( 'rcp_rest_api_update_member_response', 1, $member, $request->get_params() );
} else {
$response = new WP_Error( 'update_failed', __( 'Update Failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
return new WP_REST_Response( $response );
}
/**
* Retrieve response data for delete requests
*
* @since 1.0
*/
public function delete_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 user ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
if( ! function_exists( 'wp_delete_user' ) ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
}
if( wp_delete_user( $request->get_param( 'ID' ) ) ) {
$response = 1;
} else {
$response = new WP_Error( 'delete_failed', __( 'Delete Failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
return new WP_REST_Response( $response );
}
/**
* Retrieve members data
*
* @since 1.0
*/
private function get_members() {
$request = wp_parse_args( $this->query_args, array(
'number' => 20,
'orderby' => 'ID',
'order' => 'DESC',
'offset' => 0,
's' => '',
'status' => '',
'subscription' => 0,
'recurring' => '',
) );
$members = array();
$args = array(
'offset' => $request['offset'],
'number' => $request['number'],
'orderby' => $request['orderby'],
'order' => $request['order'],
'meta_query' => array()
);
if( ! empty( $request['status'] ) ) {
$args['meta_query'][] = array(
'key' => 'rcp_status',
'value' => $request['status']
);
}
if( ! empty( $request['subscription'] ) ) {
$args['meta_query'][] = array(
'key' => 'rcp_subscription_level',
'value' => $request['subscription']
);
}
if( ! empty( $request['recurring'] ) ) {
if( 'no' === $request['recurring'] ) {
// find non recurring users
$args['meta_query'][] = array(
'key' => 'rcp_recurring',
'compare' => 'NOT EXISTS'
);
} else {
// find recurring users
$args['meta_query'][] = array(
'key' => 'rcp_recurring',
'value' => 'yes'
);
}
}
if( ! empty( $request['s'] ) ) {
$args['search'] = sanitize_text_field( $request['s'] );
}
$members = get_users( $args );
if( ! empty( $members ) ) {
foreach( $members as $key => $member ) {
$members[ $key ] = new RCP_REST_API_Member( $member->ID );
$members[ $key ]->setup();
}
}
return $members;
}
/**
* Determine if authenticated user has permission to access response data
*
* @since 1.0
*/
public function can_view() {
return current_user_can( 'rcp_view_members' );
}
/**
* Determine if authenticated user has permission to edit data
*
* @since 1.0
*/
public function can_edit() {
return current_user_can( 'rcp_manage_members' );
}
}

View File

@@ -0,0 +1,407 @@
<?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' );
}
}

View File

@@ -0,0 +1,197 @@
<?php
class RCP_REST_API_Payment_Route_V1 extends RCP_REST_API_Route {
protected $db;
/**
* Get things started
*
* @since 1.0
*/
public function init() {
$this->id = 'payments';
$this->db = new RCP_Payments;
}
/**
* Retrieve response data
*
* @since 1.0
*/
public function get_data( WP_REST_Request $request ) {
if( $request->get_param( 'id' ) ) {
$payment = new RCP_REST_API_Payment( $request->get_param( 'id' ) );
if( ! empty( $payment->id ) ) {
$payment->setup();
} else {
$payment = new WP_Error( 'no_payment', __( 'Invalid payment', 'rcp-rest' ), array( 'status' => 404 ) );
}
return $payment;
}
return new WP_REST_Response( $this->get_payments() );
}
/**
* Retrieve response data for create requests
*
* @since 1.0
*/
public function new_post_data( WP_REST_Request $request ) {
if( ! $request->has_param( 'amount' ) ) {
$response = new WP_Error( 'missing_amount', __( 'No payment amount supplied', 'rcp-rest' ), array( 'status' => 500 ) );
}
if( ! $request->get_param( 'subscription' ) ) {
$response = new WP_Error( 'missing_subscription', __( 'No subscription name supplied', 'rcp-rest' ), array( 'status' => 500 ) );
}
if( ! $request->get_param( 'user_id' ) ) {
$response = new WP_Error( 'missing_user_id', __( 'No user ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
}
if( empty( $response ) ) {
$payment = new RCP_REST_API_Payment;
$args = $payment->sanitize_payment_args( $request->get_params() );
$payment_id = $this->db->insert( $args );
if( $payment_id ) {
$response = 1;
} else {
$response = new WP_Error( 'create_failed', __( 'Payment creation failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
}
return new WP_REST_Response( $response );
}
/**
* Retrieve response data for update requests
*
* @since 1.0
*/
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 payment ID supplied', 'rcp-rest' ), array( 'status' => 500 ) );
return new WP_REST_Response( $response );
}
$payment = new RCP_REST_API_Payment( $request->get_param( 'id' ) );
$fields = (array) $payment;
$args = wp_parse_args( $request->get_params(), $fields );
$args = $payment->sanitize_payment_args( $args );
if( $this->db->update( $request->get_param( 'id' ), $args ) ) {
$response = 1;
} else {
$response = new WP_Error( 'update_failed', __( 'Update Failed', 'rcp-rest' ), array( 'status' => 500 ) );
}
return new WP_REST_Response( $response );
}
/**
* Retrieve response data for delete requests
*
* @since 1.0
*/
public function delete_data( WP_REST_Request $request ) {
if ( $request->has_param( 'ID' ) ) {
$request->set_param( 'id', $request->get_param( 'ID' ) );
}
$this->db->delete( $request->get_param( 'id' ) );
return new WP_REST_Response( 1 );
}
/**
* Retrieve payment data
*
* @since 1.0
*/
private function get_payments() {
$args = wp_parse_args( $this->query_args, array(
'number' => 20,
'orderby' => 'id',
'order' => 'DESC',
'offset' => 0,
's' => '',
'status' => '',
'date' => '',
'fields' => '*',
'subscription' => 0,
) );
if( ! empty( $this->query_args['member'] ) ) {
$args['user_id'] = absint( $this->query_args['member'] );
}
$payments = $this->db->get_payments( $args );
if( ! empty( $payments ) ) {
foreach( $payments as $key => $payment ) {
$payments[ $key ] = new RCP_REST_API_Payment( $payment->id );
}
}
return $payments;
}
/**
* Determine if authenticated user has permission to access response data
*
* @since 1.0
*/
public function can_view() {
return current_user_can( 'rcp_view_payments' );
}
/**
* Determine if authenticated user has permission to edit data
*
* @since 1.0
*/
public function can_edit() {
return current_user_can( 'rcp_manage_payments' );
}
}