*/ class polylai_Admin { /** * The ID of this plugin. * * @since 1.0.0 * @access private * @var string $plugin_name The ID of this plugin. */ private $plugin_name; /** * The version of this plugin. * * @since 1.0.0 * @access private * @var string $version The current version of this plugin. */ private $version; private $cron; private $rating_postponed; /** * Initialize the class and set its properties. * * @since 1.0.0 * @param string $plugin_name The name of this plugin. * @param string $version The version of this plugin. */ public function __construct($plugin_name, $version) { $this->plugin_name = $plugin_name; $this->version = rand(1, 10000); // $version; $this->cron = polylai_Cron::getInstance(); $this->rating_postponed = false; } /** * Register the stylesheets for the admin area. * * @since 1.0.0 */ public function enqueue_styles() { wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/style.css', array(), $this->version, 'all'); $user = wp_get_current_user(); if (in_array('author', (array) $user->roles)) { wp_enqueue_style($this->plugin_name . "-author", plugin_dir_url(__FILE__) . 'css/polylai-translator-author.css', array(), $this->version, 'all'); } } /** * Register the JavaScript for the admin area. * * @since 1.0.0 */ public function enqueue_scripts() { wp_enqueue_script("freemius-checkout", "https://checkout.freemius.com/js/v1/", [], $this->version, false); wp_enqueue_script("alpine", "https://cdn.jsdelivr.net/npm/alpinejs@3.14.8/dist/cdn.min.js", ['jquery'], $this->version, ['strategy' => 'defer']); wp_register_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/polylai-translator-admin.js', ['jquery', 'alpine'], $this->version); $vars = [ 'polylai_ws_url' => POLYLAI_WS_URL, 'polylai_credits_license' => get_option('polylai_credits_license'), 'polylai_credits_nonce' => wp_create_nonce('polylai_credits_license_nonce'), 'polylai_settings_nonce' => wp_create_nonce('polylai_settings_nonce'), ]; wp_localize_script($this->plugin_name, 'polylaiVars', $vars); wp_enqueue_script($this->plugin_name); } public function row_actions($actions, $post) { $type = get_post_type($post->ID); $allowed = ["post", "page"]; if (!in_array($type, $allowed) && !polylai_fs()->can_use_premium_code__premium_only()) { return $actions; } if (current_user_can('edit_post', $post->ID)) { $nonce = wp_create_nonce('polylai_nonce'); $actions['polylaitr'] = sprintf( 'Translate', $post->ID, $nonce ); } return $actions; } public function create_translation_post_type() { $labels = array( 'name' => _x('Translations', 'post type general name', 'ai-translator-for-polylang'), 'singular_name' => _x('Translation', 'post type singular name', 'ai-translator-for-polylang'), ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => false, 'show_in_menu' => false, 'query_var' => true, 'rewrite' => array('slug' => 'polylai-translation'), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, ); register_post_type('polylai-translation', $args); } public function show_translation_modal() { if ( wp_verify_nonce( sanitize_text_field( wp_unslash($_REQUEST['polylai_nonce']) ), 'polylai_nonce' ) ) { $is_premium = polylai_fs()->can_use_premium_code__premium_only(); require_once plugin_dir_path(__FILE__) . 'partials/translations-modal.php'; wp_die(); } else { wp_nonce_ays(''); } } public function show_pricing() { if ( wp_verify_nonce( sanitize_text_field( wp_unslash($_REQUEST['nonce']) ), 'polylai_show_pricing' ) ) { $pricing = $this->get_pricing(); require_once plugin_dir_path(__FILE__) . 'partials/pricing.php'; wp_die(); } else { wp_nonce_ays(); } } public function admin_menu() { // add_menu_page( __('Settings', 'ai-translator-for-polylang'), __('PolylAI Translator', 'ai-translator-for-polylang'), 'manage_options', 'polylai', [$this, 'settings_page'], plugin_dir_url(__FILE__) . 'img/icon-circle.svg', 5 ); add_submenu_page( 'polylai', __('Translations', 'ai-translator-for-polylang'), __('Translations', 'ai-translator-for-polylang'), 'manage_options', 'polylai-queue', [$this, 'queue_page'] ); add_submenu_page( 'polylai', __('Bulk translations', 'ai-translator-for-polylang'), __('Bulk translations', 'ai-translator-for-polylang'), 'manage_options', 'polylai-bulk', [$this, 'bulk_page'] ); add_submenu_page( 'polylai', __('Tutorial', 'ai-translator-for-polylang'), __('Tutorial', 'ai-translator-for-polylang'), 'manage_options', 'polylai-tutorial', [$this, 'tutorial'] ); } public function bulk_page() { require_once plugin_dir_path(__FILE__) . 'partials/bulk.php'; } public function tutorial() { require_once plugin_dir_path(__FILE__) . 'partials/tutorial.php'; } private function get_pricing() { $response = wp_remote_post(POLYLAI_WS_URL . "/pricing", [ 'timeout' => 100000, 'method' => 'GET', 'blocking' => true ]); return $response; } public function register_post_status() { register_post_status('translating', ['internal' => true]); register_post_status('pending', ['internal' => true]); register_post_status('complete', ['internal' => true]); register_post_status('error', ['internal' => true]); } public function settings_page() { $svc_comm = true; require_once plugin_dir_path(__FILE__) . 'partials/settings.php'; } public function queue_page() { require_once plugin_dir_path(__FILE__) . 'partials/queue.php'; } public function handle_rating() { if (isset($_POST['polylai_rating_action'])) { if (wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['polylai_rating_nonce'])), 'polylai_rating_asked')) { if ($_POST['polylai_rating_action'] == 'remind') { $cookie_name = 'polylai_suspend_notice'; $cookie_value = '1'; $cookie_expiry = time() + (2 * 24 * 60 * 60); // 2 days from now // Set the cookie setcookie($cookie_name, $cookie_value, $cookie_expiry, "/"); $this->rating_postponed = true; return; } if ($_POST['polylai_rating_action'] == 'done') { update_option('polylai_rating_asked', true); return; } } else { wp_nonce_ays(); } } } public function handle_restart() { global $wpdb; if (isset($_POST['polylai_restart'])) { if (wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['polylai_restart_nonce'])), 'polylai_restart_nonce')) { delete_transient(polylai_Cron::LOCK_TRANSIENT_KEY); } else { wp_nonce_ays(); } } wp_die(); } public function save_credits_license() { if (wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['polylai_credits_license_nonce'])), 'polylai_credits_license_nonce')) { $license_key = sanitize_text_field($_POST['polylai_credits_license']); update_option('polylai_credits_license', $license_key); header("Content-type: application/json"); echo wp_json_encode(['success' => true, 'valid' => true]); wp_die(); } else { wp_nonce_ays(); } } public function check_commands() { if (isset($_POST['polylai_restart'])) { delete_transient(polylai_Cron::LOCK_TRANSIENT_KEY); delete_transient(polylai_Cron::ACTIVITY_TRANSIENT_KEY); } } public function register_api() { register_rest_route('polylai/v1', '/cron', array( 'methods' => 'GET', 'callback' => [$this->cron, 'execCron'], 'permission_callback' => function () { return true; $user = wp_get_current_user(); if (in_array('author', (array) $user->roles)) { return true; } if (in_array('editor', (array) $user->roles)) { return true; } if (in_array('administrator', (array) $user->roles)) { return true; } return false; } )); } private function run_http_cron() { $cron_url = home_url('/index.php?action=polylai_run_cron'); try { wp_remote_get($cron_url, [ 'timeout' => 1, 'blocking' => false ]); } catch (Exception $e) { polylai_Utils::db_log('error', 'run_http_cron', $e->getMessage()); } } public function polylai_run_cron() { if (wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['nonce'])), 'polylai_run_cron')) { $this->run_http_cron(); } else { wp_nonce_ays(); } } public function action_links($links) { $links[] = 'Settings'; return $links; } public function get_logs() { if (!isset($_POST['polylai_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['polylai_nonce'])), 'polylai_nonce')) { wp_send_json_error(['message' => 'Invalid nonce']); wp_die(); } global $wpdb; $logs = []; $table_name = $wpdb->prefix . 'polylai_log'; $query = $wpdb->prepare("SELECT `time`, `type`, `operation`, `post_id`, `post_title`, `message` FROM %i ORDER BY id DESC LIMIT 100", $table_name); $results = $wpdb->get_results($query); foreach ($results as $key => $row) { $logs[] = $row; } header("Content-type: application/json"); echo wp_json_encode($logs); wp_die(); } public function download_logs() { global $wpdb; $logs = []; $limit = polylai_Utils::is_debug() ? 1000 : 100; $table_name = $wpdb->prefix . 'polylai_log'; $query = $wpdb->prepare("SELECT * FROM %i ORDER BY id DESC LIMIT %d", $table_name, $limit); $results = $wpdb->get_results($query); foreach ($results as $key => $row) { $logs[] = $row; } echo wp_json_encode($logs); wp_die(); } }