*/ private array $gfield_ids = array( 'base' => 218523, 'source' => 0, 'network' => 9, 'clid' => 10, ); /** * Plugin header metadata, read once from the main file. * * @var array */ private array $plugin_data = array( 'name' => '', 'version' => '', 'url' => '', 'path' => '', 'main_file' => '', 'text_domain' => '', ); /** * Singleton instance. * * @var Constants|null */ private static $instance = null; /** * Reads plugin header data once on construction. */ private function __construct() { if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $main_file = dirname( __DIR__ ) . '/ad-click-tracking-for-gravity-forms.php'; // Avoid triggering just-in-time translation loading before init. $data = get_plugin_data( $main_file, false, false ); $this->plugin_data['main_file'] = $main_file; $this->plugin_data['name'] = isset( $data['Name'] ) ? (string) $data['Name'] : ''; $this->plugin_data['version'] = isset( $data['Version'] ) ? (string) $data['Version'] : ''; $this->plugin_data['url'] = rtrim( plugin_dir_url( $main_file ), '/' ); $this->plugin_data['path'] = rtrim( plugin_dir_path( $main_file ), '/' ); $this->plugin_data['text_domain'] = isset( $data['TextDomain'] ) ? (string) $data['TextDomain'] : ''; } /** * Returns the shared instance. */ public static function get_instance(): Constants { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Returns a single plugin metadata value. * * @param string $key Metadata key (name|version|url|path|main_file|text_domain). */ public function get_plugin_data( string $key ): string { return isset( $this->plugin_data[ $key ] ) ? (string) $this->plugin_data[ $key ] : ''; } /** * Returns the base Gravity Forms field ID. */ public function get_base_gfield_id(): int { return (int) $this->gfield_ids['base']; } /** * Returns the offset for a given Gravity Forms tracking field. * * @param string $field_type One of source|network|clid. */ public function get_gfield_id( string $field_type ): int { return isset( $this->gfield_ids[ $field_type ] ) ? (int) $this->gfield_ids[ $field_type ] : 0; } /** * Returns the Referral Source Tracking for Gravity Forms upgrade URL, * campaign-tagged so each placement can be told apart in analytics. * * @param string $placement Placement slug used as utm_content, e.g. "plugins-row". */ public static function upgrade_url( string $placement = '' ): string { $args = array( 'utm_source' => 'ad-click-tracking-for-gravity-forms', 'utm_medium' => 'wp-admin', 'utm_campaign' => 'free-to-pro', ); if ( '' !== $placement ) { $args['utm_content'] = $placement; } $url = add_query_arg( $args, self::UPGRADE_URL ); return (string) apply_filters( 'pb_act_upgrade_url', $url, $placement ); } /** * Prevents cloning of the singleton. */ private function __clone() {} }