| @@ -30,8 +30,9 @@ | ||
| 30 | 30 | */ |
| 31 | 31 | public function __construct() { |
| 32 | 32 | add_action( 'admin_init', array( $this, 'handle_external_redirects' ) ); |
| 33 | 33 | add_action( 'admin_menu', array( $this, 'menu_page_callback' ) ); |
| 34 | + add_action( 'admin_footer', array( $this, 'sync_addon_submenu_visibility' ) ); | |
| 34 | 35 | add_action( 'in_admin_header', array( $this, 'remove_all_notices' ) ); |
| 35 | 36 | add_filter( 'plugin_row_meta', array( $this, 'plugin_settings_meta' ), 10, 2 ); |
| 36 | 37 | add_filter( 'plugin_action_links_' . ULTP_BASE, array( $this, 'plugin_action_links_callback' ) ); |
| 37 | 38 | } |
| @@ -71,69 +72,25 @@ | ||
| 71 | 72 | */ |
| 72 | 73 | public function plugin_action_links_callback( $links ) { |
| 73 | 74 | $offer_config = array( |
| 74 | 75 | array( |
| 75 | - 'start' => '2026-02-19 00:00 Asia/Dhaka', | |
| 76 | - 'end' => '2026-02-23 23:59 Asia/Dhaka', | |
| 76 | + 'start' => '2026-07-06 00:00 Asia/Dhaka', | |
| 77 | + 'end' => '2026-08-01 23:59 Asia/Dhaka', | |
| 77 | 78 | 'text' => __( |
| 78 | - 'Flash Sale - Up to 45% OFF', | |
| 79 | + 'Summer Sale - Up to 50% OFF', | |
| 79 | 80 | 'ultimate-post' |
| 80 | 81 | ), |
| 81 | - 'utmKey' => 'flash_sale_meta', | |
| 82 | + 'utmKey' => 'summer_sale_meta', | |
| 82 | 83 | ), |
| 83 | 84 | array( |
| 84 | - 'start' => '2026-03-16 00:00 Asia/Dhaka', | |
| 85 | - 'end' => '2026-04-14 23:59 Asia/Dhaka', | |
| 85 | + 'start' => '2026-09-02 00:00 Asia/Dhaka', | |
| 86 | + 'end' => '2026-10-10 23:59 Asia/Dhaka', | |
| 86 | 87 | 'text' => __( |
| 87 | - 'Spring Sale - Up to 50% OFF', | |
| 88 | + 'Get Pro at $39', | |
| 88 | 89 | 'ultimate-post' |
| 89 | 90 | ), |
| 90 | - 'utmKey' => 'spring_sale_meta', | |
| 91 | + 'utmKey' => 'base_price_meta', | |
| 91 | 92 | ), |
| 92 | - | |
| 93 | - // Flash sale | |
| 94 | - array( | |
| 95 | - 'start' => '2026-05-07 00:00 Asia/Dhaka', | |
| 96 | - 'end' => '2026-05-21 23:59 Asia/Dhaka', | |
| 97 | - 'text' => __( | |
| 98 | - 'Flash Sale - Up to 45% OFF', | |
| 99 | - 'ultimate-post' | |
| 100 | - ), | |
| 101 | - 'utmKey' => 'flash_sale_meta', | |
| 102 | - ), | |
| 103 | - | |
| 104 | - // Surprise Sale | |
| 105 | - array( | |
| 106 | - 'start' => '2026-05-22 00:00 Asia/Dhaka', | |
| 107 | - 'end' => '2026-06-01 23:59 Asia/Dhaka', | |
| 108 | - 'text' => __( | |
| 109 | - 'Surprise Sale - Up to 50% OFF', | |
| 110 | - 'ultimate-post' | |
| 111 | - ), | |
| 112 | - 'utmKey' => 'surprise_sale_meta', | |
| 113 | - ), | |
| 114 | - | |
| 115 | - // Massive Sale | |
| 116 | - array( | |
| 117 | - 'start' => '2026-06-02 00:00 Asia/Dhaka', | |
| 118 | - 'end' => '2026-06-20 23:59 Asia/Dhaka', | |
| 119 | - 'text' => __( | |
| 120 | - 'Massive Sale - Up to 50% OFF', | |
| 121 | - 'ultimate-post' | |
| 122 | - ), | |
| 123 | - 'utmKey' => 'massive_sale_meta', | |
| 124 | - ), | |
| 125 | - | |
| 126 | - // Final hours sale | |
| 127 | - array( | |
| 128 | - 'start' => '2026-06-21 00:00 Asia/Dhaka', | |
| 129 | - 'end' => '2026-06-30 23:59 Asia/Dhaka', | |
| 130 | - 'text' => __( | |
| 131 | - 'Final Hours Sale - Up to 50% OFF', | |
| 132 | - 'ultimate-post' | |
| 133 | - ), | |
| 134 | - 'utmKey' => 'final_hour_meta', | |
| 135 | - ), | |
| 136 | 93 | ); |
| 137 | 94 | |
| 138 | 95 | $setting_link = array( |
| 139 | 96 | 'ultp_options' => '<a href="' . esc_url( admin_url( 'admin.php?page=ultp-settings#startersites' ) ) . '">' . esc_html__( 'Starter Sites', 'ultimate-post' ) . '</a>', |
| @@ -151,9 +108,13 @@ | ||
| 151 | 108 | $url = 'https://account.wpxpo.com/checkout/?edd_license_key=' . $license_key; |
| 152 | 109 | } else { |
| 153 | 110 | |
| 154 | 111 | $text = esc_html__( 'Upgrade to Pro', 'ultimate-post' ); |
| 155 | - $url = Xpo::generate_utm_link(); | |
| 112 | + $url = Xpo::generate_utm_link( | |
| 113 | + array( | |
| 114 | + 'utmKey' => 'sub_menu', | |
| 115 | + ) | |
| 116 | + ); | |
| 156 | 117 | |
| 157 | 118 | foreach ( $offer_config as $offer ) { |
| 158 | 119 | $current_time = gmdate( 'U' ); |
| 159 | 120 | $notice_start = gmdate( 'U', strtotime( $offer['start'] ) ); |
| @@ -286,8 +247,46 @@ | ||
| 286 | 247 | $menupage_cap, |
| 287 | 248 | 'ultp-startersites', |
| 288 | 249 | array( self::class, 'handle_external_redirects' ) |
| 289 | 250 | ); |
| 251 | + } | |
| 252 | + | |
| 253 | + /** | |
| 254 | + * Sync addon-backed WordPress submenu items with addon enabled status. | |
| 255 | + * | |
| 256 | + * @since v.4.1.7 | |
| 257 | + * @return void No return value. | |
| 258 | + */ | |
| 259 | + public function sync_addon_submenu_visibility() { | |
| 260 | + $settings = ultimate_post()->get_setting(); | |
| 261 | + $submenus = array( | |
| 262 | + 'builder' => 'ultp_builder', | |
| 263 | + 'saved-templates' => 'ultp_templates', | |
| 264 | + 'custom-font' => 'ultp_custom_font', | |
| 265 | + ); | |
| 266 | + | |
| 267 | + foreach ( $submenus as $slug => $setting_key ) { | |
| 268 | + $submenus[ $slug ] = isset( $settings[ $setting_key ] ) && $settings[ $setting_key ] !== 'false'; | |
| 269 | + } | |
| 270 | + ?> | |
| 271 | + <script> | |
| 272 | + ( function() { | |
| 273 | + const postxAddonSubmenus = <?php echo wp_json_encode( $submenus ); ?>; | |
| 274 | + | |
| 275 | + Object.keys( postxAddonSubmenus ).forEach( function( slug ) { | |
| 276 | + const link = document.querySelector( '#adminmenu a[href*="page=ultp-settings#' + slug + '"]' ); | |
| 277 | + const item = link ? link.closest( 'li' ) : null; | |
| 278 | + | |
| 279 | + if ( ! item ) { | |
| 280 | + return; | |
| 281 | + } | |
| 282 | + | |
| 283 | + item.id = 'postx-submenu-' + slug; | |
| 284 | + item.style.display = postxAddonSubmenus[ slug ] ? '' : 'none'; | |
| 285 | + } ); | |
| 286 | + }() ); | |
| 287 | + </script> | |
| 288 | + <?php | |
| 290 | 289 | } |
| 291 | 290 | |
| 292 | 291 | /** |
| 293 | 292 | * Handle external redirects for menu and pro links. |