PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-seo / src / class-local-business-schema-node.php
jetpack / jetpack_vendor / automattic / jetpack-seo / src Last commit date
class-admin-page.php 4 weeks ago class-ai-crawlers.php 4 weeks ago class-ai-seo-enhancer.php 4 days ago class-author-schema-node.php 1 month ago class-breadcrumb-schema-node.php 1 month ago class-content-coverage.php 4 weeks ago class-dashboard-data.php 3 weeks ago class-initializer.php 4 days ago class-llms-txt.php 4 weeks ago class-local-business-schema-node.php 1 month ago class-organization-schema-node.php 1 month ago class-post-schema-node.php 1 month ago class-post-types.php 4 weeks ago class-schema-builder.php 1 month ago class-schema-graph.php 1 month ago class-schema-node-ids.php 1 month ago class-schema-settings-controller.php 1 month ago class-schema-settings.php 1 month ago class-surface-visibility.php 3 weeks ago class-website-schema-node.php 1 month ago
class-local-business-schema-node.php
130 lines
1 <?php
2 /**
3 * LocalBusiness Schema.org decorator for the site-level Organization node.
4 *
5 * Adds LocalBusiness properties to the existing Organization entity when the
6 * admin has enabled local-business schema and configured an address. This keeps
7 * all publisher references pointing at the same stable `#organization` node
8 * instead of introducing a second business entity.
9 *
10 * @package automattic/jetpack-seo-package
11 */
12
13 namespace Automattic\Jetpack\SEO;
14
15 /**
16 * Decorates the site-level Organization node with LocalBusiness details.
17 */
18 class Local_Business_Schema_Node {
19
20 /**
21 * Schema.org opening-hours day-code order and emitted day names.
22 *
23 * @var array<string, string>
24 */
25 const DAY_NAMES = array(
26 'Mo' => 'Monday',
27 'Tu' => 'Tuesday',
28 'We' => 'Wednesday',
29 'Th' => 'Thursday',
30 'Fr' => 'Friday',
31 'Sa' => 'Saturday',
32 'Su' => 'Sunday',
33 );
34
35 /**
36 * Extend an Organization node with LocalBusiness properties.
37 *
38 * @param array|null $organization Built Organization node (null passes through).
39 * @param array $settings Effective values from Schema_Settings::get_local_business().
40 * @return array|null
41 */
42 public static function extend( $organization, array $settings ) {
43 if ( null === $organization || ! is_array( $organization ) ) {
44 return $organization;
45 }
46
47 if ( empty( $settings['enabled'] ) ) {
48 return $organization;
49 }
50
51 $address = self::postal_address( isset( $settings['address'] ) && is_array( $settings['address'] ) ? $settings['address'] : array() );
52 if ( null === $address ) {
53 return $organization;
54 }
55
56 $organization['@type'] = array( 'Organization', 'LocalBusiness' );
57 $organization['address'] = $address;
58
59 foreach ( array( 'telephone', 'priceRange' ) as $field ) {
60 if ( ! empty( $settings[ $field ] ) && is_string( $settings[ $field ] ) ) {
61 $organization[ $field ] = $settings[ $field ];
62 }
63 }
64
65 if ( isset( $settings['geo'] ) && is_array( $settings['geo'] ) ) {
66 $latitude = $settings['geo']['latitude'] ?? '';
67 $longitude = $settings['geo']['longitude'] ?? '';
68 if ( is_numeric( $latitude ) && is_numeric( $longitude ) ) {
69 $organization['geo'] = array(
70 '@type' => 'GeoCoordinates',
71 'latitude' => (float) $latitude,
72 'longitude' => (float) $longitude,
73 );
74 }
75 }
76
77 $hours = self::opening_hours_specification( isset( $settings['openingHours'] ) && is_array( $settings['openingHours'] ) ? $settings['openingHours'] : array() );
78 if ( ! empty( $hours ) ) {
79 $organization['openingHoursSpecification'] = $hours;
80 }
81
82 return $organization;
83 }
84
85 /**
86 * Build a PostalAddress from non-empty address subfields.
87 *
88 * @param array $address Address settings.
89 * @return array|null
90 */
91 private static function postal_address( array $address ) {
92 $postal_address = array( '@type' => 'PostalAddress' );
93 foreach ( array( 'streetAddress', 'addressLocality', 'addressRegion', 'postalCode', 'addressCountry' ) as $field ) {
94 if ( ! empty( $address[ $field ] ) && is_string( $address[ $field ] ) ) {
95 $postal_address[ $field ] = $address[ $field ];
96 }
97 }
98
99 return count( $postal_address ) > 1 ? $postal_address : null;
100 }
101
102 /**
103 * Build OpeningHoursSpecification rows for fully configured days.
104 *
105 * @param array $opening_hours Opening-hours settings keyed by schema.org day code.
106 * @return array<int, array<string, string>>
107 */
108 private static function opening_hours_specification( array $opening_hours ) {
109 $specification = array();
110 foreach ( self::DAY_NAMES as $code => $day_name ) {
111 $entry = isset( $opening_hours[ $code ] ) && is_array( $opening_hours[ $code ] ) ? $opening_hours[ $code ] : array();
112 $opens = isset( $entry['opens'] ) && is_string( $entry['opens'] ) ? $entry['opens'] : '';
113 $closes = isset( $entry['closes'] ) && is_string( $entry['closes'] ) ? $entry['closes'] : '';
114
115 if ( '' === $opens || '' === $closes ) {
116 continue;
117 }
118
119 $specification[] = array(
120 '@type' => 'OpeningHoursSpecification',
121 'dayOfWeek' => $day_name,
122 'opens' => $opens,
123 'closes' => $closes,
124 );
125 }
126
127 return $specification;
128 }
129 }
130