version = get_plugin_data( self::$instance->file, false, false )['Version'] ?? ''; self::$instance->setup_constants(); self::$instance->includes(); self::$instance->hooks(); self::$instance->setup_objects(); return self::$instance; } /** * Setup the singleton instance * * @since 1.0.0 * * @param string $file File path to the main plugin file. */ private static function setup_instance( $file ) { self::$instance = new AffiliateWP_Affiliate_QR_Codes; self::$instance->file = $file; } /** * Return whether the main loading class has been instantiated or not. * * @since 1.0.0 * * @return bool True if instantiated. False if not. */ private static function is_instantiated() { // Return true if instance is correct class if ( ! empty( self::$instance ) && ( self::$instance instanceof AffiliateWP_Affiliate_QR_Codes ) ) { return true; } // Return false if not instantiated correctly. return false; } /** * Throws an error on object clone. * * The whole idea of the singleton design pattern is that there is a single * object therefore, we don't want the object to be cloned. * * @since 1.0.0 * * @return void */ public function __clone() { // Cloning instances of the class is forbidden. _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh? This object cannot be cloned.', 'affiliatewp-affiliate-qr-codes' ), '1.0.0' ); } /** * Disables unserialization of the class. * * @since 1.0.0 * * @return void */ public function __wakeup() { // Unserializing instances of the class is forbidden _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh? This class cannot be unserialized.', 'affiliatewp-affiliate-qr-codes' ), '1.0.0' ); } /** * Sets up the class. * * @since 1.0.0 */ public function __construct() { self::$instance = $this; } /** * Resets the instance of the class. * * @since 1.0.0 * @static */ public static function reset() { self::$instance = null; } /** * Sets up plugin constants. * * @since 1.0.0 * * @return void */ private function setup_constants() { // Plugin version. if ( ! defined( 'AFFWP_AQRC_VERSION' ) ) { define( 'AFFWP_AQRC_VERSION', $this->version ); } // Plugin Folder Path. if ( ! defined( 'AFFWP_AQRC_PLUGIN_DIR' ) ) { define( 'AFFWP_AQRC_PLUGIN_DIR', plugin_dir_path( $this->file ) ); } // Plugin Folder URL. if ( ! defined( 'AFFWP_AQRC_PLUGIN_URL' ) ) { define( 'AFFWP_AQRC_PLUGIN_URL', plugin_dir_url( $this->file ) ); } // Plugin Root File. if ( ! defined( 'AFFWP_AQRC_PLUGIN_FILE' ) ) { define( 'AFFWP_AQRC_PLUGIN_FILE', $this->file ); } } /** * Includes necessary files. * * @since 1.0.0 * * @return void */ private function includes() { // Bring in the autoloader. require_once AFFWP_AQRC_PLUGIN_DIR . 'includes/lib/affwp/affiliatewp-autoloader.php'; } /** * Sets up the default hooks and actions. * * @since 1.0.0 * * @return void */ private function hooks() { // Plugin meta. add_filter( 'plugin_row_meta', array( $this, 'plugin_meta' ), null, 2 ); } /** * Sets up objects and components. * * @since 1.0.0 */ private function setup_objects() { if ( is_admin() ) { self::$instance->settings = new Base\Admin\Settings; } $enabled_for_affiliate = affiliate_wp()->settings->get( 'qr_codes_enabled', false ); if ( false !== $enabled_for_affiliate ) { self::$instance->generator = new Base\Generator; self::$instance->affiliate_area = new Base\Affiliate_Area; if ( class_exists( 'AffiliateWP_Affiliate_Portal' ) ) { self::$instance->affiliate_portal = new Base\Affiliate_Portal; } } } /** * Modifies the plugin list table meta links. * * @since 1.0.0 * * @param array $links The current links array. * @param string $file A specific plugin table entry. * @return array The modified links array. */ public function plugin_meta( $links, $file ) { if ( $file === plugin_basename( $this->file ) ) { $label = __( 'More add-ons', 'affiliatewp-affiliate-qr-codes' ); $atts = array( 'title' => __( 'Get more add-ons for AffiliateWP', 'affiliatewp-affiliate-qr-codes' ) ); $plugins_link = affwp_admin_link( 'add-ons', $label, array(), $atts ); $links = array_merge( $links, array( $plugins_link ) ); } return $links; } } } /** * The main function responsible for returning the one true bootstrap instance * to functions everywhere. * * Use this function like you would a global variable, except without needing * to declare the global. * * Example: * * @since 1.0.0 * * @return \AffiliateWP_Affiliate_QR_Codes The one true bootstrap instance. */ function affiliatewp_affiliate_qr_codes() { return AffiliateWP_Affiliate_QR_Codes::instance(); }