post_type ) { return false; } $settings = get_option( 'schema_ai_settings', array() ); return ! empty( $settings['default_org_name'] ) || ! empty( $settings['default_org_phone'] ) || ! empty( $settings['default_org_email'] ) || ! empty( $settings['default_org_address'] ); } /** * Build the entity node from plugin settings. * * @param int $post_id * @return array Schema array, with @context set. */ public static function build( $post_id ) { $settings = get_option( 'schema_ai_settings', array() ); $fields = array(); if ( ! empty( $settings['default_org_phone'] ) ) { $fields['telephone'] = $settings['default_org_phone']; } if ( ! empty( $settings['default_org_email'] ) ) { $fields['email'] = $settings['default_org_email']; } if ( ! empty( $settings['default_org_address'] ) ) { $address = array( '@type' => 'PostalAddress', 'streetAddress' => $settings['default_org_address'], ); if ( ! empty( $settings['default_org_city'] ) ) { $address['addressLocality'] = $settings['default_org_city']; } if ( ! empty( $settings['default_org_state'] ) ) { $address['addressRegion'] = $settings['default_org_state']; } if ( ! empty( $settings['default_org_zip'] ) ) { $address['postalCode'] = $settings['default_org_zip']; } $address['addressCountry'] = ! empty( $settings['default_org_country'] ) ? $settings['default_org_country'] : 'US'; $fields['address'] = $address; } $builder = new Schema_AI_Local_Business_Schema(); $schema = $builder->build( $post_id, $fields ); // The renderer strips per-node @context and wraps everything in one // shared @context/@graph, so a missing @context here is harmless live, // but the dashboard validator inspects each stored row on its own and // would flag it as a permanent "missing @context" warning. Match what // save_schema()'s siblings get via ensure_common_fields(). if ( ! isset( $schema['@context'] ) ) { $schema = array_merge( array( '@context' => 'https://schema.org' ), $schema ); } return $schema; } /** * Whether a post is the site's homepage (front page). * * @param int $post_id * @return bool */ public static function is_homepage_post( $post_id ) { return trailingslashit( get_permalink( $post_id ) ) === trailingslashit( home_url( '/' ) ); } /** * A schema row's stored validation_status: 'valid' | 'warning' | 'invalid'. * Same rule save_schema() uses. * * @param array $schema * @return string */ public static function validation_status( $schema ) { if ( ! is_array( $schema ) || empty( $schema ) ) { return 'invalid'; } if ( empty( $schema['@type'] ) ) { return 'invalid'; } $has_context = ! empty( $schema['@context'] ); $type = is_array( $schema['@type'] ) ? $schema['@type'][0] : $schema['@type']; switch ( $type ) { case 'FAQPage': $has_name = ! empty( $schema['mainEntity'] ) && is_array( $schema['mainEntity'] ); break; case 'BreadcrumbList': case 'ItemList': $has_name = ! empty( $schema['itemListElement'] ); break; default: $has_name = ! empty( $schema['name'] ) || ! empty( $schema['headline'] ); break; } if ( $has_context && $has_name ) { return 'valid'; } if ( $has_context || $has_name ) { return 'warning'; } return 'invalid'; } }