HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-172-31-4-197 6.8.0-1036-aws #38~22.04.1-Ubuntu SMP Fri Aug 22 15:44:33 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/html/wordpress/wp-content/plugins/trinity-audio/admin/index.php
<?php
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
  require_once __DIR__ . '/../inc/templates.php';
  require_once __DIR__ . '/../metaboxes.php';
  require_once __DIR__ . '/../migrations/index.php';

  if (trinity_is_dev_env()) {
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    // for testing
    $max_exec_time = get_option('trinity_audio_max_exec_time');
    if ($max_exec_time) {
      set_time_limit($max_exec_time);
    }
  }

  add_action('admin_enqueue_scripts', 'trinity_admin_scripts');
  add_action('admin_menu', function() {
    trinity_migration_init();
  });

  function trinity_admin_scripts() {
    // TODO: filter out only our pages

    wp_enqueue_script('jquery-ui-dialog');
    wp_enqueue_style('wp-jquery-ui-dialog');

    wp_enqueue_script('trinity_audio_common', plugin_dir_url(__FILE__) . '../js/common.js', [], wp_rand(), true);
    wp_enqueue_script('trinity_audio_admin', plugin_dir_url(__FILE__) . '../js/admin.js', [], wp_rand(), true);
    wp_enqueue_style('trinity_audio_styles', plugin_dir_url(__FILE__) . 'dist/styles.css', [], wp_rand());

    $bulk_progress = [];

    if (trinity_phbu_is_bulk_update_alive()) {
      $bulk_progress = trinity_phbu_get_status_data();
    }

    wp_localize_script(
      'trinity_audio_admin',
      'TRINITY_WP_ADMIN',
      [
        'TRINITY_AUDIO_POST_EDIT'            => admin_url('edit.php'),
        'TRINITY_AUDIO_ADMIN_POST'           => admin_url('admin-post.php'),
        'TRINITY_AUDIO_ADMIN'                => admin_url('admin.php'),
        'TRINITY_AUDIO_ASSETS'               => plugins_url('assets', dirname(__FILE__)),
        'TRINITY_AUDIO_BULK_UPDATE_STATUS'   => TRINITY_AUDIO_BULK_UPDATE_STATUS,
        'TRINITY_AUDIO_BULK_UPDATE'          => TRINITY_AUDIO_BULK_UPDATE,
        'TRINITY_AUDIO_CONTACT_US'           => TRINITY_AUDIO_CONTACT_US,
        'TRINITY_AUDIO_INSTALLKEY'           => TRINITY_AUDIO_INSTALLKEY,
        'TRINITY_AUDIO_PUBLISHER_TOKEN'      => TRINITY_AUDIO_PUBLISHER_TOKEN,
        'TRINITY_AUDIO_PUBLISHER_TOKEN_URL'  => TRINITY_AUDIO_PUBLISHER_TOKEN_URL,
        'TRINITY_AUDIO_REGENERATE_TOKENS'    => TRINITY_AUDIO_REGENERATE_TOKENS,
        'TRINITY_AUDIO_REGISTER'             => TRINITY_AUDIO_REGISTER,
        'TRINITY_AUDIO_RECOVER_INSTALLKEY'   => TRINITY_AUDIO_RECOVER_INSTALLKEY,
        'TRINITY_AUDIO_FIRST_CHANGES_SAVE'   => TRINITY_AUDIO_FIRST_CHANGES_SAVE,
        'TRINITY_AUDIO_BULK_UPDATE_PROGRESS' => $bulk_progress,
        TRINITY_AUDIO_SKIP_TAGS              => implode(',', trinity_get_skip_tags()),
        TRINITY_AUDIO_ALLOW_SHORTCODES       => implode(',', trinity_get_allowed_shortcodes()),
        'TRINITY_AUDIO_EMAIL_SUBSCRIPTION'   => TRINITY_AUDIO_EMAIL_SUBSCRIPTION,
        'TRINITY_AUDIO_UPDATE_UNIT_CONFIG'   => TRINITY_AUDIO_UPDATE_UNIT_CONFIG,
        'TRINITY_AUDIO_SEND_METRIC'          => TRINITY_AUDIO_SEND_METRIC,
        'TRINITY_AUDIO_REMOVE_POST_BANNER'   => TRINITY_AUDIO_REMOVE_POST_BANNER,
        'TRINITY_AUDIO_PACKAGE_INFO'         => TRINITY_AUDIO_PACKAGE_INFO,
        'TRINITY_AUDIO_AJAX_NONCE_NAME'      => TRINITY_AUDIO_AJAX_NONCE_NAME,
        'TRINITY_AUDIO_NONCES' => [
              'register' => wp_create_nonce('register_action'),
              'update_unit_config' => wp_create_nonce('update_unit_config_action'),
              'assign_account_key' => wp_create_nonce('assign_account_key_action'),
              'contact_us' => wp_create_nonce('contact_us_action'),
              'regenerate_tokens' => wp_create_nonce('regenerate_tokens_action'),
              'send_metric' => wp_create_nonce('send_metric_action'),
              'remove_post_banner' => wp_create_nonce('remove_post_banner_action'),
              'get_package_info' => wp_create_nonce('get_package_info_action'),

              'audio_bulk_update' => wp_create_nonce('audio_bulk_update_action'),
              'audio_bulk_update_status' => wp_create_nonce('audio_bulk_update_status_action'),
        ]
      ]
    );
  }

  add_filter('plugin_row_meta', 'trinity_audio_plugin_links', 9999, 4);

  add_action('admin_init', 'trinity_admin_create_page');
  add_action('admin_menu', 'trinity_admin_create_menu');
  add_action('wp_ajax_' . TRINITY_AUDIO_REGENERATE_TOKENS, 'trinity_ph_update_regenerate_tokens');
  add_action('wp_ajax_' . TRINITY_AUDIO_BULK_UPDATE_STATUS, 'trinity_phbu_get_status');
  add_action('wp_ajax_' . TRINITY_AUDIO_CONTACT_US, 'trinity_audio_ajax_contact_us');
  add_action('wp_ajax_' . TRINITY_AUDIO_REGISTER, 'trinity_audio_ajax_register');
  add_action('wp_ajax_' . TRINITY_AUDIO_PUBLISHER_TOKEN_URL, 'trinity_save_publisher_token');
  add_action('wp_ajax_' . TRINITY_AUDIO_UPDATE_UNIT_CONFIG, 'trinity_audio_ajax_update_unit_config');
  add_action('wp_ajax_' . TRINITY_AUDIO_SEND_METRIC, 'trinity_send_stat_metrics');
  add_action('wp_ajax_' . TRINITY_AUDIO_REMOVE_POST_BANNER, 'trinity_audio_ajax_remove_post_banner');
  add_action('wp_ajax_' . TRINITY_AUDIO_PACKAGE_INFO, 'trinity_get_and_render_package');
  add_action('update_option', 'trinity_audio_enable_for_last_20_posts'); // updated_option will not work, since at that point trinity_get_is_first_changes_saved() will be 1

  // triggers by admin.js checkIfPostsBulkUpdateRequested only after cleaning shortcodes or skip HTML tags
  add_action('admin_post_' . TRINITY_AUDIO_BULK_UPDATE, 'trinity_phbu_start_from_admin');

  register_deactivation_hook(__FILE__, 'trinity_audio_deactivation');

  function trinity_audio_activation() {
    trinity_update_details(TRINITY_AUDIO_UPDATE_PLUGIN_DETAILS_URL, 'activated', false);
  }

  function trinity_audio_deactivation() {
    trinity_update_details(TRINITY_AUDIO_UPDATE_PLUGIN_DETAILS_URL, 'deactivated', false);
  }

  trinity_init_default_settings();

  function trinity_init_default_settings() {
    // lets add keys as well, so if user has them from previous setup - can find them by name and edit them.
    add_option(TRINITY_AUDIO_INSTALLKEY, '', '', true);
    add_option(TRINITY_AUDIO_VIEWKEY, '', '', true);

    add_option(TRINITY_AUDIO_PLUGIN_VERSION, [], '', true);
    add_option(TRINITY_AUDIO_PLUGIN_MIGRATION, [], '', true);
    add_option(TRINITY_AUDIO_SOURCE_LANGUAGE, 'en-US', '', true);
    add_option(TRINITY_AUDIO_POWERED_BY, 1, '', true);
    add_option(TRINITY_AUDIO_PRECONNECT, 1, '', true);
    add_option(TRINITY_AUDIO_PLAYER_LABEL, '', '', true);
    add_option(TRINITY_AUDIO_SOURCE_NEW_POSTS_DEFAULT, 1, '', true);
    add_option(TRINITY_AUDIO_SKIP_TAGS, [], '', true);
    add_option(TRINITY_AUDIO_ALLOW_SHORTCODES, [], '', true);
    add_option(TRINITY_AUDIO_CHECK_FOR_LOOP, 0, '', true);
    add_option(TRINITY_AUDIO_ACTIVATE_ON_API_POST_CREATION, 0, '', true);
    add_option(TRINITY_AUDIO_FIRST_CHANGES_SAVE, 0, '', true);
  }

  if (trinity_get_is_first_changes_saved() && trinity_get_install_key() && trinity_get_view_key()) {
    add_filter('bulk_actions-edit-post', function($bulk_actions) {
      $bulk_actions['enable-trinity-audio']  = 'Enable Trinity Audio';
      $bulk_actions['disable-trinity-audio'] = 'Disable Trinity Audio';
      return $bulk_actions;
    });

    add_filter('handle_bulk_actions-edit-post', function($redirect_url, $action, $post_ids) {
      if ($action == 'enable-trinity-audio') {
        foreach ($post_ids as $post_id) {
          update_post_meta($post_id, TRINITY_AUDIO_ENABLED, 1);
        }
      }

      if ($action == 'disable-trinity-audio') {
        foreach ($post_ids as $post_id) {
          update_post_meta($post_id, TRINITY_AUDIO_ENABLED, 0);
        }
      }

      return $redirect_url;
    }, 9999, 3);

    add_action('restrict_manage_posts', function() {
      $values = [
        'Trinity Audio enabled'  => '1',
        'Trinity Audio disabled' => '0'
      ];
      ?>
      <select name="trinity-audio-bulk-filter">
        <option value="">All posts</option>
        <?php
          $is_filtered = isset($_GET['trinity-audio-bulk-filter']) ? $_GET['trinity-audio-bulk-filter'] : '';

          foreach ($values as $label => $value) {
            $is_selected = $value == $is_filtered ? ' selected="selected"' : '';
            echo "<option value='" . esc_attr($value) . "'" . esc_attr($is_selected) . ">" . esc_html($label) . "</option>";
          }
        ?>
      </select>
      <?php
    });

    add_filter('parse_query', function($query) {
      global $pagenow;

      if (is_admin() && $pagenow == 'edit.php' && isset($_GET['trinity-audio-bulk-filter']) && $_GET['trinity-audio-bulk-filter'] != '') {
        $value = $_GET['trinity-audio-bulk-filter'];

        if ($value === '0') {
          $query->query_vars['meta_query'] = [
            'relation' => 'OR',
            // when no posts activated, we don't have any record in wp_postmeta at all
            [
              'key'     => TRINITY_AUDIO_ENABLED,
              'compare' => 'NOT EXISTS'
            ],
            [
              'key'     => TRINITY_AUDIO_ENABLED,
              'value' => '0',
              'compare' => '='
            ]
          ];
        } else {
          $query->query_vars['meta_key']     = TRINITY_AUDIO_ENABLED;
          $query->query_vars['meta_value']   = $value;
          $query->query_vars['meta_compare'] = '=';
        }
      }
    });
  }

  function trinity_admin_create_page() {
    // add our page to whitelist, so we can POST to options.php.
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO);
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_SOURCE_LANGUAGE);

    // allow to save to DB.
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_SOURCE_NEW_POSTS_DEFAULT);
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_PLAYER_LABEL);
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_POWERED_BY);
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_PRECONNECT);

    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_FIRST_CHANGES_SAVE);

    register_setting(
      TRINITY_AUDIO,
      TRINITY_AUDIO_SKIP_TAGS,
      [
        'sanitize_callback' => 'trinity_admin_save_as_array'
      ]
    );

    register_setting(
      TRINITY_AUDIO,
      TRINITY_AUDIO_ALLOW_SHORTCODES,
      [
        'sanitize_callback' => 'trinity_admin_save_as_array'
      ]
    );

    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_CHECK_FOR_LOOP);
    register_setting(TRINITY_AUDIO, TRINITY_AUDIO_ACTIVATE_ON_API_POST_CREATION);
  }

  function trinity_admin_save_as_array($value) {
    // return an empty array if the input is empty
    if (empty(trim($value))) return [];

    // save into DB as array
    return array_map('trim', explode(',', $value));
  }

  function trinity_admin_create_menu() {
    add_menu_page('Trinity Audio', 'Trinity Audio', 'manage_options', 'trinity_audio', 'trinity_admin_setting_page', plugins_url('../assets/images/play-button.svg', __FILE__));

    if (!trinity_registered()) {
      return;
    }
    add_submenu_page('trinity_audio', 'Post Management', 'Post Management', 'manage_options', 'trinity_audio_post_management', 'trinity_admin_post_management');
    add_submenu_page('trinity_audio', 'Info', 'Info', 'manage_options', 'trinity_audio_info', 'trinity_admin_settings_info');
    add_submenu_page('trinity_audio', 'Logs', 'Logs', 'manage_options', 'trinity_audio_logs', 'trinity_admin_settings_submenu_logs');
    add_submenu_page('trinity_audio', 'Contact us', 'Contact us', 'manage_options', 'trinity_audio_contact_us', 'trinity_admin_settings_contact_us');
  }

  function trinity_admin_setting_page() {
    if (trinity_registered()) {
      require_once __DIR__ . '/inc/settings.php';
    } else {
      require_once __DIR__ . '/inc/register.php';
    }
  }

  function trinity_admin_post_management() {
    require_once __DIR__ . '/inc/post-management.php';
  }

  function trinity_admin_settings_info() {
    require_once __DIR__ . '/inc/info.php';
  }

  function trinity_admin_settings_submenu_logs() {
    require_once __DIR__ . '/inc/logs.php';
  }

  function trinity_admin_settings_contact_us() {
    require_once __DIR__ . '/inc/contact.php';
  }

  function trinity_audio_ajax_register() {
    check_ajax_referer('register_action', TRINITY_AUDIO_AJAX_NONCE_NAME);

    trinity_register();
    wp_die();
  }

  function trinity_audio_enable_for_last_20_posts($property) {
    if ($property !== TRINITY_AUDIO) return; // since it will trigger for each property, need to filter out for main one
    if (trinity_get_is_first_changes_saved()) return; // we only care when it's for the first time, so it means that record will be 0 in DB

    $posts = trinity_get_posts(0, 20);

    foreach ($posts as $key => $val) {
      update_metadata('post', $val, TRINITY_AUDIO_ENABLED, 1);
    }
  }

  function trinity_audio_plugin_links($plugin_meta, $plugin_file) {
    if (plugin_basename(__FILE__) == $plugin_file) {
      $row_meta = array(
        'guide'   => '<a href="https://www.trinityaudio.ai/the-trinity-audio-wordpress-plugin-implementation-guide" target="_blank" aria-label="Trinity Audio implementation guide">Implementation guide</a>',
        'rate us' => '<a href="https://wordpress.org/support/plugin/trinity-audio/reviews/#new-post" target="_blank" aria-label="Rate Trinity Audio">Rate us</a>'
      );
      return array_merge($plugin_meta, $row_meta);
    }
    return (array)$plugin_meta;
  }