Files
roi-theme/wp-content/plugins/thrive-ultimatum/tcb/admin/includes/class-tcb-stock-images.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

192 lines
7.0 KiB
PHP
Executable File

<?php
/**
* Class TCB_Stock_Library
*
* Handles the stock image library functionality.
*/
class TCB_Stock_Library {
/**
* TCB_Stock_Library constructor.
* Sets up action hooks.
*/
public function __construct() {
add_action( 'wp_enqueue_media', array( $this, 'enqueue_scripts' ) );
add_action( 'wp_ajax_unsplash_list', array( $this, 'unsplash_list_callback' ) );
add_action( 'wp_ajax_unsplash_download_image', array( $this, 'unsplash_download_image_callback' ) );
add_action( 'wp_ajax_nopriv_unsplash_download_image', array( $this, 'unsplash_download_image_callback' ) );
}
/**
* Enqueue necessary scripts and styles for the stock image library.
*/
public function enqueue_scripts() {
$js_suffix = TCB_Utils::get_js_suffix();
tve_enqueue_script( 'unsplash_media_tab_js', tcb_admin()->admin_url( 'assets/js/stock-library' . $js_suffix), array( 'jquery' ), TVE_VERSION, false );
tve_enqueue_style( 'tcb-admin-stock-images', tcb_admin()->admin_url( 'assets/css/tcb-admin-stock-images.css' ), array(), TVE_VERSION, false );
$nonce = wp_create_nonce( 'unsplash_api_nonce' );
wp_localize_script(
'unsplash_media_tab_js',
'unsplashApi',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => $nonce,
)
);
}
/**
* Handle AJAX request to fetch a list of images from Unsplash.
*/
public function unsplash_list_callback() {
check_ajax_referer( 'unsplash_api_nonce', 'nonce' );
$count = min( isset( $_POST['count'] ) ? intval( $_POST['count'] ) : 10, 30 );
$page = isset( $_POST['page'] ) ? intval( $_POST['page'] ) : 1;
$search = isset( $_POST['search'] ) ? sanitize_text_field( wp_unslash( $_POST['search'] ) ) : '';
$allowed_order_by = array( 'relevant', 'latest', 'oldest' );
$allowed_orientation = array( 'landscape', 'portrait', 'squarish' );
$order_by = isset( $_POST['order_by'] ) && in_array( wp_unslash( $_POST['order_by'] ), $allowed_order_by ) ? sanitize_text_field( wp_unslash( $_POST['order_by'] ) ) : 'relevant';
$orientation = isset( $_POST['orientation'] ) && in_array( wp_unslash( $_POST['orientation'] ), $allowed_orientation ) ? sanitize_text_field( wp_unslash( $_POST['orientation'] ) ) : '';
$api_url = 'https://service-api.thrivethemes.com/api/unsplash/unsplash_service.php?action=list&page=' . $page . '&count=' . $count . '&order_by=' . rawurlencode( $order_by );
if ( ! empty( $search ) ) {
$api_url .= '&keyword=' . rawurlencode( $search ) . '&orientation=' . rawurlencode( $orientation );
}
$response = wp_remote_get( $api_url );
if ( is_wp_error( $response ) ) {
wp_send_json_error( 'Error connecting to the Unsplash API' );
return;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( is_null( $data ) || ! isset( $data['results'] ) ) {
wp_send_json_error( 'Invalid JSON response from Unsplash service' );
return;
}
wp_send_json_success(
array(
'total' => $data['total'],
'total_pages' => $data['total_pages'],
'results' => $data['results'],
)
);
}
/**
* Handle AJAX request to download an image from Unsplash.
*/
public function unsplash_download_image_callback() {
check_ajax_referer( 'unsplash_api_nonce', 'nonce' );
$photo_id = isset( $_POST['photo_id'] ) ? sanitize_text_field( wp_unslash( $_POST['photo_id'] ) ) : '';
if ( empty( $photo_id ) ) {
wp_send_json_error( 'No photo ID provided' );
return;
}
$photo_size = 'full';
$download_success = false;
$unsplash_api_url = 'https://service-api.thrivethemes.com/api/unsplash/unsplash_service.php?action=download&photo_id=' . urlencode( $photo_id ) . '&photo_size=' . $photo_size;
$response = wp_remote_get( $unsplash_api_url );
if ( is_wp_error( $response ) ) {
wp_send_json_error( 'Error retrieving image information from Unsplash service.' );
return;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! isset( $data['download_url'] ) ) {
wp_send_json_error( 'Missing download URL in Unsplash service response.' );
return;
}
$download_url = esc_url_raw( $data['download_url'] );
$title = isset( $_POST['title'] ) ? sanitize_text_field( wp_unslash( $_POST['title'] ) ) : '';
$alt_text = isset( $_POST['alt_text'] ) ? sanitize_text_field( wp_unslash( $_POST['alt_text'] ) ) : ( isset( $data['alt_description'] ) ? sanitize_text_field( $data['alt_description'] ) : '' );
$caption = isset( $_POST['caption'] ) ? sanitize_text_field( wp_unslash( $_POST['caption'] ) ) : '';
$description = isset( $_POST['description'] ) ? sanitize_textarea_field( wp_unslash( $_POST['description'] ) ) : '';
$filename = isset( $_POST['filename'] ) ? sanitize_file_name( wp_unslash( $_POST['filename'] ) ) : ( isset( $photo_id ) ? sanitize_text_field( $photo_id ) : '' );
$image_response = wp_remote_get( $download_url );
if ( is_wp_error( $image_response ) ) {
wp_send_json_error( 'Error downloading image from Unsplash.' );
return;
}
$image_body = wp_remote_retrieve_body( $image_response );
$mime_type = wp_remote_retrieve_header( $image_response, 'content-type' );
if ( ! $image_body ) {
wp_send_json_error( 'Error reading image content from Unsplash.' );
return;
}
$file_extension_map = array(
'image/jpeg' => '.jpg',
'image/png' => '.png',
'image/gif' => '.gif',
);
if ( ! isset( $file_extension_map[ $mime_type ] ) ) {
wp_send_json_error( 'Unsupported image type: ' . $mime_type );
return;
}
$file_extension = $file_extension_map[ $mime_type ];
$filename = sanitize_file_name( $filename . $file_extension );
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['path'] . '/' . $filename;
if ( file_put_contents( $file_path, $image_body ) !== false ) {
$download_success = true;
}
if ( ! $download_success ) {
wp_send_json_error( 'Error saving image to the uploads directory.' );
return;
}
$attachment = array(
'guid' => $upload_dir['url'] . '/' . basename( $file_path ),
'post_mime_type' => $mime_type,
'post_title' => $title,
'post_content' => $description,
'post_status' => 'inherit',
'post_excerpt' => $caption,
);
$attach_id = wp_insert_attachment( $attachment, $file_path );
if ( file_exists( ABSPATH . 'wp-admin/includes/image.php' ) ) {
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
if ( ! $attach_data ) {
wp_send_json_error( 'Error generating attachment metadata.' );
return;
}
} else {
if ( ! wp_update_attachment_metadata( $attach_id, $attach_data ) ) {
wp_send_json_error( 'Error updating attachment metadata.' );
return;
}
return;
}
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
wp_update_attachment_metadata( $attach_id, $attach_data );
update_post_meta( $attach_id, '_wp_attachment_image_alt', $alt_text );
wp_send_json_success(
array(
'message' => 'Image downloaded, added to the media library, and added to Thrive Architect',
'attachment_id' => $attach_id,
)
);
}
}