⚙️

' . esc_html( $awb_detected_i18n_plugin ) . '' ); ?>

%title% %sep% %sitename% %tagline%




true ], 'objects' ) as $pt ) : ?>

llms.txt

serpapi.com' ); ?>

$awb_dr ) : ?>

$pair ) : ?>

true ], 'objects' ); ?> $pt_obj ) : ?>
labels->singular_name ); ?>

Map ACF fields to schema.org properties - one mapping per line, using acf_field_name:schema.property format. Use dot notation for nested properties.
Examples:
product_price:offers.price
product_currency:offers.priceCurrency
average_rating:aggregateRating.ratingValue

' . esc_html__( 'Registered ACF fields on this site:', 'adworksbid-seo' ) . ' ' . implode( ', ', array_map( 'esc_html', $field_names ) ) . '

'; } } ?>
above. HTML does not allow nested
elements - when a // used to live inside the main form here, browsers would parse // it by dropping the inner open tag (parse error) but still // honoring its matching
close tag, which closed the OUTER // settings form early. Everything rendered after that point - Bing, // GEO/AI SEO, AI Engine API Keys, Hreflang, and the "Save Settings" // button itself - ended up outside of any form at all, so clicking // Save Settings submitted nothing. Keep these as separate, independent // forms after the main form closes; do not move them back inside it. ?>

is_connected(); $property = $gsc->get_property(); $gsc_error = sanitize_text_field( $_GET['gsc_error'] ?? '' ); $gsc_detail = sanitize_text_field( wp_unslash( $_GET['gsc_detail'] ?? '' ) ); $gsc_ok = isset( $_GET['gsc_connected'] ); $gsc_redetected = isset( $_GET['gsc_redetected'] ); if ( $gsc_ok ) : ?>

✅ Google Search Console connected successfully!

✅ Property re-detected:

'No Client ID found. Enter your OAuth Client ID and Secret below, save, then click Connect.', 'no_code' => 'Google did not return an auth code. Please try again.', 'invalid_state' => 'Security check failed. Please try again.', 'token_error' => 'Could not exchange code for token. Check your Client Secret.', 'no_token' => 'Google did not return an access token. Check your credentials.', 'broker_unreachable' => 'Could not reach the AWBSEO authorization service. Check your site\'s outbound connections, or try again in a moment.', 'broker_error' => 'The AWBSEO authorization service did not return a valid response. Please try again.', 'no_property_found' => 'Could not find a Search Console property matching this site. Make sure this exact domain is verified in Search Console, then try again.', ]; echo esc_html( $msgs[ $gsc_error ] ?? "OAuth error: {$gsc_error}" ); if ( $gsc_detail ) : ?>
Detail:

✅ Connected - Property:

No Search Console property was detected for this Google account - this is why the Dashboard shows zero data with no specific error. Make sure this exact domain (or a matching sc-domain: property) is verified in Search Console under the account you connected, then click "Re-detect property" above.

Connect Google Search Console to see your search traffic, keyword rankings, and content performance - all in one place.

is_connected(); $ga4_property = $ga4->get_property(); $ga4_error = sanitize_text_field( $_GET['ga4_error'] ?? '' ); $ga4_detail = sanitize_text_field( wp_unslash( $_GET['ga4_detail'] ?? '' ) ); $ga4_ok = isset( $_GET['ga4_connected'] ); $ga4_detected = isset( $_GET['ga4_detected'] ); $ga4_gone = isset( $_GET['ga4_disconnected'] ); if ( $ga4_ok ) : ?>

✅ Google Analytics 4 connected successfully!

✅ GA4 property detected:

GA4 disconnected.

'Security check failed. Please try connecting again.', 'no_token' => 'Google did not return an access token. Please try again.', 'broker_unreachable' => 'Could not reach the AWBSEO authorization service. Check your site\'s outbound connections, or try again in a moment.', 'broker_error' => 'The AWBSEO authorization service did not return a valid response. Please try again.', 'no_property_found' => 'No GA4 property was found for this Google account. Make sure the account you connect owns at least one GA4 property, then try again.', ]; echo esc_html( $ga4_msgs[ $ga4_error ] ?? "GA4 error: {$ga4_error}" ); if ( $ga4_detail ) : ?>
Detail:

list_properties() : []; $ga4_list_error = $ga4_show_picker ? AWBSEO_GA4::get_list_error() : ''; ?>
✅ Connected

— Active property: Change

⚠ GA4 session expired

Your Google Analytics authorization has expired. Reconnect to restore access.

⚠ Google Analytics Admin API is not enabled

The Admin API is required to load your property list. Enable it in your Google Cloud project, then click Retry.

Enable Analytics Admin API → Retry

After enabling, wait ~1 minute for it to propagate, then click Retry. You only need to do this once.

⚠ Could not load properties

Retry

Or enter your GA4 Property ID manually (Google Analytics → Admin → Property Settings → Property ID):

Connect Google Analytics 4 to see real visitor data, including which AI engines are sending you traffic and which pages they land on.

is_connected(); $bing_prop = $bing->get_property(); $bing_error = sanitize_text_field( $_GET['bing_error'] ?? '' ); $bing_ok = isset( $_GET['bing_connected'] ); if ( $bing_ok ) : ?>

✅ Bing Webmaster Tools connected successfully!

'Please enter an API key.', 'invalid_key' => 'Bing rejected that API key. Double-check it and try again.', ]; echo esc_html( $bing_msgs[ $bing_error ] ?? "Bing error: {$bing_error}" ); ?>

get_all_sites_for_this_domain() : []; ?>
✅ Connected

1 ) : ?> Active property:
- Property:

Connect Bing Webmaster Tools to track Bing search performance alongside Google. Get a free API key from Bing Webmaster Tools ↗ under Settings → API Access.

" + " " + " " + "" + "" ); }); $(document).on("click", ".awb-remove-hreflang", function(){ $(this).closest(".awb-hreflang-row").remove(); }); $("#awb-insert-dialect-regions").on("click", function(){ $(".awb-dialect-region-cb:checked").each(function(){ var code = $(this).data("code"); var label = $(this).data("label"); count++; $("#awb-hreflang-pairs").append( "
" + " " + " " + "" + "
" ); $(this).prop("checked", false); }); }); $("#awb-validate-hreflang").on("click", function(){ var $btn = $(this), $spinner = $("#awb-validate-hreflang-spinner"), $results = $("#awb-hreflang-validation-results"); $btn.prop("disabled", true); $spinner.addClass("is-active"); $results.empty(); $.post(AWBSEO.ajax_url, { action: "awbseo_validate_hreflang", nonce: AWBSEO.nonce }, function(resp){ $spinner.removeClass("is-active"); $btn.prop("disabled", false); if (!resp || !resp.success) { $results.html("

' . esc_js( __( "Could not run validation. Please try again.", "adworksbid-seo" ) ) . '

"); return; } var data = resp.data; if (data.notice) { $results.html("

" + data.notice + "

"); return; } if (!data.issues || data.issues.length === 0) { $results.html("

✓ ' . esc_js( __( "All hreflang pairs checked out - each page returns 200 and links back reciprocally.", "adworksbid-seo" ) ) . '

"); return; } var html = "

" + data.issues.length + " ' . esc_js( __( "issue(s) found:", "adworksbid-seo" ) ) . '

"; $results.html(html); }).fail(function(){ $spinner.removeClass("is-active"); $btn.prop("disabled", false); $results.html("

' . esc_js( __( "Could not run validation. Please try again.", "adworksbid-seo" ) ) . '

"); }); }); });'; wp_add_inline_script( 'awbseo-admin', $awb_settings_js ); ?>