get_path() ), array( Charitable_Admin::get_instance(), 'add_plugin_action_links' ) ); /** * Add a link to the settings page from the Charitable plugin block. * * @see Charitable_Admin::add_plugin_row_meta() */ add_filter( 'plugin_row_meta', array( Charitable_Admin::get_instance(), 'add_plugin_row_meta' ), 10, 2 ); /** * Export handlers. * * @see Charitable_Admin::export_donations() * @see Charitable_Admin::export_campaigns() */ add_action( 'charitable_export_donations', array( Charitable_Admin::get_instance(), 'export_donations' ) ); add_action( 'charitable_export_campaigns', array( Charitable_Admin::get_instance(), 'export_campaigns' ) ); /** * Add Charitable menu. * * @see Charitable_Admin_Pages::add_menu() */ add_action( 'admin_menu', array( Charitable_Admin_Pages::get_instance(), 'add_menu' ), 5 ); add_action( 'parent_file', array( Charitable_Admin_Pages::get_instance(), 'menu_highlight' ), 10 ); /** * Redirect to welcome page after install. * * @see Charitable_Admin_Pages::redirect_to_welcome() */ add_action( 'charitable_install', array( Charitable_Admin_Pages::get_instance(), 'setup_welcome_redirect' ), 100 ); /** * Stash any notices that haven't been displayed. * * @see Charitable_Admin_Notices::shutdown() */ add_action( 'shutdown', array( charitable_get_admin_notices(), 'shutdown' ) ); /** * Stash any notices that haven't been displayed. * * @see Charitable_Admin_Support::maybe_do_charitable_support_query() */ add_action( 'admin_init', array( Charitable_Admin_Support::get_instance(), 'maybe_do_charitable_support_query' ), 100 ); /** * Enqueue Charitable's campaign builder related scripts & styles. * * @see Charitable_Campaign_Builder::add_page() */ add_action( 'admin_menu', array( Charitable_Campaign_Builder::get_instance(), 'add_page' ), 5 ); /** * Enqueue Charitable's campaign builder related scripts & styles. * * @see Charitable_Campaign_Builder::init() */ add_action( 'admin_init', array( Charitable_Campaign_Builder::get_instance(), 'init' ), 100 ); /** * Enqueue Charitable's campaign builder embed related scripts & styles. * * @see Charitable_Campaign_Embed_Wizard::init() */ add_action( 'admin_init', array( Charitable_Campaign_Embed_Wizard::get_instance(), 'init' ), 100 ); /** * Enqueue Charitable's block releated scripts & styles. * * @see Charitable_Admin_Blocks::admin_enqueue_scripts() */ add_action( 'admin_enqueue_scripts', array( Charitable_Admin_Blocks::get_instance(), 'admin_enqueue_scripts' ) ); /** * Enqueue Charitable's styles for the block editor canvas (the editor iframe). * * Must be on `enqueue_block_assets` rather than `admin_enqueue_scripts` — that is the hook * core collects when building the iframe's assets. * * @see Charitable_Admin_Blocks::enqueue_block_editor_canvas_styles() */ add_action( 'enqueue_block_assets', array( Charitable_Admin_Blocks::get_instance(), 'enqueue_block_editor_canvas_styles' ) ); /** * Enqueue Charitable's campaign builder congrats wizard related scripts & styles. * * @see Charitable_Campaign_Congrats_Wizard::init() */ add_action( 'admin_init', array( Charitable_Campaign_Congrats_Wizard::get_instance(), 'init' ), 120 ); /** * Dismiss dashboard notices. * * @see Charitable_Admin::dismiss_dashboard_notice() */ add_action( 'wp_ajax_charitable_dismiss_dashboard_notice', array( Charitable_Admin::get_instance(), 'dismiss_dashboard_notices' ) ); /** * Dismiss guide tool related notices. * * @see Charitable_Admin::dismiss_growth_tools_notices() */ add_action( 'wp_ajax_charitable_dismiss_growth_tools_dashboard_notice', array( Charitable_Admin::get_instance(), 'dismiss_growth_tools_notices' ) ); /** * Do an admin action. * * @see Charitable_Admin::maybe_do_admin_action() */ add_action( 'plugins_loaded', array( Charitable_Admin_Getting_Started::get_instance(), 'init' ), 999 ); /** * Insert HTML into the footer that can be used later by onboarding. * * @see Charitable_Campaign_Builder::render_onboarding_html() */ add_action( 'admin_footer', array( Charitable_Campaign_Builder::get_instance(), 'render_onboarding_html' ), 5 ); /** * Save an onboarding options via AJAX. * * @see Charitable_Campaign_Builder::save_onboarding_option_ajax() */ add_action( 'wp_ajax_charitable_onboarding_save_option', array( Charitable_Campaign_Builder::get_instance(), 'save_onboarding_option_ajax' ), 5 ); add_action( 'wp_ajax_charitable_onboarding_tour_save_option', array( Charitable_Campaign_Builder::get_instance(), 'save_tour_option_ajax' ), 5 ); add_action( 'wp_ajax_charitable_onboarding_checklist_save_option', array( Charitable_Checklist::get_instance(), 'save_checklist_option_ajax' ), 5 ); /** * Checklist: check to mark step as completed. * * @see Charitable_Checklist::check_step_first_donation() */ add_action( 'admin_init', array( Charitable_Checklist::get_instance(), 'maybe_redirect_to_next_step' ), 999 ); /** * Plugin notifications, added mostly in 1.8.3. * * @see Charitable_Notifications::add_notifications_to_menu() * @see Charitable_Notifications::dismiss() * @see Charitable_Notifications::dismiss_multiple() * @see Charitable_Notifications::maybe_redirect_from_notifications() */ add_filter( 'admin_init', array( Charitable_Notifications::get_instance(), 'init' ), 9 ); add_filter( 'charitable_submenu_pages', array( Charitable_Notifications::get_instance(), 'add_notifications_to_menu' ), 2 ); add_filter( 'wp_ajax_charitable_notification_dismiss', array( Charitable_Notifications::get_instance(), 'dismiss' ), 10 ); add_filter( 'wp_ajax_charitable_notification_dismiss_multiple', array( Charitable_Notifications::get_instance(), 'dismiss_multiple' ), 10 ); add_action( 'admin_init', array( Charitable_Notifications::get_instance(), 'maybe_redirect_from_notifications' ), 10 ); /** * Notifications v2 — Settings must init before Local Notifications and Cron * so is_category_enabled() is available to both. * * @since 1.8.12 */ Charitable_Notification_Settings::get_instance()->init(); /** * Local Notifications — manages locally-generated notifications. * * @since 1.8.12 */ Charitable_Local_Notifications::get_instance()->init(); /** * Notification Cron — schedules and runs periodic checks. * * @since 1.8.12 */ Charitable_Notification_Cron::get_instance()->init(); /** * Notification Triggers — hook-based milestone and lifecycle events. * * @since 1.8.12 */ Charitable_Notification_Triggers::get_instance()->init(); /** * Notifications V2 onboarding tour. * * @since 1.8.12 */ // Charitable_Notification_Onboarding::get_instance()->init(); // TODO: re-enable before release /** * New Announcement Feed. * * @since 1.8.12 */ Charitable_New_Feed::get_instance()->init(); /** * Notifications V2 test helper (admin-only). Triggered by ?charitable_notif_test=. * * This is a development-only QA harness that seeds/clears notification state and * fires cron jobs on demand. It is a state-changing GET handler with no nonce, so * it must never be wired up in a production build. It is gated behind both WP_DEBUG * and an explicit opt-in constant; to enable it locally, define both in wp-config.php: * * define( 'WP_DEBUG', true ); * define( 'CHARITABLE_NOTIFICATION_TEST_HELPER', true ); * * @since 1.8.12 */ if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'CHARITABLE_NOTIFICATION_TEST_HELPER' ) && CHARITABLE_NOTIFICATION_TEST_HELPER ) { Charitable_Notification_Test_Helper::get_instance()->init(); add_action( 'admin_notices', array( Charitable_Notification_Test_Helper::get_instance(), 'maybe_show_notice' ) ); } /** * Event Driven notifications and items, added mostly in 1.8.3. * * @see Charitable_EventDriven::init() * @see Charitable_EventDriven::update_events() */ add_action( 'plugins_loaded', array( Charitable_EventDriven::get_instance(), 'init' ), 999 ); add_filter( 'charitable_admin_notifications_update_data', array( Charitable_EventDriven::get_instance(), 'update_events' ), 9 ); /** * License checks. * * @see Charitable_Admin_Pages::add_menu() */ add_action( 'admin_init', array( Charitable_Licenses_Settings::get_instance(), 'maybe_check_if_license_expired' ), 9999 ); add_action( 'admin_init', array( Charitable_Licenses_Settings::get_instance(), 'maybe_check_if_license_expiring' ), 9998 ); add_action( 'admin_init', array( Charitable_Licenses_Settings::get_instance(), 'activate_pro_plugin_after_license_activation' ), 1 ); /** * Connect for upgrade.wpcharitable.com. * * @see Charitable_Admin_Connect::settings_enqueues() * @see Charitable_Admin_Connect::generate_url() * @see Charitable_Admin_Connect::process() */ add_action( 'after_charitable_admin_enqueue_scripts', array( Charitable_Admin_Connect::get_instance(), 'settings_enqueues' ), 10, 3 ); add_action( 'wp_ajax_charitable_connect_url', array( Charitable_Admin_Connect::get_instance(), 'generate_url' ) ); add_filter( 'charitable_license_verify_success_data', array( Charitable_Admin_Connect::get_instance(), 'add_upgrade_url_to_license_response' ), 10, 2 ); add_action( 'wp_ajax_nopriv_charitable_connect_process', array( Charitable_Admin_Connect::get_instance(), 'process' ) ); add_action( 'wp_ajax_charitable_download_pro', array( Charitable_Admin_Connect::get_instance(), 'download_pro_plugin' ) ); add_action( 'wp_ajax_charitable_activate_pro', array( Charitable_Admin_Connect::get_instance(), 'activate_pro_plugin' ) ); /** * Initialize splash data. * * @see Charitable_Admin_Splash::initialize_splash_data() */ add_action( 'admin_init', [ Charitable_Admin_Splash::get_instance(), 'initialize_splash_data' ], 15 ); add_action( 'admin_enqueue_scripts', [ Charitable_Admin_Splash::get_instance(), 'admin_enqueue_scripts' ] ); add_action( 'admin_footer', [ Charitable_Admin_Splash::get_instance(), 'admin_footer' ] ); /** * Show a notice if GiveWP is detected. * * @see Charitable_GiveWP_Notice::get_dashboard_notices() */ add_filter( 'charitable_admin_dashboard_init_end', array( Charitable_GiveWP_Notice::get_instance(), 'get_dashboard_notices' ), 10 ); /** * Display Charitable banners on external (non-Charitable) admin screens. * * @see Charitable_External_Banner */ Charitable_External_Banner::get_instance(); /** * Dashboard AJAX handlers. * * @see Charitable_Dashboard::ajax_activate_addon() * @see Charitable_Dashboard::ajax_approve_comment() * @see Charitable_Dashboard::ajax_delete_comment() * @see Charitable_Dashboard::ajax_install_charitable_addon() * @see Charitable_Dashboard::ajax_activate_charitable_addon() */ add_action( 'wp_ajax_charitable_activate_addon', array( Charitable_Dashboard::get_instance(), 'ajax_activate_addon' ) ); add_action( 'wp_ajax_charitable_approve_comment', array( Charitable_Dashboard::get_instance(), 'ajax_approve_comment' ) ); add_action( 'wp_ajax_charitable_delete_comment', array( Charitable_Dashboard::get_instance(), 'ajax_delete_comment' ) ); add_action( 'wp_ajax_charitable_install_charitable_addon', array( Charitable_Dashboard::get_instance(), 'ajax_install_charitable_addon' ) ); add_action( 'wp_ajax_charitable_activate_charitable_addon', array( Charitable_Dashboard::get_instance(), 'ajax_activate_charitable_addon' ) );