Files
roi-theme/wp-content/plugins/thrive-ultimatum/thrive-dashboard/inc/app-notification/classes/Notifications.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

254 lines
6.7 KiB
PHP
Executable File

<?php
class TD_Notifications {
private $_url;
private $_connection;
private $_request_params;
public function __construct() {
$this->_connection = TD_TTW_Connection::get_instance();
$this->_request_params = [
'user_id' => $this->_connection->ttw_id,
'user_email' => $this->_connection->ttw_email,
'last_notification_id' => get_option( 'td_last_notification_id' ),
];
$this->_url = TD_TTW_Connection::get_ttw_url() . '/wp-content/notifications.json';
}
public function handle_notifications() {
if ( $this->is_transients_exist() ) {
return;
}
$notifications = $this->get( $this->_request_params );
if ( ! $notifications || ! is_array( $notifications ) || is_wp_error( $notifications ) ) {
return;
}
foreach ( $notifications as $notification ) {
if ( $this->is_exist( $notification['notification_id'] ) || ( isset( $notification['end'] ) && $this->is_expired( $notification['end'] ) ) ) {
continue;
}
$this->add_notification( $notification );
}
}
public function check_notification() {
$this->handle_notifications();
$notifications = $this->get_notification();
return $notifications;
}
private function get_notification( $update_call = false ) {
global $wpdb;
$table_name = $wpdb->prefix . 'td_app_notifications';
$current_time = current_time( 'Y-m-d H:i:s' );
if ( $this->is_transients_exist() && ! $update_call ) {
return get_transient( 'td_app_notifications_transients' );
}
$active_notifications_query = $wpdb->prepare(
"SELECT * FROM $table_name
WHERE start <= %s
AND (end IS NULL OR end >= %s)
AND dismissed = 0
ORDER BY start DESC",
$current_time, $current_time
);
$active_notifications = $wpdb->get_results( $active_notifications_query, ARRAY_A );
$dismissed_notifications_query = $wpdb->prepare( " SELECT *
FROM $table_name
WHERE dismissed = 1
AND (end IS NULL OR end >= %s)
ORDER BY start DESC
", $current_time );
$dismissed_notifications = $wpdb->get_results( $dismissed_notifications_query, ARRAY_A );
if ( ! $active_notifications && ! $dismissed_notifications ) {
return false;
}
$notifications = [
'active' => $active_notifications,
'dismissed' => $dismissed_notifications
];
if ( ! $update_call ) {
$this->store_transients( $notifications );
}
return $notifications;
}
private function add_notification( $notification ) {
if ( ! $notification || ! is_array( $notification ) || empty( $notification ) ) {
return false;
}
if ( isset( $notification['have_license'] ) && is_array( $notification['have_license'] ) ) {
if ( ! $this->verify_access( $notification['have_license'], $notification['dont_have_license'] ) ) {
return;
}
}
global $wpdb;
$table_name = $wpdb->prefix . 'td_app_notifications';
if ( isset( $notification['btns'] ) ) {
foreach ( $notification['btns'] as $key => $value ) {
if ( $key === 'main' ) {
$notification['button1_label'] = sanitize_text_field( $value['text'] );
$notification['button1_action'] = esc_url_raw( $value['url'] );
}
if ( $key === 'alt' ) {
$notification['button2_label'] = sanitize_text_field( $value['text'] );
$notification['button2_action'] = esc_url_raw( $value['url'] );
}
}
}
if ( isset( $notification['btns'] ) ) {
unset( $notification['btns'] );
}
unset( $notification['have_license'] );
unset( $notification['dont_have_license'] );
$additional_data = [
'created' => current_time( 'Y-m-d H:i:s' ),
'updated' => current_time( 'Y-m-d H:i:s' ),
];
$notification = array_merge( $notification, $additional_data );
$last_notification_id = get_option( 'td_last_notification_id', 0 );
if ( isset( $notification['notification_id'] ) && $last_notification_id < $notification['notification_id'] ) {
update_option( 'td_last_notification_id', $notification['notification_id'] );
}
$wpdb->insert( $table_name, $notification );
}
private function verify_access( $have_license, $dont_have_license ) {
if ( ! is_array( $have_license ) && ! is_array( $dont_have_license ) ) {
return true;
}
$user_products = TD_Ian_Helper::get_user_product_ids();
if ( ! empty( $have_license ) && ! empty( $dont_have_license ) ) {
$has_any_license = ! empty( array_intersect( $user_products, $have_license ) );
$has_no_restricted_license = empty( array_intersect( $user_products, $dont_have_license ) );
return $has_any_license || $has_no_restricted_license;
}
if ( ! empty( $have_license ) ) {
return ! empty( array_intersect( $user_products, $have_license ) );
}
if ( ! empty( $dont_have_license ) ) {
return ! empty( array_intersect( $user_products, $dont_have_license ) );
}
return true;
}
// Check if the notification is already expired or not
private function is_expired( $end ) {
if ( ! $end || empty( $end ) ) {
return false;
}
$current_time = strtotime( current_time( 'Y-m-d H:i:s' ) );
return $current_time > strtotime( $end );
}
// Retrieve data from the server using the REST API
private function get( $args = [] ) {
$request_params = [
'body' => $args,
'headers' => [
'Content-Type' => 'application/json',
],
'timeout' => 30,
'sslverify' => false,
];
$notifications = wp_remote_get( $this->_url, $request_params );
if ( is_wp_error( $notifications ) ) {
return [];
}
$response_code = wp_remote_retrieve_response_code( $notifications );
if ( $response_code != 200 ) {
return [];
}
if ( is_wp_error( $notifications ) ) {
return false;
}
$notifications = json_decode( wp_remote_retrieve_body( $notifications ), true );
if ( ! is_array( $notifications ) ) {
return [];
}
return $notifications;
}
// Check if the notification already exists in the database
private function is_exist( $notification_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'td_app_notifications';
$notification = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table_name WHERE notification_id = %d",
$notification_id ) );
if ( $notification ) {
return true;
}
return false;
}
// Check if the transients already exist
private function is_transients_exist() {
$transient_name = 'td_app_notifications_transients';
$transient = get_transient( $transient_name );
if ( $transient ) {
return true;
}
return false;
}
// Store the transients
private function store_transients( $notifications ) {
if ( ! $notifications || ! is_array( $notifications ) || is_wp_error( $notifications ) ) {
return;
}
set_transient( 'td_app_notifications_transients', $notifications, time() + DAY_IN_SECONDS );
}
public function update_transients() {
$this->store_transients( $this->get_notification( true ) );
}
}