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,169 @@
<?php
/**
* Groups Rest route and endpoints
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Rest;
use WP_REST_Server;
use AdvancedAds\Constants;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Interfaces\Routes_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Rest Groups.
*/
class Groups implements Routes_Interface {
/**
* Registers routes with WordPress.
*
* @return void
*/
public function register_routes(): void {
register_rest_route(
Constants::REST_BASE,
'/group',
[
'methods' => WP_REST_Server::ALLMETHODS,
'callback' => [ $this, 'call_endpoint' ],
'permission_callback' => function () {
return Conditional::user_can( 'advanced_ads_edit_ads' );
},
]
);
}
/**
* Run a callback depending on the request method.
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
public function call_endpoint( $request ): array {
switch ( $request->get_method() ) {
case 'POST':
return $this->create( $request );
case 'PUT':
return $this->update( $request );
case 'DELETE':
return $this->delete( $request );
default:
}
return [ 'error' => esc_html__( 'No endpoint found', 'advanced-ads' ) ];
}
/**
* Delete a group
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
public function delete( $request ): array {
$payload = json_decode( $request->get_body(), true );
if ( ! wp_verify_nonce( $payload['nonce'], "delete-tag_{$payload['id']}" ) ) {
return [ 'error' => esc_html__( 'Sorry, you are not allowed to access this feature.', 'advanced-ads' ) ];
}
$group = wp_advads_get_group( $payload['id'] );
if ( $group ) {
$group->delete();
}
return [ 'done' => true ];
}
/**
* Create a new group
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
public function create( $request ): array {
$payload = $this->get_payload( $request );
if ( ! wp_verify_nonce( $payload['nonce'], 'advads-create-group' ) ) {
return [ 'error' => esc_html__( 'Invalid nonce', 'advanced-ads' ) ];
}
$group_name = sanitize_text_field( $payload['advads-group-name'] );
if ( empty( $group_name ) ) {
return [ 'reload' => true ];
}
$posted_type = $payload['advads-group-type'] ?? 'default';
if ( ! wp_advads_has_group_type( $posted_type ) ) {
$posted_type = 'default';
}
$group = wp_advads_create_new_group( $posted_type );
$group->set_name( sanitize_text_field( wp_unslash( $group_name ) ) );
$group->set_type( $posted_type );
$group->set_ad_count( 1 );
$group->set_options( [] );
$group->save();
return [
'action' => 'create',
'group_data' => $group->get_data(),
];
}
/**
* Update an existing group
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
public function update( $request ): array {
$payload = $this->get_payload( $request );
if ( ! wp_verify_nonce( $payload['nonce'], 'advads-update-group' ) ) {
return [ 'error' => esc_html__( 'Invalid nonce', 'advanced-ads' ) ];
}
$data = wp_unslash( $payload['advads-groups'] );
$data = $data[ key( $data ) ];
$group = wp_advads_get_group( $data['id'] );
$group->set_name( $data['name'] );
$group->set_type( $data['type'] );
$group->set_ad_count( $data['ad_count'] );
$group->set_options( $data['options'] ?? [] );
$group->set_ad_weights( $data['ads'] ?? [] );
$group->save();
return [
'action' => 'update',
'group_data' => $group->get_data(),
'reload' => true,
];
}
/**
* Get variable serialized with `jQuery.serialize()`
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
private function get_payload( $request ): array {
$body = json_decode( $request->get_body(), JSON_UNESCAPED_UNICODE );
parse_str( $body['fields'], $payload );
return $payload;
}
}

View File

@@ -0,0 +1,186 @@
<?php
/**
* Rest OnBoarding.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Rest;
use WP_Error;
use WP_REST_Server;
use WP_REST_Request;
use AdvancedAds\Options;
use AdvancedAds\Constants;
use AdvancedAds\Abstracts\Ad;
use Advanced_Ads_AdSense_Data;
use AdvancedAds\Abstracts\Placement;
use AdvancedAds\Framework\Interfaces\Routes_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Rest OnBoarding.
*/
class OnBoarding implements Routes_Interface {
/**
* Registers routes with WordPress.
*
* @return void
*/
public function register_routes(): void {
register_rest_route(
Constants::REST_BASE,
'/onboarding',
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'save_options' ],
'permission_callback' => function () {
return current_user_can( 'manage_options' );
},
]
);
}
/**
* Save onbaording options
*
* @param WP_REST_Request $request Request data.
*
* @return mixed
*/
public function save_options( $request ) {
$task_code = $request->get_param( 'taskOption' );
$allowed_task = [
'google_adsense',
'ad_image',
'ad_code',
];
if ( ! in_array( $task_code, $allowed_task, true ) ) {
return new WP_Error(
'task_not_allowed',
esc_html__( 'The task code posted is not allowed', 'advanced-ads' )
);
}
$item = $this->$task_code( $request );
update_option( '_advanced_ads_data_usage', $request->get_param( 'agreement' ) ? true : false );
// First post link.
$posts = get_posts(
[
'posts_per_page' => 1,
'post_type' => 'post',
]
);
update_option( Constants::OPTION_WIZARD_COMPLETED, true );
$pub_id = Options::instance()->get( 'adsense.adsense-id' );
$adsense_url = $pub_id ? "https://www.google.com/adsense/new/u/0/$pub_id/myads/sites" : '';
return [
'success' => true,
'itemEditLink' => $item ? $item->get_edit_link() : '',
'postLink' => ! empty( $posts ) ? get_permalink( $posts[0] ) : '',
'adsenseAccount' => $adsense_url,
];
}
/**
* Create ad by google adsense
*
* @param WP_REST_Request $request Request data.
*
* @return bool|Placement|Ad
*/
private function google_adsense( $request ) {
$ads_placement = $request->get_param( 'googleAdsPlacement' );
if ( 'auto_ads' === $ads_placement ) {
$ads_options = $request->get_param( 'autoAdsOptions' );
$options = Advanced_Ads_AdSense_Data::get_instance()->get_options();
$options['page-level-enabled'] = in_array( 'enable', $ads_options, true );
if ( isset( $options['amp'] ) && ! in_array( 'enableAmp', $ads_options, true ) ) {
unset( $options['amp'] );
} else {
$options['amp']['auto_ads_enabled'] = 1;
}
update_option( GADSENSE_OPT_NAME, $options );
} elseif ( 'manual' === $ads_placement ) {
$ad = wp_advads_create_new_ad( 'adsense' );
$ad->save();
$placement = wp_advads_create_new_placement();
$placement->set_title( 'AdSense Placement from wizard # ' . wp_rand() );
$placement->set_item( 'ad_' . $ad->get_id() );
$placement->save();
return $ad;
}
return false;
}
/**
* Create ad by image
*
* @param WP_REST_Request $request Request data.
*
* @return Placement
*/
private function ad_image( $request ): Placement {
$image = $request->get_param( 'adImage' );
$image_url = $request->get_param( 'adImageUrl' );
$ad = wp_advads_create_new_ad( 'image' );
$ad->set_title( 'Test image ad from wizard # ' . wp_rand() );
$ad->set_image_id( $image['id'] );
$ad->set_url( $image_url );
$ad->save();
return $this->create_placement( $ad );
}
/**
* Create ad by code
*
* @param WP_REST_Request $request Request data.
*
* @return Placement
*/
private function ad_code( $request ): Placement {
$ad = wp_advads_create_new_ad( 'plain' );
$ad->set_title( 'Test ad from wizard # ' . wp_rand() );
$ad->set_content( $request->get_param( 'adCode' ) );
$ad->save();
return $this->create_placement( $ad );
}
/**
* Create placement with the ad
*
* @param Ad $ad Ad instance to use as item.
*
* @return Placement
*/
private function create_placement( Ad $ad ): Placement {
$placement = wp_advads_create_new_placement( 'post_content' );
$placement->set_title( 'Test Placement from wizard # ' . wp_rand() );
$placement->set_item( 'ad_' . $ad->get_id() );
$placement->set_prop( 'position', 'after' );
$placement->set_prop( 'index', 3 );
$placement->set_prop( 'tag', 'p' );
$placement->save();
return $placement;
}
}

View File

@@ -0,0 +1,60 @@
<?php
/**
* Rest Page Quick Edit.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Rest;
use AdvancedAds\Constants;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Interfaces\Routes_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Rest Page Quick Edit.
*/
class Page_Quick_Edit implements Routes_Interface {
/**
* Register rest route for disabled ads status
*
* @return void
*/
public function register_routes(): void {
register_rest_route(
Constants::REST_BASE,
'/page_quick_edit',
[
'methods' => 'GET',
'callback' => [ $this, 'get_disable_ads' ],
'permission_callback' => function () {
return Conditional::user_can( 'edit_posts' );
},
]
);
}
/**
* Endpoint callback
*
* @param \WP_REST_Request $request the request.
*
* @return array
*/
public function get_disable_ads( $request ) {
$params = $request->get_params();
$nonce = sanitize_text_field( $params['nonce'] );
if ( ! wp_verify_nonce( $nonce, 'advads-post-quick-edit' ) ) {
return [];
}
$id = absint( $params['id'] );
return (array) get_post_meta( $id, '_advads_ad_settings', true );
}
}

View File

@@ -0,0 +1,184 @@
<?php
/**
* Rest Forms.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Rest;
use WP_REST_Request;
use AdvancedAds\Constants;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Utilities\Arr;
use AdvancedAds\Framework\Interfaces\Routes_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Placement screen modal forms handling
*/
class Placements implements Routes_Interface {
/**
* Registers routes with WordPress.
*
* @return void
*/
public function register_routes(): void {
register_rest_route(
Constants::REST_BASE,
'/placement',
[
[
'methods' => \WP_REST_Server::ALLMETHODS,
'callback' => [ $this, 'call_endpoint' ],
'permission_callback' => function () {
return Conditional::user_can( 'advanced_ads_manage_placements' );
},
],
]
);
}
/**
* Call the appropriate endpoint handler
*
* @param WP_REST_Request $request the request object.
*
* @return array
*/
public function call_endpoint( $request ) {
switch ( $request->get_method() ) {
case 'POST':
return $this->create( $request );
case 'PUT':
return $this->update( $request );
case 'GET':
return $this->read( $request );
default:
}
return [ 'error' => __( 'No endpoint found', 'advanced-ads' ) ];
}
/**
* Get placement data
*
* @param WP_REST_Request $request the request object.
*
* @return array
*/
public function read( $request ) {
$params = $request->get_params();
$placement = wp_advads_get_placement( (int) $params['id'] );
if ( ! $placement ) {
return [ 'error' => __( 'No placement found', 'advanced-ads' ) ];
}
/**
* Allow add-ons to send other placement props.
*/
$placement_data = apply_filters( 'advanced-ads-placement-read', $placement->get_data() );
return $placement_data;
}
/**
* Create placement
*
* @param WP_REST_Request $request the request object.
*
* @return mixed
*/
public function create( $request ) {
$body = json_decode( $request->get_body(), JSON_UNESCAPED_UNICODE );
parse_str( $body['fields'], $payload );
if ( ! wp_verify_nonce( sanitize_key( $payload['nonce'] ), 'advads-create-placement' ) ) {
return [ 'error' => __( 'Not authorized create', 'advanced-ads' ) ];
}
$placement_data = wp_unslash( $payload['advads'] );
if ( ! isset( $placement_data['placement'] ) ) {
return [ 'error' => __( 'No placement data provided', 'advanced-ads' ) ];
}
$placement_data = wp_unslash( $placement_data['placement'] );
$placement = wp_advads_create_new_placement( $placement_data['type'] ?? 'default' );
$placement->set_props( $placement_data );
$placement->save();
return apply_filters(
'advanced-ads-placements-updated',
[
'action' => 'create',
'placement_data' => $placement->get_data(),
'reload' => true,
'redirectUrl' => admin_url( 'edit.php?post_type=' . Constants::POST_TYPE_PLACEMENT ),
],
$placement
);
}
/**
* Update placement
*
* @param WP_REST_Request $request the request object.
*
* @return mixed
*/
public function update( $request ) {
$body = json_decode( $request->get_body(), JSON_UNESCAPED_UNICODE );
parse_str( $body['fields'], $payload );
if ( ! wp_verify_nonce( sanitize_key( $payload['nonce'] ), 'advads-update-placement' ) ) {
return [ 'error' => __( 'Not authorized update', 'advanced-ads' ) ];
}
$placement = wp_advads_get_placement( (int) $payload['post_ID'] );
if ( ! $placement ) {
return [ 'error' => __( 'Placement not found', 'advanced-ads' ) ];
}
$placement->set_title( sanitize_text_field( $payload['post_title'] ) );
$placement->set_status( sanitize_text_field( $payload['post_status'] ) );
if ( isset( $payload['advads']['placements'] ) ) {
$placement_data = wp_unslash( $payload['advads']['placements'] );
$placement->set_item( $placement_data['item'] );
$placement->set_props( $placement_data['options'] );
if ( ! Arr::get( $payload, 'advads.placements.options.repeat' ) && $placement->get_prop( 'repeat' ) ) {
$placement->set_prop( 'repeat', null );
}
if ( ! Arr::get( $payload, 'advads.placements.options.start_from_bottom' ) && $placement->get_prop( 'start_from_bottom' ) ) {
$placement->set_prop( 'start_from_bottom', null );
}
}
// Allow add-ons to trigger a page refresh or show errors if needed.
$results = apply_filters(
'advanced-ads-placements-updated',
[
'action' => 'update',
'payload' => $payload,
'title' => $placement->get_title(),
'item' => $placement->get_item(),
'placement_data' => $placement->get_data(),
'reload' => false,
],
$placement
);
$placement->save();
return $results;
}
}

View File

@@ -0,0 +1,50 @@
<?php
/**
* Rest Utilities.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Rest;
use AdvancedAds\Constants;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Interfaces\Routes_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Rest Utilities.
*/
class Utilities implements Routes_Interface {
/**
* Registers routes with WordPress.
*
* @return void
*/
public function register_routes(): void {
register_rest_route(
Constants::REST_BASE,
'/user-email',
[
'methods' => 'GET',
'callback' => [ $this, 'get_user_email' ],
'permission_callback' => function () {
return Conditional::user_can( 'advanced_ads_edit_ads' );
},
]
);
}
/**
* Retrieves the user email address.
*
* @return string Loggedin user email address.
*/
public function get_user_email() {
return wp_get_current_user()->user_email;
}
}