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 ) ); ?>
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' ) ); ?>
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' );
}
}