array( 'title' => __( 'Quotes & PDFs', 'killerconversions' ), 'summary' => __( 'Price complex services and give each enquiry a branded estimate.', 'killerconversions' ), 'workflow' => 'estimate', 'action' => 'pricing' ), 'resume' => array( 'title' => __( 'Save & resume', 'killerconversions' ), 'summary' => __( 'Let applicants save their progress and return with a private link.', 'killerconversions' ), 'workflow' => 'application', 'action' => 'resume' ), 'followup' => array( 'title' => __( 'Follow-up & teams', 'killerconversions' ), 'summary' => __( 'Send selected answers to your tools and give every lead a next step.', 'killerconversions' ), 'workflow' => 'followup', 'action' => 'review' ), ); } public static function preview_id( $id ) { $aliases = array( 'pricing' => 'quotes', 'estimate' => 'quotes', 'application' => 'resume', 'crm' => 'followup', 'connect' => 'followup', 'connections' => 'followup', 'review' => 'followup', 'logic' => 'quotes' ); $id = isset( $aliases[ $id ] ) ? $aliases[ $id ] : $id; return isset( self::definitions()[ $id ] ) ? $id : 'quotes'; } public static function context_form() { if ( ! self::available() ) { return 0; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only, allowlisted navigation. Forms are separately authorized below. $page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; $key = 'killerconversions' === $page ? 'edit' : 'form_id'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only existing form context, never a write or arbitrary redirect. $raw = isset( $_GET[ $key ] ) && is_string( $_GET[ $key ] ) ? sanitize_text_field( wp_unslash( $_GET[ $key ] ) ) : ''; return self::validated_form_id( $raw ); } private static function validated_form_id( $raw ) { if ( ! is_string( $raw ) || ! preg_match( '/^[1-9][0-9]*$/D', $raw ) || (string) (int) $raw !== $raw ) { return 0; } $id = KCONV_Authoring::public_id( (int) $raw ); $post = get_post( $id ); return $post && 'kconv_form' === $post->post_type && in_array( $post->post_status, array( 'draft', 'publish' ), true ) && current_user_can( 'edit_post', $id ) ? $id : 0; } public static function url( $example = '' ) { $args = array( 'page' => 'kconv-pro-discovery' ); if ( self::context_form() ) { $args['form_id'] = self::context_form(); } if ( '' !== $example && 'suggestions' !== $example ) { $args['preview'] = self::preview_id( $example ); } return add_query_arg( $args, admin_url( 'admin.php' ) ) . ( 'suggestions' === $example ? '#kconv-pro-suggestions' : '' ); } public static function preference_key() { return 'kconv_pro_discovery_hidden_' . get_current_blog_id(); } public static function suggestions_hidden() { return self::available() && '1' === get_user_meta( get_current_user_id(), self::preference_key(), true ); } public static function previews_hidden() { return self::available() && '1' === get_user_meta( get_current_user_id(), 'kconv_pro_previews_hidden_' . get_current_blog_id(), true ); } public static function save_preferences() { if ( ! self::available() ) { wp_die( esc_html__( 'Site administrator access is required.', 'killerconversions' ), '', array( 'response' => 403 ) ); } $method = isset( $_SERVER['REQUEST_METHOD'] ) && is_string( $_SERVER['REQUEST_METHOD'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) : ''; if ( 'POST' !== $method ) { wp_die( esc_html__( 'Use the suggestion settings form to make this change.', 'killerconversions' ), '', array( 'response' => 405 ) ); } check_admin_referer( 'kconv_pro_discovery_preferences', 'kconv_pro_discovery_nonce' ); $op = isset( $_POST['operation'] ) && is_string( $_POST['operation'] ) ? sanitize_key( wp_unslash( $_POST['operation'] ) ) : ''; if ( ! in_array( $op, array( 'hide', 'restore', 'hide_previews', 'show_previews' ), true ) ) { wp_die( esc_html__( 'Choose a supported preference.', 'killerconversions' ), '', array( 'response' => 400 ) ); } $previews = in_array( $op, array( 'hide_previews', 'show_previews' ), true ); $key = $previews ? 'kconv_pro_previews_hidden_' . get_current_blog_id() : self::preference_key(); $hidden = in_array( $op, array( 'hide', 'hide_previews' ), true ); if ( $hidden ) { update_user_meta( get_current_user_id(), $key, '1' ); } else { delete_user_meta( get_current_user_id(), $key ); } if ( $hidden !== ( '1' === get_user_meta( get_current_user_id(), $key, true ) ) ) { wp_die( esc_html__( 'The preference could not be saved. Reload and try again.', 'killerconversions' ), '', array( 'response' => 500 ) ); } if ( 'restore' === $op ) { delete_user_meta( get_current_user_id(), KCONV_Workflows::key( 'dismissed' ) ); } if ( isset( $_POST['response_format'] ) && is_string( $_POST['response_format'] ) && 'json' === sanitize_key( wp_unslash( $_POST['response_format'] ) ) ) { wp_send_json_success( array( 'previews_hidden' => self::previews_hidden(), 'suggestions_hidden' => self::suggestions_hidden() ) ); } $args = array( 'page' => 'kconv-pro-discovery' ); $id = isset( $_POST['form_id'] ) && is_string( $_POST['form_id'] ) ? self::validated_form_id( sanitize_text_field( wp_unslash( $_POST['form_id'] ) ) ) : 0; if ( $id ) { $args['form_id'] = $id; } $return_page = isset( $_POST['return_page'] ) && is_string( $_POST['return_page'] ) ? sanitize_key( wp_unslash( $_POST['return_page'] ) ) : ''; if ( $previews && in_array( $return_page, self::return_pages(), true ) ) { $args = array( 'page' => $return_page ); if ( $id ) { $args[ 'killerconversions' === $return_page ? 'edit' : 'form_id' ] = $id; } $preview = isset( $_POST['return_preview'] ) && is_string( $_POST['return_preview'] ) ? sanitize_key( wp_unslash( $_POST['return_preview'] ) ) : ''; if ( 'kconv-pro-discovery' === $return_page && isset( self::definitions()[ $preview ] ) ) { $args['preview'] = $preview; } if ( in_array( $return_page, array( 'kconv-license', 'killerconversions-pro-updates' ), true ) ) { unset( $args['page'] ); wp_safe_redirect( add_query_arg( $args, KCONV_Presentation::license_url() ) ); exit; } $base = 'kconv-pro-support' === $return_page ? 'plugins.php' : 'admin.php'; wp_safe_redirect( add_query_arg( $args, admin_url( $base ) ) ); exit; } wp_safe_redirect( add_query_arg( $args, admin_url( 'admin.php' ) ) . '#kconv-pro-suggestions' ); exit; } /** Redirects are restricted to plugin destinations; never accept an arbitrary return URL. */ private static function return_pages() { return array( 'killerconversions', 'kconv-entries', 'kconv-start', 'kconv-privacy-emails', 'kconv-pro-delivery', 'kconv-conversions', 'kconv-pro-discovery', 'kconv-more-plugins', 'kconv-storage', 'kconv-review', 'kconv-team', 'kconv-connection-test', 'kconv-handover', 'kconv-workflows', 'kconv-pdf-sample', 'kconv-pro-support', 'kconv-license', 'killerconversions-pro-updates' ); } private static function visibility_control( $location, $new_tab = false ) { $hidden = self::previews_hidden(); echo '
'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only example navigation copied into a nonce-protected form; server allowlists it again. $preview = isset( $_GET['preview'] ) && is_string( $_GET['preview'] ) ? sanitize_key( wp_unslash( $_GET['preview'] ) ) : ''; if ( isset( self::definitions()[ $preview ] ) ) { echo ''; } wp_nonce_field( 'kconv_pro_discovery_preferences', 'kconv_pro_discovery_nonce', false ); echo '' . ( $new_tab ? '' : '' ) . '
'; } /** Render before the editor form. Preferences never submit or alter form contents. */ public static function sidebar_preview_controls( $current = '', $compact = false ) { if ( ! self::available() || self::pro_ready() ) { return; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only selection of the current, allowlisted example. $selected = isset( $_GET['preview'] ) && is_string( $_GET['preview'] ) && 'kconv-pro-discovery' === KCONV_Admin_Scope::page() ? self::preview_id( sanitize_key( wp_unslash( $_GET['preview'] ) ) ) : ''; if ( isset( self::definitions()[ $current ] ) ) { $selected = $current; } $hidden = self::previews_hidden(); echo '
' . esc_html__( 'Pro previews', 'killerconversions' ) . ''; self::visibility_control( 'sidebar', $compact ); echo '

' . esc_html__( 'Explore Pro stays available below.', 'killerconversions' ) . '

'; } public static function menu() { add_submenu_page( 'killerconversions', __( 'KillerConversions workflow examples', 'killerconversions' ), self::pro_ready() ? __( 'Workflow examples', 'killerconversions' ) : __( 'Explore Pro', 'killerconversions' ), 'manage_options', 'kconv-pro-discovery', array( __CLASS__, 'screen' ) ); } public static function assets() { if ( ! self::available() || ! KCONV_Admin_Scope::plugin() || ! wp_style_is( 'kconv-admin', 'enqueued' ) ) { return; } wp_enqueue_style( 'kconv-pro-discovery', KCONV_URL . 'assets/pro-discovery.css', array( 'kconv-admin' ), KCONV_VERSION ); wp_enqueue_script( 'kconv-pro-discovery', KCONV_URL . 'assets/pro-discovery.js', array(), KCONV_VERSION, true ); } public static function link( $example, $label, $new_tab = false ) { if ( ! self::available() ) { return; } echo '' . esc_html( $label ); if ( $new_tab ) { echo ' ' . esc_html__( '(opens in a new tab)', 'killerconversions' ) . ''; } echo ''; } public static function hint( $context, $new_tab = false ) { $map = array( 'pricing' => array( 'quotes', 'estimate', __( 'Need pricing tiers or a branded PDF? Preview Quotes & PDFs.', 'killerconversions' ) ), 'logic' => array( 'quotes', 'estimate', __( 'Basic conditions are included in Free. Preview Pro for nested conditions, branching and advanced pricing.', 'killerconversions' ) ), 'application' => array( 'resume', 'application', __( 'Need visitors to finish later? Preview Save & resume.', 'killerconversions' ) ), 'connect' => array( 'followup', 'connections', __( 'Need HubSpot, Slack or conditional routing? Preview Follow-up & teams.', 'killerconversions' ) ), 'review' => array( 'followup', 'followup', __( 'Reviewing leads as a team? Preview stages, notes and scoped staff access.', 'killerconversions' ) ) ); if ( 'crm' === $context ) { $context = 'connect'; } if ( ! self::available() || self::pro_ready() || self::suggestions_hidden() || ! isset( $map[ $context ] ) || isset( self::$hints[ $context ] ) ) { return; } $hint = $map[ $context ]; if ( KCONV_Workflows::dismissed( $hint[1] ) ) { return; } self::$hints[ $context ] = true; echo '

'; self::link( $hint[0], $hint[2], $new_tab ); echo ' '; self::link( 'suggestions', __( 'Hide or restore suggestions', 'killerconversions' ), $new_tab ); echo '

'; } public static function editor() { if ( ! self::available() ) { return; } echo '
'; self::hint( 'connect', true ); echo '
'; echo '
'; self::hint( 'application', true ); echo '
'; } /** Links only: safe inside an editor; preferences and remember forms stay outside it. */ public static function preview_navigation( $current = '' ) { if ( class_exists( 'KCONV_Workspace_Navigation' ) && KCONV_Workspace_Navigation::rendered() ) { return; } if ( ! self::available() || ( ! self::pro_ready() && self::previews_hidden() && ! KCONV_Admin_Scope::plugin( array( 'kconv-pro-discovery' ) ) ) ) { return; } echo ''; } private static function comparison( $caption, $rows ) { echo ''; foreach ( $rows as $row ) { echo ''; } echo '
' . esc_html( $caption ) . '
' . esc_html__( 'Capability', 'killerconversions' ) . '' . esc_html__( 'Free', 'killerconversions' ) . '' . esc_html__( 'Pro', 'killerconversions' ) . '
' . esc_html( $row[0] ) . '' . esc_html( $row[1] ? __( 'Included', 'killerconversions' ) : __( 'Not included', 'killerconversions' ) ) . '' . esc_html__( 'Included', 'killerconversions' ) . '
'; } /** Local, bundled examples; no preview request contacts a vendor service. */ private static function examples() { return array( 'quotes' => array( 'headline' => __( 'Turn a quote request into a priced estimate.', 'killerconversions' ), 'intro' => __( 'Calculate your service price and give each saved enquiry a branded PDF estimate.', 'killerconversions' ), 'short' => __( 'Calculate prices and produce a branded estimate PDF.', 'killerconversions' ), 'image' => 'estimate-preview.png', 'alt' => __( 'Pro estimate PDF with six fictional consulting sessions totalling 580 EUR.', 'killerconversions' ), 'caption' => __( 'Pro PDF example · fictional data', 'killerconversions' ), 'free' => __( 'Collect the details of a quote request, save the enquiry and send ordinary email notifications.', 'killerconversions' ), 'benefits' => array( __( 'Estimate calculations, price tiers and conditional extras.', 'killerconversions' ), __( 'A branded PDF generated from a saved estimate.', 'killerconversions' ), __( 'Keep the calculated result alongside the enquiry.', 'killerconversions' ) ), 'rows' => array( array( __( 'Enquiry forms and basic conditions', 'killerconversions' ), true ), array( __( 'Local entries, CSV and ordinary emails', 'killerconversions' ), true ), array( __( 'Calculated estimates and pricing tiers', 'killerconversions' ), false ), array( __( 'Branded estimate PDFs', 'killerconversions' ), false ) ), 'steps' => array( __( 'Set your prices, tiers and extras.', 'killerconversions' ), __( 'Try representative answers and check the PDF.', 'killerconversions' ), __( 'Publish when ready and review saved estimates.', 'killerconversions' ) ), 'note' => __( 'This is an estimate example, not a payment or tax invoice. The sample PDF uses fictional prices.', 'killerconversions' ), ), 'resume' => array( 'headline' => __( 'Let visitors finish their application later.', 'killerconversions' ), 'intro' => __( 'Visitors choose to save their progress, copy a private link and return when they are ready.', 'killerconversions' ), 'short' => __( 'Let applicants save explicitly and return through a private link.', 'killerconversions' ), 'image' => 'resume-desktop.png', 'alt' => __( 'Pro application with fictional example answers and a Save for later control.', 'killerconversions' ), 'caption' => __( 'Pro application example · fictional data', 'killerconversions' ), 'free' => __( 'Build enquiry forms with basic conditions, keep submitted entries locally and recover your own form-design drafts.', 'killerconversions' ), 'benefits' => array( __( 'Multi-step applications and private file uploads.', 'killerconversions' ), __( 'Explicit visitor save with an encrypted draft.', 'killerconversions' ), __( 'A private continuation link with 1, 3 or 7-day expiry.', 'killerconversions' ) ), 'rows' => array( array( __( 'Enquiry forms and submitted entries', 'killerconversions' ), true ), array( __( 'Administrator form-design drafts', 'killerconversions' ), true ), array( __( 'Multi-step applications and file uploads', 'killerconversions' ), false ), array( __( 'Visitor drafts and private resume links', 'killerconversions' ), false ) ), 'steps' => array( __( 'Choose a draft lifetime of 1, 3 or 7 days.', 'killerconversions' ), __( 'The visitor saves and copies their private link.', 'killerconversions' ), __( 'They return, complete the form and choose consent again.', 'killerconversions' ) ), 'note' => __( 'Anyone with the link can open the draft. Drafts expire from the first save. Visitors must choose to save; incomplete answers are not captured automatically and no draft email is sent. HTTPS and PHP Sodium are required.', 'killerconversions' ), ), 'followup' => array( 'headline' => __( 'Give every enquiry a clear next step.', 'killerconversions' ), 'intro' => __( 'Review enquiries with your team and send selected answers to the tools you deliberately connect.', 'killerconversions' ), 'short' => __( 'Organize team reviews and connect selected answers to your tools.', 'killerconversions' ), 'image' => 'review-desktop.png', 'alt' => __( 'Pro review workflow with fictional stages, due dates, assignees and four example entries.', 'killerconversions' ), 'caption' => __( 'Pro review workspace example · fictional data', 'killerconversions' ), 'free' => __( 'Receive ordinary staff emails, use basic entry assignment and status, and export saved answers to CSV.', 'killerconversions' ), 'benefits' => array( __( 'Custom stages, internal notes and due dates.', 'killerconversions' ), __( 'Scoped staff access and team review workflows.', 'killerconversions' ), __( 'HubSpot, Slack, signed webhooks and conditional routing.', 'killerconversions' ) ), 'rows' => array( array( __( 'Staff email, CSV and basic entry status', 'killerconversions' ), true ), array( __( 'Basic assignment of saved entries', 'killerconversions' ), true ), array( __( 'Custom stages, notes and due dates', 'killerconversions' ), false ), array( __( 'Advanced connections and scoped staff access', 'killerconversions' ), false ) ), 'steps' => array( __( 'Choose the answers and destination for each connection.', 'killerconversions' ), __( 'Review field mapping and staff access before enabling.', 'killerconversions' ), __( 'Use stages, notes and due dates to organize follow-up.', 'killerconversions' ) ), 'note' => __( 'Connections need your setup and credentials. A due date does not send a message automatically. Viewing this example sends nothing.', 'killerconversions' ), ), ); } private static function example_image( $id, $small = false ) { $example = self::examples()[ $id ]; $url = KCONV_URL . 'assets/discovery-examples/' . $example['image']; echo '
' . esc_attr( $example['alt'] ) . '' . esc_html__( 'View full size (opens in a new tab)', 'killerconversions' ) . '
' . esc_html( $example['caption'] ) . ' · ' . esc_html__( 'View full size', 'killerconversions' ) . ' ' . esc_html__( '(opens in a new tab)', 'killerconversions' ) . '
'; } public static function overview() { $unlocked = self::pro_ready(); echo '

' . esc_html( $unlocked ? __( 'WORKFLOW EXAMPLES', 'killerconversions' ) : __( 'EXPLORE PRO', 'killerconversions' ) ) . '

' . esc_html( $unlocked ? __( 'Put your Pro tools to work.', 'killerconversions' ) : __( 'See what Pro adds to your workflow.', 'killerconversions' ) ) . '

' . esc_html( $unlocked ? __( 'Explore three examples, then configure the tools for your own forms.', 'killerconversions' ) : __( 'Keep building enquiry forms with Free. Explore three ways to handle more involved work.', 'killerconversions' ) ) . '

'; echo '

' . esc_html__( 'Your everyday tools are included in Free', 'killerconversions' ) . '

' . esc_html__( 'Enquiry forms · Basic conditions · Local entries · CSV export · Ordinary email notifications', 'killerconversions' ) . '

'; foreach ( self::examples() as $id => $example ) { echo '

' . esc_html( self::definitions()[ $id ]['title'] ) . ' PRO

' . esc_html( $example['headline'] ) . '

' . esc_html( $example['short'] ) . '

'; self::example_image( $id, true ); echo '' . esc_html__( 'View example', 'killerconversions' ) . ' : ' . esc_html( self::definitions()[ $id ]['title'] ) . '
'; } echo '

' . esc_html__( 'Genuine Pro examples with fictional data. Viewing them changes no forms or settings.', 'killerconversions' ) . '

'; } private static function feature_action( $id ) { $action = KCONV_Presentation::action(); if ( self::pro_ready() ) { $actions = apply_filters( 'kconv_pro_discovery_actions', array(), self::context_form() ); $key = self::definitions()[ $id ]['action']; if ( isset( $actions[ $key ]['url'], $actions[ $key ]['label'] ) && is_string( $actions[ $key ]['url'] ) && 0 === strpos( $actions[ $key ]['url'], admin_url( 'admin.php?' ) ) ) { $action = $actions[ $key ]; } } return $action; } public static function preview( $id ) { $id = self::preview_id( $id ); $example = self::examples()[ $id ]; $state = KCONV_Presentation::state(); $action = self::feature_action( $id ); echo '
← ' . esc_html__( 'All Pro examples', 'killerconversions' ) . '

' . esc_html( self::pro_ready() ? __( 'PRO WORKFLOW EXAMPLE', 'killerconversions' ) : __( 'PRO PREVIEW', 'killerconversions' ) ) . ' / ' . esc_html( self::definitions()[ $id ]['title'] ) . '

' . esc_html( $example['headline'] ) . '

' . esc_html( $example['intro'] ) . '

    '; foreach ( $example['benefits'] as $benefit ) { echo '
  • ' . esc_html( $benefit ) . '
  • '; } echo '
'; if ( 'free' === $state ) { echo '

' . esc_html__( 'All Pro plans include the same features. Choose 1, 3 or 10 website licences.', 'killerconversions' ) . '

'; } echo '
'; self::example_image( $id ); echo '

' . esc_html__( 'Already included in Free', 'killerconversions' ) . '

' . esc_html( $example['free'] ) . '

'; self::comparison( __( 'What changes with Pro', 'killerconversions' ), $example['rows'] ); echo '

' . esc_html__( 'How you would set it up', 'killerconversions' ) . '

    '; foreach ( $example['steps'] as $step ) { echo '
  1. ' . esc_html( $step ) . '
  2. '; } echo '

' . esc_html( $example['note'] ) . '

'; if ( 'quotes' === $id ) { self::quotes(); } self::next_step( $id ); echo '
'; } private static function next_step( $id ) { $state = KCONV_Presentation::state(); $action = KCONV_Presentation::action(); if ( 'unlocked' === $state ) { $actions = apply_filters( 'kconv_pro_discovery_actions', array(), self::context_form() ); $key = self::definitions()[ $id ]['action']; if ( isset( $actions[ $key ]['url'], $actions[ $key ]['label'] ) && is_string( $actions[ $key ]['url'] ) && 0 === strpos( $actions[ $key ]['url'], admin_url( 'admin.php?' ) ) ) { $action = $actions[ $key ]; } } echo '

' . esc_html( 'unlocked' === $state ? __( 'Put this workflow to work', 'killerconversions' ) : __( 'Included with KillerConversions Pro', 'killerconversions' ) ) . '

' . esc_html__( 'Viewing this example changes no form settings, saves no visitor information and sends no messages.', 'killerconversions' ) . '

'; if ( 'mismatch' === $state ) { echo '

' . esc_html__( 'Finish updating the compatible Free and Pro plugins before opening Pro tools. Saved forms and entries are retained.', 'killerconversions' ) . '

'; } elseif ( 'locked' === $state ) { echo '

' . esc_html__( 'Pro is installed. Activate a valid licence once for this site to unlock its editing and tools.', 'killerconversions' ) . '

'; } echo '
' . esc_html( $action['label'] ) . ( 'free' === $state ? ' ' . esc_html__( '(opens in a new tab)', 'killerconversions' ) . '' : '' ) . ''; if ( 'free' === $state ) { echo '' . esc_html__( 'Compare Free and Pro', 'killerconversions' ) . ''; } $id_form = self::context_form(); echo '' . esc_html__( 'Back to your forms', 'killerconversions' ) . '
'; if ( 'unlocked' !== $state ) { echo '

' . esc_html__( 'Every Pro plan includes the same features; the plan changes how many sites you can activate.', 'killerconversions' ) . '

' . esc_html__( 'Keep using Free. Preview visibility and contextual suggestions are yours to control.', 'killerconversions' ) . '

'; } else { echo '

' . esc_html__( 'Open the working tools to review your current configuration before saving or enabling anything.', 'killerconversions' ) . '

'; } echo '
'; } public static function preferences() { if ( ! self::available() ) { return; } echo '

' . esc_html__( 'Your Pro preview preferences', 'killerconversions' ) . '

' . esc_html__( 'These choices belong to your WordPress account on this site. Other administrators keep their own preferences. Deliberate workflow links remain available.', 'killerconversions' ) . '

'; if ( ! self::pro_ready() ) { echo '

' . esc_html__( 'Keep your workspace the way you like it', 'killerconversions' ) . '

' . esc_html__( 'Hide these shortcuts whenever you like. The examples stay available through Explore Pro.', 'killerconversions' ) . '

'; self::visibility_control( 'page' ); echo '
'; } $choices = array( array( self::suggestions_hidden() ? 'restore' : 'hide', self::suggestions_hidden() ? __( 'Restore contextual Pro suggestions', 'killerconversions' ) : __( 'Hide contextual Pro suggestions', 'killerconversions' ) ) ); if ( ! self::suggestions_hidden() && get_user_meta( get_current_user_id(), KCONV_Workflows::key( 'dismissed' ), true ) ) { $choices[] = array( 'restore', __( 'Restore individually hidden suggestions', 'killerconversions' ) ); } foreach ( $choices as $choice ) { echo '
'; wp_nonce_field( 'kconv_pro_discovery_preferences', 'kconv_pro_discovery_nonce', false ); echo '
'; } echo '
'; } public static function screen() { if ( ! self::available() ) { wp_die( esc_html__( 'Site administrator access is required.', 'killerconversions' ), '', array( 'response' => 403 ) ); } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only allowlisted example navigation; viewing never records intent. $preview = isset( $_GET['preview'] ) && is_string( $_GET['preview'] ) ? self::preview_id( sanitize_key( wp_unslash( $_GET['preview'] ) ) ) : ''; echo '
'; KCONV_Admin::navigation( 'discover' ); echo '
'; if ( '' === $preview ) { self::overview(); } else { self::preview( $preview ); if ( self::context_form() ) { KCONV_Workflows::remember_control( self::definitions()[ $preview ]['workflow'], self::context_form() ); } else { echo '

' . esc_html__( 'Save a form first to remember this workflow for that form.', 'killerconversions' ) . '

'; } } self::preferences(); echo '
'; } private static function quotes() { ?>

€500.00
€80.00
€580.00