plugin = $plugin; } public function register() { add_action( 'admin_menu', array( $this, 'add_menu' ), 20 ); add_action( 'admin_menu', array( $this, 'reorder_menu' ), 999 ); add_action( 'admin_init', array( $this, 'maybe_redirect_after_activation' ) ); add_action( 'admin_init', array( $this, 'repair_starter_template' ), 5 ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ), 100 ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_starter_assets' ), 35 ); add_action( 'admin_notices', array( $this, 'render_setup_notice' ) ); add_action( 'admin_notices', array( $this, 'render_ai_refresh_notice' ) ); add_action( 'all_admin_notices', array( $this, 'render_product_navigation' ) ); add_action( 'admin_post_divi_powers_starter_install', array( $this, 'handle_starter_install' ) ); add_action( 'admin_post_divi_powers_starter_rebuild', array( $this, 'handle_starter_rebuild' ) ); add_action( 'admin_post_divi_powers_onboarding_complete', array( $this, 'handle_complete' ) ); add_action( 'admin_post_divi_powers_onboarding_reopen', array( $this, 'handle_reopen' ) ); add_action( 'admin_post_divi_powers_onboarding_dismiss_notice', array( $this, 'handle_dismiss_notice' ) ); add_action( 'admin_post_divi_powers_ai_refresh_notice_dismiss', array( $this, 'handle_dismiss_ai_refresh_notice' ) ); add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 ); add_filter( 'template_include', array( $this, 'force_starter_page_template' ), 9999 ); add_filter( 'body_class', array( $this, 'starter_page_body_class' ) ); } public static function activate() { $connection = get_option( 'fived_site_bridge_settings', array() ); if ( ! is_array( $connection ) || empty( $connection['customer_connection_enabled'] ) ) { // A new installation has no existing AI client to refresh. update_option( self::AI_REFRESH_NOTICE_OPTION, self::AI_REFRESH_NOTICE_VERSION, false ); } $state = self::state(); if ( empty( $state['started_at'] ) ) { $state['started_at'] = time(); } update_option( self::OPTION_KEY, $state, false ); update_option( self::ACTIVATION_REDIRECT, 1, false ); } public static function state() { $saved = get_option( self::OPTION_KEY, array() ); $saved = is_array( $saved ) ? $saved : array(); $defaults = array( 'started_at' => 0, 'completed_at' => 0, 'notice_dismissed' => 0, 'starter_version' => 0, 'lite_demo' => array(), // Retain the old all-in-one starter state for migration and legacy pages. 'starter' => array(), ); $state = wp_parse_args( $saved, $defaults ); $state['lite_demo'] = is_array( $state['lite_demo'] ) ? $state['lite_demo'] : array(); $state['starter'] = is_array( $state['starter'] ) ? $state['starter'] : array(); return $state; } public static function setup_summary() { $state = self::state(); $pro_active = Divi_Powers_Plugin::is_pro_active(); $woo = class_exists( 'WooCommerce' ) || function_exists( 'WC' ); $funnel_ids = get_posts( array( 'post_type' => 'fivedp_funnel', 'post_status' => 'publish', 'posts_per_page' => 1, 'fields' => 'ids', ) ); $demo_id = ! empty( $state['lite_demo']['page_id'] ) ? absint( $state['lite_demo']['page_id'] ) : 0; $demo = $demo_id ? get_post( $demo_id ) : null; $lite_demo_ok = $demo && 'trash' !== $demo->post_status && 'lite-demo' === get_post_meta( $demo_id, self::ASSET_META, true ); $lite_demo_native = $lite_demo_ok && Divi_Powers_Native_Layouts::is_native_divi_content( (string) $demo->post_content ); $legacy_ok = self::legacy_starter_assets_valid( $state['starter'], $woo ); $pro_starter_native = $legacy_ok; foreach ( array( 'landing_page_id', 'offer_page_id', 'checkout_page_id', 'thank_you_page_id' ) as $starter_page_key ) { $starter_page_id = ! empty( $state['starter'][ $starter_page_key ] ) ? absint( $state['starter'][ $starter_page_key ] ) : 0; $starter_page = $starter_page_id ? get_post( $starter_page_id ) : null; if ( ! $starter_page || ! Divi_Powers_Native_Layouts::is_native_divi_content( (string) $starter_page->post_content ) ) { $pro_starter_native = false; break; } } $settings = get_option( Divi_Powers_Plugin::OPTION_KEY, array() ); $settings = is_array( $settings ) ? $settings : array(); $core_ready = ! empty( $settings['dismissible'] ) && ! empty( $settings['trigger_target'] ) && ! empty( $settings['content_toggle'] ); if ( $pro_active ) { $profile_ids = get_posts( array( 'post_type' => 'fivedp_woo_profile', 'post_status' => 'publish', 'posts_per_page' => 1, 'fields' => 'ids', ) ); $validation = get_option( 'divi_powers_validation_sessions', array() ); $items = array( array( 'id' => 'requirements', 'label' => __( 'Review system readiness', '5d-powers-for-divi' ), 'complete' => function_exists( 'et_builder_d5_enabled' ) && et_builder_d5_enabled(), ), array( 'id' => 'starter', 'label' => __( 'Install or connect a first funnel', '5d-powers-for-divi' ), 'complete' => $legacy_ok || ! empty( $funnel_ids ), ), array( 'id' => 'commerce', 'label' => __( 'Configure the checkout journey', '5d-powers-for-divi' ), 'complete' => ! $woo || ! empty( $profile_ids ), ), array( 'id' => 'validate', 'label' => __( 'Run an end-to-end validation', '5d-powers-for-divi' ), 'complete' => is_array( $validation ) && ! empty( $validation ), ), ); } else { $items = array( array( 'id' => 'requirements', 'label' => __( 'Confirm Divi 5 readiness', '5d-powers-for-divi' ), 'complete' => function_exists( 'et_builder_d5_enabled' ) && et_builder_d5_enabled(), ), array( 'id' => 'powers', 'label' => __( 'Turn on the core features', '5d-powers-for-divi' ), 'complete' => $core_ready, ), array( 'id' => 'starter', 'label' => __( 'Install the interactive starter page', '5d-powers-for-divi' ), 'complete' => $lite_demo_ok, ), array( 'id' => 'funnel', 'label' => __( 'Install or connect an example funnel', '5d-powers-for-divi' ), 'complete' => ! $woo || $legacy_ok || ! empty( $funnel_ids ), ), ); } $done = 0; foreach ( $items as $item ) { if ( ! empty( $item['complete'] ) ) { ++$done; } } $primary_page_id = $demo_id; if ( ! $primary_page_id && ! empty( $state['starter']['landing_page_id'] ) ) { $primary_page_id = absint( $state['starter']['landing_page_id'] ); } return array( 'items' => $items, 'done' => $done, 'total' => count( $items ), 'percent' => count( $items ) ? (int) round( ( $done / count( $items ) ) * 100 ) : 0, 'completed' => ! empty( $state['completed_at'] ), 'starter_ok' => $lite_demo_ok || $legacy_ok || ! empty( $funnel_ids ), 'lite_demo_ok' => $lite_demo_ok, 'lite_demo_native' => $lite_demo_native, 'legacy_ok' => $legacy_ok, 'pro_starter_native' => $pro_starter_native, 'demo_id' => $demo_id, 'primary_page_id' => $primary_page_id, 'woo' => $woo, 'funnel_id' => ! empty( $state['starter']['funnel_id'] ) ? absint( $state['starter']['funnel_id'] ) : 0, 'profile_id' => ! empty( $state['starter']['profile_id'] ) ? absint( $state['starter']['profile_id'] ) : 0, 'lite_demo' => $state['lite_demo'], 'starter' => $state['starter'], ); } public function add_menu() { add_submenu_page( 'divi-powers', __( 'Getting Started', '5d-powers-for-divi' ), __( 'Getting Started', '5d-powers-for-divi' ), 'manage_options', self::PAGE_SLUG, array( $this, 'render_page' ) ); } public function reorder_menu() { global $submenu; if ( empty( $submenu['divi-powers'] ) || ! is_array( $submenu['divi-powers'] ) ) { return; } $order = array( 'divi-powers' => 10, self::PAGE_SLUG => 20, 'divi-powers-plus-funnel' => 30, 'divi-powers-plus-checkout' => 40, 'divi-powers-commerce-utilities' => 50, 'divi-powers-design-library' => 60, 'divi-powers-upgrade' => 70, ); $order = apply_filters( 'divi_powers_submenu_order', $order ); usort( $submenu['divi-powers'], static function ( $a, $b ) use ( $order ) { $a_slug = isset( $a[2] ) ? $a[2] : ''; $b_slug = isset( $b[2] ) ? $b[2] : ''; $a_order = isset( $order[ $a_slug ] ) ? $order[ $a_slug ] : 500; $b_order = isset( $order[ $b_slug ] ) ? $order[ $b_slug ] : 500; return $a_order <=> $b_order; } ); foreach ( $submenu['divi-powers'] as &$item ) { if ( isset( $item[2] ) && 'divi-powers' === $item[2] ) { $item[0] = __( 'Dashboard', '5d-powers-for-divi' ); } } unset( $item ); } public function enqueue_admin_assets( $hook_suffix ) { $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( 0 !== strpos( $page, 'divi-powers' ) ) { return; } wp_enqueue_style( 'divi-powers-product-experience', DIVI_POWERS_URL . 'assets/css/product-experience.css', array(), DIVI_POWERS_VERSION ); } /** Load the shared starter styling for native Divi starter pages. */ public function enqueue_starter_assets() { if ( ! is_singular( 'page' ) ) { return; } $post_id = get_queried_object_id(); if ( ! $post_id || ! get_post_meta( $post_id, self::ASSET_META, true ) ) { return; } wp_enqueue_style( 'divi-powers-starter', DIVI_POWERS_URL . 'assets/css/starter-funnel.css', array( 'divi-powers-frontend' ), DIVI_POWERS_VERSION ); } public function maybe_redirect_after_activation() { if ( ! current_user_can( 'manage_options' ) || ! get_option( self::ACTIVATION_REDIRECT ) ) { return; } delete_option( self::ACTIVATION_REDIRECT ); if ( wp_doing_ajax() || isset( $_GET['activate-multi'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return; } wp_safe_redirect( admin_url( 'admin.php?page=' . self::PAGE_SLUG ) ); exit; } public function render_product_navigation() { if ( ! current_user_can( 'manage_options' ) ) { return; } $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( 0 !== strpos( $page, 'divi-powers' ) ) { return; } $links = array( 'divi-powers' => __( 'Dashboard', '5d-powers-for-divi' ), self::PAGE_SLUG => __( 'Getting Started', '5d-powers-for-divi' ), 'divi-powers-plus-funnel' => __( 'Funnels', '5d-powers-for-divi' ), 'divi-powers-plus-checkout' => __( 'Checkout Layouts', '5d-powers-for-divi' ), 'divi-powers-commerce-utilities' => __( 'Utilities', '5d-powers-for-divi' ), 'divi-powers-design-library' => __( 'Design Library', '5d-powers-for-divi' ), ); if ( ! Divi_Powers_Plugin::is_pro_active() ) { $links['divi-powers-upgrade'] = __( 'Upgrade to Pro', '5d-powers-for-divi' ); } $links = apply_filters( 'divi_powers_product_nav_links', $links ); ?> = (int) $summary['total']; if ( $all_steps_complete || ! empty( $state['completed_at'] ) || ! empty( $state['notice_dismissed'] ) ) { return; } $dismiss = wp_nonce_url( admin_url( 'admin-post.php?action=divi_powers_onboarding_dismiss_notice' ), self::NONCE_ACTION, 'nonce' ); ?>

%

message_text( $message ) ); ?>

$item ) : ?>
01

readiness_row( __( 'Divi detected', '5d-powers-for-divi' ), function_exists( 'et_builder_d5_enabled' ) ); ?> readiness_row( __( 'Divi 5 enabled', '5d-powers-for-divi' ), function_exists( 'et_builder_d5_enabled' ) && et_builder_d5_enabled() ); ?> readiness_row( __( 'Dismissible Elements enabled', '5d-powers-for-divi' ), $this->plugin->is_power_enabled( 'dismissible' ) ); ?> readiness_row( __( 'Triggers & Targets enabled', '5d-powers-for-divi' ), $this->plugin->is_power_enabled( 'trigger_target' ) ); ?> readiness_row( __( 'Content Switcher enabled', '5d-powers-for-divi' ), $this->plugin->is_power_enabled( 'content_toggle' ) ); ?>

02

  • ✓
  • ✓
  • ✓
  • ✓
✓

✓

· ·

03

journey_action( '1', __( 'View the working page', '5d-powers-for-divi' ), __( 'Dismiss the announcement, open the modal, and switch the content state.', '5d-powers-for-divi' ), $summary['primary_page_id'] ? get_permalink( $summary['primary_page_id'] ) : '', __( 'View demo', '5d-powers-for-divi' ), ! $summary['primary_page_id'] ); ?> journey_action( '2', __( 'Open it in Divi', '5d-powers-for-divi' ), __( 'Select the labeled modules and review or change their 5D Powers for Divi settings.', '5d-powers-for-divi' ), $summary['primary_page_id'] ? add_query_arg( 'et_fb', '1', get_permalink( $summary['primary_page_id'] ) ) : '', __( 'Edit page', '5d-powers-for-divi' ), ! $summary['primary_page_id'] ); ?> journey_action( '3', __( 'Add another design', '5d-powers-for-divi' ), __( 'Choose a ready-made pricing switcher, tabs, drawer, tooltip, scroll navigation, or another Divi pattern.', '5d-powers-for-divi' ), admin_url( 'admin.php?page=divi-powers-design-library' ), __( 'Open Design Library', '5d-powers-for-divi' ) ); ?> journey_action( '4', __( 'Build a complete funnel', '5d-powers-for-divi' ), __( 'Pro is active. Connect pages, checkout, conversion goals, and validation in the Funnels workspace.', '5d-powers-for-divi' ), admin_url( 'admin.php?page=divi-powers-funnels' ), __( 'Open Funnels', '5d-powers-for-divi' ) ); ?> journey_action( '4', __( 'Build a basic funnel', '5d-powers-for-divi' ), __( 'Connect landing, offer, checkout, and thank-you pages with no limit on the number of basic funnels you create.', '5d-powers-for-divi' ), admin_url( 'admin.php?page=divi-powers-plus-funnel' ), __( 'Open Funnels', '5d-powers-for-divi' ) ); ?>

verify_admin_request(); $name = isset( $_POST['starter_name'] ) ? sanitize_text_field( wp_unslash( $_POST['starter_name'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- verify_admin_request() validates capability and nonce immediately above. $name = $name ? $name : __( '5D Powers for Divi Free — Starter Page', '5d-powers-for-divi' ); $result = $this->install_starter( $name, false ); $url = admin_url( 'admin.php?page=' . self::PAGE_SLUG ); if ( is_wp_error( $result ) ) { $url = add_query_arg( 'dp_error', $result->get_error_message(), $url ); } else { $url = add_query_arg( 'dp_message', 'starter_installed', $url ); } wp_safe_redirect( $url ); exit; } public function handle_starter_rebuild() { $this->verify_admin_request(); $name = isset( $_POST['starter_name'] ) ? sanitize_text_field( wp_unslash( $_POST['starter_name'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing -- verify_admin_request() validates capability and nonce immediately above. $name = $name ? $name : __( '5D Powers for Divi Free — Starter Page', '5d-powers-for-divi' ); $result = $this->install_starter( $name, true ); $url = admin_url( 'admin.php?page=' . self::PAGE_SLUG ); $url = is_wp_error( $result ) ? add_query_arg( 'dp_error', $result->get_error_message(), $url ) : add_query_arg( 'dp_message', 'starter_rebuilt', $url ); wp_safe_redirect( $url ); exit; } public function handle_complete() { $this->verify_admin_request(); $state = self::state(); $state['completed_at'] = time(); $state['notice_dismissed'] = 1; update_option( self::OPTION_KEY, $state, false ); wp_safe_redirect( add_query_arg( 'dp_message', 'setup_complete', admin_url( 'admin.php?page=' . self::PAGE_SLUG ) ) ); exit; } public function handle_reopen() { $this->verify_admin_request(); $state = self::state(); $state['completed_at'] = 0; update_option( self::OPTION_KEY, $state, false ); wp_safe_redirect( add_query_arg( 'dp_message', 'setup_reopened', admin_url( 'admin.php?page=' . self::PAGE_SLUG ) ) ); exit; } public function handle_dismiss_notice() { $this->verify_admin_request(); $state = self::state(); $state['notice_dismissed'] = 1; update_option( self::OPTION_KEY, $state, false ); wp_safe_redirect( wp_get_referer() ? wp_get_referer() : admin_url() ); exit; } private function install_starter( $name, $force = false ) { $state = self::state(); $id = ! empty( $state['lite_demo']['page_id'] ) ? absint( $state['lite_demo']['page_id'] ) : 0; $post = $id ? get_post( $id ) : null; if ( ! $post || 'page' !== $post->post_type || 'trash' === $post->post_status || 'lite-demo' !== get_post_meta( $id, self::ASSET_META, true ) ) { $found = get_posts( array( 'post_type' => 'page', 'post_status' => array( 'publish', 'draft', 'pending', 'private' ), 'posts_per_page' => 1, 'fields' => 'ids', 'meta_key' => self::ASSET_META, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Single-record repair lookup for the plugin-owned starter page. 'meta_value' => 'lite-demo', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- Single-record repair lookup for the plugin-owned starter page. ) ); $id = ! empty( $found ) ? absint( $found[0] ) : 0; } $native_content = Divi_Powers_Native_Layouts::lite_demo(); $created = false; if ( ! $id ) { $id = wp_insert_post( array( 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => $name, 'post_content' => $native_content, ), true ); if ( is_wp_error( $id ) ) { return $id; } $created = true; } else { $current = get_post( $id ); $current_content = $current ? (string) $current->post_content : ''; $stored_hash = (string) get_post_meta( $id, self::GENERATED_HASH_META, true ); $unchanged_generated = $stored_hash && hash_equals( $stored_hash, hash( 'sha256', $current_content ) ); $known_broken_native = (int) get_post_meta( $id, self::ASSET_VERSION_META, true ) < self::STARTER_VERSION && Divi_Powers_Native_Layouts::has_empty_native_text_modules( $current_content ); $can_replace = $force || '' === trim( $current_content ) || Divi_Powers_Native_Layouts::is_legacy_wrapper( $current_content, 'lite-demo' ) || $known_broken_native || $unchanged_generated; $update = array( 'ID' => $id, 'post_status' => 'publish' ); if ( $can_replace ) { $update['post_content'] = $native_content; } wp_update_post( $update ); } $current = get_post( $id ); $current_content = $current ? (string) $current->post_content : ''; $is_generated_native = hash_equals( hash( 'sha256', $native_content ), hash( 'sha256', $current_content ) ); update_post_meta( $id, self::ASSET_META, 'lite-demo' ); update_post_meta( $id, self::ASSET_VERSION_META, self::STARTER_VERSION ); if ( $created ) { update_post_meta( $id, '_wp_page_template', 'page-template-blank.php' ); update_post_meta( $id, '_et_pb_page_layout', 'et_full_width_page' ); update_post_meta( $id, '_et_pb_side_nav', 'off' ); update_post_meta( $id, '_divi_powers_starter_canvas', 'blank' ); } if ( Divi_Powers_Native_Layouts::is_native_divi_content( $current_content ) ) { update_post_meta( $id, '_et_pb_use_builder', 'on' ); } if ( $is_generated_native || $created || $force ) { update_post_meta( $id, self::NATIVE_LAYOUT_META, self::STARTER_VERSION ); update_post_meta( $id, self::GENERATED_HASH_META, hash( 'sha256', $native_content ) ); } $state['lite_demo'] = array( 'page_id' => absint( $id ), 'name' => $name ); $state['starter_version'] = self::STARTER_VERSION; $state['notice_dismissed'] = 1; update_option( self::OPTION_KEY, $state, false ); return $state['lite_demo']; } public function repair_starter_template() { if ( ! current_user_can( 'manage_options' ) ) { return; } $state = self::state(); $demo_id = ! empty( $state['lite_demo']['page_id'] ) ? absint( $state['lite_demo']['page_id'] ) : 0; $demo = $demo_id ? get_post( $demo_id ) : null; if ( $demo && 'lite-demo' === get_post_meta( $demo_id, self::ASSET_META, true ) && ( Divi_Powers_Native_Layouts::is_legacy_wrapper( (string) $demo->post_content, 'lite-demo' ) || ( (int) get_post_meta( $demo_id, self::ASSET_VERSION_META, true ) < self::STARTER_VERSION && Divi_Powers_Native_Layouts::has_empty_native_text_modules( (string) $demo->post_content ) ) ) ) { $name = ! empty( $state['lite_demo']['name'] ) ? sanitize_text_field( $state['lite_demo']['name'] ) : __( '5D Powers for Divi Free — Starter Page', '5d-powers-for-divi' ); $this->install_starter( $name, false ); $state = self::state(); } $this->migrate_legacy_starter_wrappers( $state ); } /** Replace generated legacy wrappers without changing a page's chosen template. */ private function migrate_legacy_starter_wrappers( $state ) { $starter = isset( $state['starter'] ) && is_array( $state['starter'] ) ? $state['starter'] : array(); $context = array( 'landing_url' => ! empty( $starter['landing_page_id'] ) ? get_permalink( absint( $starter['landing_page_id'] ) ) : home_url( '/' ), 'offer_url' => ! empty( $starter['offer_page_id'] ) ? get_permalink( absint( $starter['offer_page_id'] ) ) : home_url( '/' ), 'checkout_url' => ! empty( $starter['checkout_page_id'] ) ? get_permalink( absint( $starter['checkout_page_id'] ) ) : home_url( '/' ), 'thank_you_url' => ! empty( $starter['thank_you_page_id'] ) ? get_permalink( absint( $starter['thank_you_page_id'] ) ) : home_url( '/' ), 'starter_page_url' => ! empty( $state['lite_demo']['page_id'] ) ? get_permalink( absint( $state['lite_demo']['page_id'] ) ) : home_url( '/' ), ); $pages = array( 'landing_page_id' => 'landing', 'offer_page_id' => 'offer', 'checkout_page_id' => 'checkout', 'thank_you_page_id' => 'thank-you', ); foreach ( $pages as $key => $type ) { $page_id = ! empty( $starter[ $key ] ) ? absint( $starter[ $key ] ) : 0; $post = $page_id ? get_post( $page_id ) : null; if ( ! $post || ! Divi_Powers_Native_Layouts::is_legacy_wrapper( (string) $post->post_content, $type ) ) { continue; } $content = Divi_Powers_Native_Layouts::pro_page( $type, $context ); if ( '' === $content ) { continue; } $result = wp_update_post( array( 'ID' => $page_id, 'post_content' => wp_slash( $content ) ), true ); if ( is_wp_error( $result ) ) { continue; } update_post_meta( $page_id, '_et_pb_use_builder', 'on' ); update_post_meta( $page_id, self::ASSET_VERSION_META, self::STARTER_VERSION ); update_post_meta( $page_id, self::NATIVE_LAYOUT_META, self::STARTER_VERSION ); update_post_meta( $page_id, self::GENERATED_HASH_META, hash( 'sha256', $content ) ); } } public function force_starter_page_template( $template ) { if ( ! is_singular( 'page' ) ) { return $template; } $post_id = get_queried_object_id(); if ( ! $this->starter_page_uses_blank_canvas( $post_id ) ) { return $template; } $blank = DIVI_POWERS_PATH . 'templates/starter-blank.php'; return file_exists( $blank ) ? $blank : $template; } public function suppress_starter_page_title( $title, $post_id = 0 ) { if ( is_admin() || ! in_the_loop() || ! is_main_query() ) { return $title; } $id = $post_id ? absint( $post_id ) : get_the_ID(); return $this->starter_page_uses_blank_canvas( $id ) ? '' : $title; } public function starter_page_body_class( $classes ) { if ( is_singular( 'page' ) ) { $id = get_queried_object_id(); if ( $this->starter_page_uses_blank_canvas( $id ) ) { $classes[] = 'divi-powers-starter-canvas'; } } return $classes; } /** Whether a managed starter page is still explicitly assigned Blank Page. */ private function starter_page_uses_blank_canvas( $post_id ) { $post_id = absint( $post_id ); return $post_id && get_post_meta( $post_id, self::ASSET_META, true ) && 'page-template-blank.php' === (string) get_post_meta( $post_id, '_wp_page_template', true ); } public function display_post_states( $states, $post ) { if ( get_post_meta( $post->ID, self::ASSET_META, true ) ) { $states['divi-powers-starter'] = __( '5D Powers for Divi starter', '5d-powers-for-divi' ); } return $states; } private static function legacy_starter_assets_valid( $starter, $woo ) { if ( ! is_array( $starter ) ) { return false; } $required = array( 'landing_page_id', 'offer_page_id', 'checkout_page_id', 'thank_you_page_id', 'funnel_id' ); if ( $woo ) { $required[] = 'profile_id'; $required[] = 'product_id'; } foreach ( $required as $key ) { if ( empty( $starter[ $key ] ) ) { return false; } $post = get_post( absint( $starter[ $key ] ) ); if ( ! $post || 'trash' === $post->post_status ) { return false; } } return true; } private function readiness_row( $label, $ready, $optional = false ) { ?>

__( 'The 5D Powers for Divi Free sample page is ready.', '5d-powers-for-divi' ), 'starter_rebuilt' => __( 'The 5D Powers for Divi Free sample page was rebuilt with the included feature tour.', '5d-powers-for-divi' ), 'pro_starter_installed' => __( 'The complete native Divi example funnel is ready.', '5d-powers-for-divi' ), 'pro_starter_rebuilt' => __( 'All four native Divi funnel pages were rebuilt.', '5d-powers-for-divi' ), 'setup_complete' => __( 'Setup has been marked complete.', '5d-powers-for-divi' ), 'setup_reopened' => __( 'The setup checklist has been reopened.', '5d-powers-for-divi' ), ); return isset( $messages[ $message ] ) ? $messages[ $message ] : __( 'The 5D Powers for Divi setup was updated.', '5d-powers-for-divi' ); } }