Business Profile - Version 2.2.3

Version Description

(2022-08-03) = - Introducing new block patterns, which can be used to integrate contact card info directly into your block-based theme templates. - Added fields for cell phone, fax and Whatsapp. - Added a new (premium) option that lets you re-order the elements in the contact card. - Added in date and time formatting options for the scheduler in the admin. - Fixed some issues with the layout/styling of the schema meta box on the post and product (WooCommerce) edit screens.

Download this release

Release Info

Developer Rustaurius
Plugin Icon 128x128 Business Profile
Version 2.2.3
Comparing to
See all releases

Code changes from version 2.2.2 to 2.2.3

assets/css/admin.css CHANGED
@@ -1915,4 +1915,33 @@ SETTINGS PREVIEW SCREENS
1915
  margin-right: 0;
1916
  margin-top: 12px;
1917
  }
1918
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1915
  margin-right: 0;
1916
  margin-top: 12px;
1917
  }
1918
+ }
1919
+
1920
+
1921
+ /**************************************/
1922
+ /*** META BOXES ON POST EDIT SCREEN ***/
1923
+ /**************************************/
1924
+ .bpfwp-schema-field-container {
1925
+ margin-bottom: 8px;
1926
+ }
1927
+
1928
+ /*****************************************/
1929
+ /*** META BOXES ON PRODUCT EDIT SCREEN ***/
1930
+ /*****************************************/
1931
+ #bpfwp_schema_product_metabox .inside {
1932
+ display: flex;
1933
+ }
1934
+ #bpfwp_schema_product_metabox.closed .inside {
1935
+ display: none;
1936
+ }
1937
+
1938
+ /**************************/
1939
+ /*** SCHEMA EDIT SCREEN ***/
1940
+ /**************************/
1941
+ .post-type-schema .bpfwp-meta-input,
1942
+ .bpfwp-meta-input input[type="text"].bpfwp-schema-defaults-field {
1943
+ margin-bottom: 8px;
1944
+ }
1945
+ .post-type-schema .bpfwp-meta-field_defaults label {
1946
+ margin-top: 6px;
1947
+ }
assets/css/contact-card.css CHANGED
@@ -68,6 +68,9 @@
68
 
69
  .bp-directions:before,
70
  .bp-phone:before,
 
 
 
71
  .bp-contact:before,
72
  .bp-ordering-link:before,
73
  .bp-booking:before,
@@ -95,9 +98,21 @@
95
  }
96
 
97
  .bp-phone:before {
 
 
 
 
98
  content: "\f470";
99
  }
100
 
 
 
 
 
 
 
 
 
101
  .bp-ordering-link::before {
102
  content: "\f116";
103
  }
@@ -114,3 +129,64 @@
114
  .bp-opening-hours .bp-title:before {
115
  content: "\f469";
116
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
  .bp-directions:before,
70
  .bp-phone:before,
71
+ .bp-cell-phone:before,
72
+ .bp-whatsapp:before,
73
+ .bp-fax:before,
74
  .bp-contact:before,
75
  .bp-ordering-link:before,
76
  .bp-booking:before,
98
  }
99
 
100
  .bp-phone:before {
101
+ content: "\f525";
102
+ }
103
+
104
+ .bp-cell-phone:before {
105
  content: "\f470";
106
  }
107
 
108
+ .bp-whatsapp:before {
109
+ content: "\f19a";
110
+ }
111
+
112
+ .bp-fax:before {
113
+ content: "\f193";
114
+ }
115
+
116
  .bp-ordering-link::before {
117
  content: "\f116";
118
  }
129
  .bp-opening-hours .bp-title:before {
130
  content: "\f469";
131
  }
132
+
133
+ /**************
134
+ BLOCK PATTERNS
135
+ **************/
136
+ .bpfwp-pattern-phone .bp-contact-card *,
137
+ .bpfwp-pattern-email .bp-contact-card *,
138
+ .bpfwp-pattern-phone-email .bp-contact-card *,
139
+ .bpfwp-pattern-cell-phone .bp-contact-card *,
140
+ .bpfwp-pattern-fax .bp-contact-card *,
141
+ .bpfwp-pattern-whatsapp .bp-contact-card *,
142
+ .bpfwp-pattern-address .bp-contact-card *,
143
+ .bpfwp-pattern-hours .bp-contact-card *,
144
+ .bpfwp-pattern-map .bp-contact-card * {
145
+ display: none;
146
+ }
147
+ .bpfwp-pattern-phone .bp-contact-card .bp-phone,
148
+ .bpfwp-pattern-phone .bp-contact-card .bp-phone * {
149
+ display: initial;
150
+ }
151
+ .bpfwp-pattern-email .bp-contact-card .bp-contact-email,
152
+ .bpfwp-pattern-email .bp-contact-card .bp-contact-email * {
153
+ display: initial;
154
+ }
155
+ .bpfwp-pattern-phone-email .bp-contact-card .bp-phone,
156
+ .bpfwp-pattern-phone-email .bp-contact-card .bp-phone *,
157
+ .bpfwp-pattern-phone-email .bp-contact-card .bp-contact-email,
158
+ .bpfwp-pattern-phone-email .bp-contact-card .bp-contact-email * {
159
+ display: initial;
160
+ }
161
+ .bpfwp-pattern-address .bp-contact-card .bp-name,
162
+ .bpfwp-pattern-address .bp-contact-card .bp-name *,
163
+ .bpfwp-pattern-address .bp-contact-card .bp-address,
164
+ .bpfwp-pattern-address .bp-contact-card .bp-address * {
165
+ display: initial;
166
+ }
167
+ .bpfwp-pattern-address .bp-contact-card .bp-name {
168
+ display: block;
169
+ }
170
+ .bpfwp-pattern-hours .bp-contact-card .bp-opening-hours,
171
+ .bpfwp-pattern-hours .bp-contact-card .bp-opening-hours * {
172
+ display: initial;
173
+ }
174
+ .bpfwp-pattern-map .bp-contact-card .bp-map {
175
+ display: block;
176
+ }
177
+ .bpfwp-pattern-map .bp-contact-card .bp-map * {
178
+ display: initial;
179
+ }
180
+ .bpfwp-pattern-fax .bp-contact-card .bp-fax,
181
+ .bpfwp-pattern-fax .bp-contact-card .bp-fax * {
182
+ display: initial;
183
+ }
184
+ .bpfwp-pattern-whatsapp .bp-contact-card .bp-whatsapp,
185
+ .bpfwp-pattern-whatsapp .bp-contact-card .bp-whatsapp * {
186
+ display: initial;
187
+ }
188
+ .bpfwp-pattern-cell-phone .bp-contact-card .bp-cell-phone,
189
+ .bpfwp-pattern-cell-phone .bp-contact-card .bp-cell-phone * {
190
+ display: initial;
191
+ }
192
+
assets/img/premium-screenshots/labelling1.png ADDED
Binary file
assets/js/block-contact-card.js CHANGED
@@ -29,6 +29,18 @@ registerBlockType( 'business-profile/contact-card', {
29
  type: 'boolean',
30
  default: true
31
  },
 
 
 
 
 
 
 
 
 
 
 
 
32
  show_contact: {
33
  type: 'boolean',
34
  default: true
@@ -83,6 +95,21 @@ registerBlockType( 'business-profile/contact-card', {
83
  checked={ attributes.show_phone }
84
  onChange={ ( show_phone ) => { setAttributes( { show_phone } ) } }
85
  />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  <CheckboxControl
87
  label={ __( 'Show contact details', 'business-profile') }
88
  checked={ attributes.show_contact }
29
  type: 'boolean',
30
  default: true
31
  },
32
+ show_cell_phone: {
33
+ type: 'boolean',
34
+ default: true
35
+ },
36
+ show_whatsapp: {
37
+ type: 'boolean',
38
+ default: true
39
+ },
40
+ show_fax: {
41
+ type: 'boolean',
42
+ default: true
43
+ },
44
  show_contact: {
45
  type: 'boolean',
46
  default: true
95
  checked={ attributes.show_phone }
96
  onChange={ ( show_phone ) => { setAttributes( { show_phone } ) } }
97
  />
98
+ <CheckboxControl
99
+ label={ __( 'Show Cell phone number', 'business-profile') }
100
+ checked={ attributes.show_cell_phone }
101
+ onChange={ ( show_cell_phone ) => { setAttributes( { show_cell_phone } ) } }
102
+ />
103
+ <CheckboxControl
104
+ label={ __( 'Show Whatsapp', 'business-profile') }
105
+ checked={ attributes.show_whatsapp }
106
+ onChange={ ( show_whatsapp ) => { setAttributes( { show_whatsapp } ) } }
107
+ />
108
+ <CheckboxControl
109
+ label={ __( 'Show Fax number', 'business-profile') }
110
+ checked={ attributes.show_fax }
111
+ onChange={ ( show_fax ) => { setAttributes( { show_fax } ) } }
112
+ />
113
  <CheckboxControl
114
  label={ __( 'Show contact details', 'business-profile') }
115
  checked={ attributes.show_contact }
assets/js/blocks.build.js CHANGED
@@ -1 +1 @@
1
- !function(e){function n(t){if(o[t])return o[t].exports;var l=o[t]={i:t,l:!1,exports:{}};return e[t].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var o={};n.m=e,n.c=o,n.d=function(e,o,t){n.o(e,o)||Object.defineProperty(e,o,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(o,"a",o),o},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=0)}([function(e,n,o){e.exports=o(1)},function(e,n){var o=wp.i18n.__,t=wp.blocks.registerBlockType,l=wp.components,s=l.SelectControl,r=l.CheckboxControl,a=l.PanelBody,i=l.ServerSideRender,c=l.Disabled,p=wp.editor.InspectorControls,u=bpfwp_blocks,h=u.locationOptions;t("business-profile/contact-card",{title:o("Contact Card","business-profile"),category:"bpfwp-blocks",icon:"location",attributes:{location:{type:"number",default:0},show_name:{type:"boolean",default:!0},show_address:{type:"boolean",default:!0},show_get_directions:{type:"boolean",default:!0},show_phone:{type:"boolean",default:!0},show_contact:{type:"boolean",default:!0},show_opening_hours:{type:"boolean",default:!0},show_opening_hours_brief:{type:"boolean",default:!1},show_map:{type:"boolean",default:!0}},supports:{html:!1},edit:function(e){var n=e.attributes,t=e.setAttributes;return wp.element.createElement("div",null,wp.element.createElement(p,null,wp.element.createElement(a,null,h.length?wp.element.createElement(s,{label:o("Select a Location","business-profile"),value:n.location,onChange:function(e){return t({location:parseInt(e,10)})},options:h}):"",wp.element.createElement(r,{label:o("Show Name","business-profile"),checked:n.show_name,onChange:function(e){t({show_name:e})}}),wp.element.createElement(r,{label:o("Show Address","business-profile"),checked:n.show_address,onChange:function(e){t({show_address:e})}}),wp.element.createElement(r,{label:o("Show link to get directions on Google Maps","business-profile"),checked:n.show_get_directions,onChange:function(e){t({show_get_directions:e})}}),wp.element.createElement(r,{label:o("Show Phone number","business-profile"),checked:n.show_phone,onChange:function(e){t({show_phone:e})}}),wp.element.createElement(r,{label:o("Show contact details","business-profile"),checked:n.show_contact,onChange:function(e){t({show_contact:e})}}),wp.element.createElement(r,{label:o("Show Opening Hours","business-profile"),checked:n.show_opening_hours,onChange:function(e){t({show_opening_hours:e})}}),wp.element.createElement(r,{label:o("Show brief opening hours on one line","business-profile"),checked:n.show_opening_hours_brief,onChange:function(e){t({show_opening_hours_brief:e})}}),wp.element.createElement(r,{label:o("Show Google Map","business-profile"),checked:n.show_map,onChange:function(e){t({show_map:e})}}))),wp.element.createElement(c,null,wp.element.createElement(i,{block:"business-profile/contact-card",attributes:n})))},save:function(){return null}})}]);
1
+ !function(b){function a(d){if(c[d])return c[d].exports;var e=c[d]={i:d,l:!1,exports:{}};return b[d].call(e.exports,e,e.exports,a),e.l=!0,e.exports}var c={};a.m=b,a.c=c,a.d=function(b,c,d){a.o(b,c)||Object.defineProperty(b,c,{configurable:!1,enumerable:!0,get:d})},a.n=function(c){var b=c&&c.__esModule?function(){return c.default}:function(){return c};return a.d(b,"a",b),b},a.o=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)},a.p="",a(a.s=0)}([function(a,c,b){a.exports=b(1)},function(e,f){var b=wp.i18n.__,c=wp.blocks.registerBlockType,a=wp.components,g=a.SelectControl,h=a.CheckboxControl,i=a.PanelBody,j=a.ServerSideRender,k=a.Disabled,l=wp.editor.InspectorControls,d=bpfwp_blocks,m=d.locationOptions;c("business-profile/contact-card",{title:b("Contact Card","business-profile"),category:"bpfwp-blocks",icon:"location",attributes:{location:{type:"number",default:0},show_name:{type:"boolean",default:!0},show_address:{type:"boolean",default:!0},show_get_directions:{type:"boolean",default:!0},show_phone:{type:"boolean",default:!0},show_cell_phone:{type:"boolean",default:!0},show_whatsapp:{type:"boolean",default:!0},show_fax:{type:"boolean",default:!0},show_contact:{type:"boolean",default:!0},show_opening_hours:{type:"boolean",default:!0},show_opening_hours_brief:{type:"boolean",default:!1},show_map:{type:"boolean",default:!0}},supports:{html:!1},edit:function(c){var a=c.attributes,d=c.setAttributes;return wp.element.createElement("div",null,wp.element.createElement(l,null,wp.element.createElement(i,null,m.length?wp.element.createElement(g,{label:b("Select a Location","business-profile"),value:a.location,onChange:function(a){return d({location:parseInt(a,10)})},options:m}):"",wp.element.createElement(h,{label:b("Show Name","business-profile"),checked:a.show_name,onChange:function(a){d({show_name:a})}}),wp.element.createElement(h,{label:b("Show Address","business-profile"),checked:a.show_address,onChange:function(a){d({show_address:a})}}),wp.element.createElement(h,{label:b("Show link to get directions on Google Maps","business-profile"),checked:a.show_get_directions,onChange:function(a){d({show_get_directions:a})}}),wp.element.createElement(h,{label:b("Show Phone number","business-profile"),checked:a.show_phone,onChange:function(a){d({show_phone:a})}}),wp.element.createElement(h,{label:b("Show Cell phone number","business-profile"),checked:a.show_cell_phone,onChange:function(a){d({show_cell_phone:a})}}),wp.element.createElement(h,{label:b("Show Whatsapp","business-profile"),checked:a.show_whatsapp,onChange:function(a){d({show_whatsapp:a})}}),wp.element.createElement(h,{label:b("Show Fax number","business-profile"),checked:a.show_fax,onChange:function(a){d({show_fax:a})}}),wp.element.createElement(h,{label:b("Show contact details","business-profile"),checked:a.show_contact,onChange:function(a){d({show_contact:a})}}),wp.element.createElement(h,{label:b("Show Opening Hours","business-profile"),checked:a.show_opening_hours,onChange:function(a){d({show_opening_hours:a})}}),wp.element.createElement(h,{label:b("Show brief opening hours on one line","business-profile"),checked:a.show_opening_hours_brief,onChange:function(a){d({show_opening_hours_brief:a})}}),wp.element.createElement(h,{label:b("Show Google Map","business-profile"),checked:a.show_map,onChange:function(a){d({show_map:a})}}))),wp.element.createElement(k,null,wp.element.createElement(j,{block:"business-profile/contact-card",attributes:a})))},save:function(){return null}})}])
bpfwp-templates/contact-card.php CHANGED
@@ -103,7 +103,7 @@
103
  foreach ( $data as $data => $callback ) {
104
 
105
  $return_array = call_user_func( $callback, bpfwp_get_display( 'location' ) );
106
- if ( is_array( $return_array ) ) { $json_ld_data = array_merge( $json_ld_data, $return_array ); }
107
  }
108
  ?>
109
  <script type="application/ld+json">
103
  foreach ( $data as $data => $callback ) {
104
 
105
  $return_array = call_user_func( $callback, bpfwp_get_display( 'location' ) );
106
+ if ( is_array( $return_array ) ) { $json_ld_data = array_merge_recursive( $json_ld_data, $return_array ); }
107
  }
108
  ?>
109
  <script type="application/ld+json">
bpfwp-templates/opening-hours.php CHANGED
@@ -15,10 +15,12 @@
15
  * @license GPL-2.0+
16
  * @since 1.1.0
17
  */
 
 
18
  ?>
19
 
20
  <div class="bp-opening-hours">
21
- <span class="bp-title"><?php _e( 'Opening Hours', 'business-profile' ); ?></span>
22
  <?php foreach ( $data->weekday_hours as $weekday => $times ) : ?>
23
  <div class="bp-weekday">
24
  <span class="bp-weekday-name bp-weekday-<?php echo esc_attr( $weekday ); ?>"><?php echo esc_html( $data->weekday_names[$weekday] ); ?></span>
15
  * @license GPL-2.0+
16
  * @since 1.1.0
17
  */
18
+
19
+ global $bpfwp_controller;
20
  ?>
21
 
22
  <div class="bp-opening-hours">
23
+ <span class="bp-title"><?php echo esc_html( $bpfwp_controller->settings->get_setting( 'label-opening-hours' ) ); ?></span>
24
  <?php foreach ( $data->weekday_hours as $weekday => $times ) : ?>
25
  <div class="bp-weekday">
26
  <span class="bp-weekday-name bp-weekday-<?php echo esc_attr( $weekday ); ?>"><?php echo esc_html( $data->weekday_names[$weekday] ); ?></span>
business-profile.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Five Star Business Profile and Schema
4
  * Plugin URI: https://www.fivestarplugins.com/plugins/business-profile/
5
  * Description: Add schema structured data to any page or post type. Create an SEO friendly contact card with your business info and associated schema. Supports Google Map, opening hours and more.
6
- * Version: 2.2.2
7
  * Author: Five Star Plugins
8
  * Author URI: https://www.fivestarplugins.com
9
  * License: GPLv3
@@ -120,7 +120,7 @@ if ( ! class_exists( 'bpfwpInit', false ) ) :
120
  define( 'BPFWP_PLUGIN_DIR', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
121
  define( 'BPFWP_PLUGIN_URL', untrailingslashit( plugin_dir_url( __FILE__ ) ) );
122
  define( 'BPFWP_PLUGIN_FNAME', plugin_basename( __FILE__ ) );
123
- define( 'BPFWP_VERSION', '2.2.2' );
124
  }
125
 
126
  /**
@@ -132,6 +132,7 @@ if ( ! class_exists( 'bpfwpInit', false ) ) :
132
  */
133
  protected function includes() {
134
  require_once BPFWP_PLUGIN_DIR . '/includes/class-blocks.php';
 
135
  require_once BPFWP_PLUGIN_DIR . '/includes/class-compatibility.php';
136
  require_once BPFWP_PLUGIN_DIR . '/includes/class-custom-post-types.php';
137
  require_once BPFWP_PLUGIN_DIR . '/includes/class-deactivation-survey.php';
@@ -168,6 +169,7 @@ if ( ! class_exists( 'bpfwpInit', false ) ) :
168
  $this->settings = new bpfwpSettings();
169
  $this->cpts = new bpfwpCustomPostTypes();
170
  $this->blocks = new bpfwpBlocks();
 
171
 
172
  $this->blocks->run();
173
  $this->cpts->run( $this->settings->get_setting('multiple-locations') );
3
  * Plugin Name: Five Star Business Profile and Schema
4
  * Plugin URI: https://www.fivestarplugins.com/plugins/business-profile/
5
  * Description: Add schema structured data to any page or post type. Create an SEO friendly contact card with your business info and associated schema. Supports Google Map, opening hours and more.
6
+ * Version: 2.2.3
7
  * Author: Five Star Plugins
8
  * Author URI: https://www.fivestarplugins.com
9
  * License: GPLv3
120
  define( 'BPFWP_PLUGIN_DIR', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
121
  define( 'BPFWP_PLUGIN_URL', untrailingslashit( plugin_dir_url( __FILE__ ) ) );
122
  define( 'BPFWP_PLUGIN_FNAME', plugin_basename( __FILE__ ) );
123
+ define( 'BPFWP_VERSION', '2.2.3' );
124
  }
125
 
126
  /**
132
  */
133
  protected function includes() {
134
  require_once BPFWP_PLUGIN_DIR . '/includes/class-blocks.php';
135
+ require_once BPFWP_PLUGIN_DIR . '/includes/class-patterns.php';
136
  require_once BPFWP_PLUGIN_DIR . '/includes/class-compatibility.php';
137
  require_once BPFWP_PLUGIN_DIR . '/includes/class-custom-post-types.php';
138
  require_once BPFWP_PLUGIN_DIR . '/includes/class-deactivation-survey.php';
169
  $this->settings = new bpfwpSettings();
170
  $this->cpts = new bpfwpCustomPostTypes();
171
  $this->blocks = new bpfwpBlocks();
172
+ $this->patterns = new bpfwpPatterns();
173
 
174
  $this->blocks->run();
175
  $this->cpts->run( $this->settings->get_setting('multiple-locations') );
includes/class-blocks.php CHANGED
@@ -93,6 +93,18 @@ if ( ! class_exists( 'bpfwpBlocks', false ) ) :
93
  'type' => 'boolean',
94
  'default' => true,
95
  ),
 
 
 
 
 
 
 
 
 
 
 
 
96
  'show_contact' => array(
97
  'type' => 'boolean',
98
  'default' => true,
93
  'type' => 'boolean',
94
  'default' => true,
95
  ),
96
+ 'show_cell_phone' => array(
97
+ 'type' => 'boolean',
98
+ 'default' => true,
99
+ ),
100
+ 'show_whatsapp' => array(
101
+ 'type' => 'boolean',
102
+ 'default' => true,
103
+ ),
104
+ 'show_fax' => array(
105
+ 'type' => 'boolean',
106
+ 'default' => true,
107
+ ),
108
  'show_contact' => array(
109
  'type' => 'boolean',
110
  'default' => true,
includes/class-contact-card-widget.php CHANGED
@@ -40,6 +40,9 @@ if ( ! class_exists( 'bpfwpContactCardWidget', false ) ) :
40
  'show_address' => __( 'Show Address', 'business-profile' ),
41
  'show_get_directions' => __( 'Show link to get directions on Google Maps', 'business-profile' ),
42
  'show_phone' => __( 'Show Phone number', 'business-profile' ),
 
 
 
43
  'show_ordering_link' => __( 'Show Ordering Link', 'business-profile' ),
44
  'show_contact' => __( 'Show contact details', 'business-profile' ),
45
  'show_opening_hours' => __( 'Show Opening Hours', 'business-profile' ),
@@ -129,7 +132,7 @@ if ( ! class_exists( 'bpfwpContactCardWidget', false ) ) :
129
 
130
  <?php endif; // Locations. ?>
131
 
132
- <?php foreach ( $this->toggles as $id => $label ) : ?>
133
 
134
  <p>
135
  <input type="checkbox" id="<?php echo esc_attr( $this->get_field_id( $id ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $id ) ); ?>" value="1"<?php if ( ! empty( $instance[ $id ] ) ) : ?> checked="checked"<?php endif; ?>>
40
  'show_address' => __( 'Show Address', 'business-profile' ),
41
  'show_get_directions' => __( 'Show link to get directions on Google Maps', 'business-profile' ),
42
  'show_phone' => __( 'Show Phone number', 'business-profile' ),
43
+ 'show_cell_phone' => __( 'Show Cell phone number', 'business-profile' ),
44
+ 'show_whatsapp' => __( 'Show Whatsapp', 'business-profile' ),
45
+ 'show_fax' => __( 'Show Fax number', 'business-profile' ),
46
  'show_ordering_link' => __( 'Show Ordering Link', 'business-profile' ),
47
  'show_contact' => __( 'Show contact details', 'business-profile' ),
48
  'show_opening_hours' => __( 'Show Opening Hours', 'business-profile' ),
132
 
133
  <?php endif; // Locations. ?>
134
 
135
+ <?php print_r($this->toggles, true); foreach ( $this->toggles as $id => $label ) : ?>
136
 
137
  <p>
138
  <input type="checkbox" id="<?php echo esc_attr( $this->get_field_id( $id ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $id ) ); ?>" value="1"<?php if ( ! empty( $instance[ $id ] ) ) : ?> checked="checked"<?php endif; ?>>
includes/class-custom-post-types.php CHANGED
@@ -449,6 +449,41 @@ if ( ! class_exists( 'bpfwpCustomPostTypes', false ) ) :
449
  <input type="tel" name="clickphone" id="bpfwp_clickphone" value="<?php esc_attr_e( get_post_meta( $post->ID, 'clickphone', true ) ); ?>">
450
  </div>
451
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452
  <?php
453
  }
454
 
@@ -822,6 +857,11 @@ if ( ! class_exists( 'bpfwpCustomPostTypes', false ) ) :
822
  'geo_longitude' => 'sanitize_text_field',
823
  'phone' => 'sanitize_text_field',
824
  'clickphone' => 'sanitize_text_field',
 
 
 
 
 
825
  'contact_post' => 'absint',
826
  'contact_email' => 'sanitize_email',
827
  'opening_hours' => array( $this, 'sanitize_opening_hours' ),
449
  <input type="tel" name="clickphone" id="bpfwp_clickphone" value="<?php esc_attr_e( get_post_meta( $post->ID, 'clickphone', true ) ); ?>">
450
  </div>
451
 
452
+ <div class="bpfwp-meta-input bpfwp-meta-phone">
453
+ <label for="bpfwp_cell_phone">
454
+ <?php esc_html_e( 'Cell Phone', 'business-profile' ); ?>
455
+ </label>
456
+ <input type="tel" name="cell-phone" id="bpfwp_cell_phone" value="<?php esc_attr_e( get_post_meta( $post->ID, 'cell-phone', true ) ); ?>">
457
+ </div>
458
+
459
+ <div class="bpfwp-meta-input bpfwp-meta-phone">
460
+ <label for="clickcellphone">
461
+ <?php esc_html_e( 'Click-to-Call Cell Phone', 'business-profile' ); ?>
462
+ </label>
463
+ <input type="tel" name="clickcellphone" id="clickcellphone" value="<?php esc_attr_e( get_post_meta( $post->ID, 'clickcellphone', true ) ); ?>">
464
+ </div>
465
+
466
+ <div class="bpfwp-meta-input bpfwp-meta-phone">
467
+ <label for="bpfwp_whatsapp">
468
+ <?php esc_html_e( 'Whatsapp', 'business-profile' ); ?>
469
+ </label>
470
+ <input type="tel" name="whatsapp" id="bpfwp_whatsapp" value="<?php esc_attr_e( get_post_meta( $post->ID, 'whatsapp', true ) ); ?>">
471
+ </div>
472
+
473
+ <div class="bpfwp-meta-input bpfwp-meta-phone">
474
+ <label for="bpfwp_whatsapptxt">
475
+ <?php esc_html_e( 'Whatsapp Text', 'business-profile' ); ?>
476
+ </label>
477
+ <input type="text" name="whatsapptext" id="bpfwp_whatsapptxt" value="<?php esc_attr_e( get_post_meta( $post->ID, 'whatsapptext', true ) ); ?>">
478
+ </div>
479
+
480
+ <div class="bpfwp-meta-input bpfwp-meta-phone">
481
+ <label for="bpfwp_fax">
482
+ <?php esc_html_e( 'Fax', 'business-profile' ); ?>
483
+ </label>
484
+ <input type="tel" name="fax" id="bpfwp_fax" value="<?php esc_attr_e( get_post_meta( $post->ID, 'fax', true ) ); ?>">
485
+ </div>
486
+
487
  <?php
488
  }
489
 
857
  'geo_longitude' => 'sanitize_text_field',
858
  'phone' => 'sanitize_text_field',
859
  'clickphone' => 'sanitize_text_field',
860
+ 'cell-phone' => 'sanitize_text_field',
861
+ 'clickcellphone' => 'sanitize_text_field',
862
+ 'whatsapp' => 'sanitize_text_field',
863
+ 'whatsapptext' => 'sanitize_text_field',
864
+ 'fax' => 'sanitize_text_field',
865
  'contact_post' => 'absint',
866
  'contact_email' => 'sanitize_email',
867
  'opening_hours' => array( $this, 'sanitize_opening_hours' ),
includes/class-dashboard.php CHANGED
@@ -247,7 +247,6 @@ class bpfwpDashboard {
247
 
248
  </div>
249
  <?php } ?>
250
- </div>
251
 
252
  <!-- <div class="bpfwp-dashboard-new-widget-box ewd-widget-box-full">
253
  <div class="bpfwp-dashboard-new-widget-box-top">Other Plugins by Etoile</div>
247
 
248
  </div>
249
  <?php } ?>
 
250
 
251
  <!-- <div class="bpfwp-dashboard-new-widget-box ewd-widget-box-full">
252
  <div class="bpfwp-dashboard-new-widget-box-top">Other Plugins by Etoile</div>
includes/class-patterns.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Methods for handling block patterns
4
+ *
5
+ * @package BusinessProfile
6
+ * @copyright Copyright (c) 2022, Five Star Plugins
7
+ * @license GPL-2.0+
8
+ * @since 2.2.3
9
+ */
10
+
11
+ defined( 'ABSPATH' ) || exit;
12
+
13
+ if ( ! class_exists( 'bpfwpPatterns', false ) ) :
14
+
15
+ /**
16
+ * Class to create, edit and display blocks for the Gutenberg editor
17
+ *
18
+ * @since 2.2.3
19
+ */
20
+ class bpfwpPatterns {
21
+
22
+ /**
23
+ * Add hooks
24
+ * @since 2.2.3
25
+ */
26
+ public function __construct() {
27
+
28
+ add_action( 'init', array( $this, 'bpfwp_add_pattern_category' ) );
29
+ add_action( 'init', array( $this, 'bpfwp_add_patterns' ) );
30
+ }
31
+
32
+ /**
33
+ * Register block patterns
34
+ * @since 2.2.3
35
+ */
36
+ public function bpfwp_add_patterns() {
37
+
38
+ $block_patterns = array(
39
+ 'contact-card',
40
+ 'phone',
41
+ 'cell-phone',
42
+ 'email',
43
+ 'phone-email',
44
+ 'whatsapp',
45
+ 'fax',
46
+ 'address',
47
+ 'hours',
48
+ 'map',
49
+ );
50
+
51
+ foreach ( $block_patterns as $block_pattern ) {
52
+ $pattern_file = BPFWP_PLUGIN_DIR . '/includes/patterns/' . $block_pattern . '.php';
53
+
54
+ register_block_pattern(
55
+ 'business-profile/' . $block_pattern,
56
+ require $pattern_file
57
+ );
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Create a new category of block patterns to hold our pattern(s)
63
+ * @since 2.2.3
64
+ */
65
+ public function bpfwp_add_pattern_category() {
66
+
67
+ register_block_pattern_category(
68
+ 'bpfwp-block-patterns',
69
+ array(
70
+ 'label' => __( 'Five Star Business Profile & Schema', 'business-profile' )
71
+ ),
72
+ );
73
+ }
74
+ }
75
+ endif;
includes/class-permissions.php CHANGED
@@ -15,6 +15,7 @@ class bpfwpPermissions {
15
  public function __construct() {
16
  $this->plugin_permissions = array(
17
  "premium" => 2,
 
18
  "locations" => 2,
19
  "integrations" => 2,
20
  "api_usage" => 2
15
  public function __construct() {
16
  $this->plugin_permissions = array(
17
  "premium" => 2,
18
+ "labelling" => 2,
19
  "locations" => 2,
20
  "integrations" => 2,
21
  "api_usage" => 2
includes/class-schema-cpt.php CHANGED
@@ -311,20 +311,30 @@ if ( ! class_exists( 'bpfwpSchemaCPT' ) ) :
311
  // update the child_depth parameter if in a non-schema field
312
  if ( isset($specified_values[$field_prefix . '_' . $field->slug]) and is_array($specified_values[$field_prefix . '_' . $field->slug]) ) { $child_depth = sizeOf( $specified_values[$field_prefix . '_' . $field->slug] ); }
313
 
314
- echo '<label class="' . ( $field->recommended ? 'recommended' : '' ) . '" for="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']">' . esc_html( $field->name ) . '</label>';
 
 
 
 
 
 
 
 
315
 
316
- echo '<textarea name="' . esc_attr( $this->schema_type . '[' . $field_prefix . '_' . $field->slug . '][' . $count ) . ']" placeholder="' . ( isset($placeholder) ? esc_attr( $placeholder ) : "" ) . '">';
317
- echo isset($value) ? esc_textarea( $value ) : '';
318
- echo '</textarea>';
319
  break;
320
 
321
  default:
322
  // update the child_depth parameter if in a non-schema field
323
  if ( isset($specified_values[$field_prefix . '_' . $field->slug]) and is_array($specified_values[$field_prefix . '_' . $field->slug]) ) { $child_depth = sizeOf( $specified_values[$field_prefix . '_' . $field->slug] ); }
324
 
325
- echo '<label class="' . ( $field->recommended ? 'recommended' : '' ) . '" for="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']">' . esc_html( $field->name ) . '</label>';
 
 
 
 
 
 
326
 
327
- echo '<input type="' . esc_attr( $field->input ) . '" name="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']" placeholder="' . ( isset($placeholder) ? esc_attr( $placeholder ) : '' ) . '" value="' . ( isset($value) ? esc_attr( $value ) : '' ) . '" />';
328
  }
329
 
330
  return $child_depth;
311
  // update the child_depth parameter if in a non-schema field
312
  if ( isset($specified_values[$field_prefix . '_' . $field->slug]) and is_array($specified_values[$field_prefix . '_' . $field->slug]) ) { $child_depth = sizeOf( $specified_values[$field_prefix . '_' . $field->slug] ); }
313
 
314
+ echo '<div class="bpfwp-schema-field-container" data-field_name="' . esc_attr( $field->name ) . '">';
315
+
316
+ echo '<label class="' . ( $field->recommended ? 'recommended' : '' ) . '" for="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']">' . esc_html( $field->name ) . '</label>';
317
+
318
+ echo '<textarea name="' . esc_attr( $this->schema_type . '[' . $field_prefix . '_' . $field->slug . '][' . $count ) . ']" placeholder="' . ( isset($placeholder) ? esc_attr( $placeholder ) : "" ) . '">';
319
+ echo isset($value) ? esc_textarea( $value ) : '';
320
+ echo '</textarea>';
321
+
322
+ echo '</div>';
323
 
 
 
 
324
  break;
325
 
326
  default:
327
  // update the child_depth parameter if in a non-schema field
328
  if ( isset($specified_values[$field_prefix . '_' . $field->slug]) and is_array($specified_values[$field_prefix . '_' . $field->slug]) ) { $child_depth = sizeOf( $specified_values[$field_prefix . '_' . $field->slug] ); }
329
 
330
+ echo '<div class="bpfwp-schema-field-container" data-field_name="' . esc_attr( $field->name ) . '">';
331
+
332
+ echo '<label class="' . ( $field->recommended ? 'recommended' : '' ) . '" for="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']">' . esc_html( $field->name ) . '</label>';
333
+
334
+ echo '<input type="' . esc_attr( $field->input ) . '" name="' . esc_attr( $this->schema_type ) . '[' . esc_attr( $field_prefix ) . '_' . esc_attr( $field->slug ) . '][' . esc_attr( $count ) . ']" placeholder="' . ( isset($placeholder) ? esc_attr( $placeholder ) : '' ) . '" value="' . ( isset($value) ? esc_attr( $value ) : '' ) . '" />';
335
+
336
+ echo '</div>';
337
 
 
338
  }
339
 
340
  return $child_depth;
includes/class-settings.php CHANGED
@@ -75,6 +75,54 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
75
  $this->defaults = array(
76
  'schema_type' => 'Organization',
77
  'name' => get_bloginfo( 'name' ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  );
79
 
80
  $this->defaults = apply_filters( 'bpfwp_defaults', $this->defaults, $this );
@@ -105,6 +153,9 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
105
  'show_address' => true,
106
  'show_get_directions' => true,
107
  'show_phone' => true,
 
 
 
108
  'show_ordering_link' => true,
109
  'show_contact' => true,
110
  'show_opening_hours' => true,
@@ -189,6 +240,11 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
189
  }
190
  break;
191
 
 
 
 
 
 
192
  case 'exceptions' :
193
  case 'schema_type' :
194
  case 'phone' :
@@ -453,6 +509,79 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
453
  )
454
  );
455
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  $sap->add_setting(
457
  'bpfwp-settings',
458
  'bpfwp-contact',
@@ -529,8 +658,8 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
529
  'saturday' => _x( 'Sa', 'Saturday abbreviation', 'business-profile' ),
530
  'sunday' => _x( 'Su', 'Sunday abbreviation', 'business-profile' ),
531
  ),
532
- 'time_format' => _x( 'h:i A', 'Time format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/time.htm#formats', 'business-profile' ),
533
- 'date_format' => _x( 'mmmm d, yyyy', 'Date format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/date.htm#formatting-rules', 'business-profile' ),
534
  'disable_weeks' => true,
535
  'disable_date' => true,
536
  'strings' => array(
@@ -572,8 +701,8 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
572
  'id' => 'exceptions',
573
  'title' => __( 'Exceptions', 'business-profile' ),
574
  'description' => __( '<strong>This feature requires at least version 5.3 of WordPress.</strong> Define special opening hours for holidays, events or other needs. Leave the time empty if you\'re closed all day.', 'business-profile' ),
575
- 'time_format' => _x( 'h:i A', 'Time format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/time.htm#formats', 'business-profile' ),
576
- 'date_format' => _x( 'mmmm d, yyyy', 'Date format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/date.htm#formatting-rules', 'business-profile' ),
577
  'disable_weekdays' => true,
578
  'disable_weeks' => true,
579
  'strings' => array(
@@ -603,6 +732,30 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
603
  ),
604
  )
605
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
606
 
607
  $sap->add_section(
608
  'bpfwp-settings',
@@ -700,6 +853,25 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
700
  'callback' => $this->premium_info( 'premium' )
701
  )
702
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
703
 
704
  $sap = apply_filters( 'bpfwp_settings_page', $sap, $this );
705
 
@@ -759,6 +931,21 @@ if ( ! class_exists( 'bpfwpSettings' ) ) :
759
  </div>
760
  ';
761
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762
  break;
763
  }
764
 
75
  $this->defaults = array(
76
  'schema_type' => 'Organization',
77
  'name' => get_bloginfo( 'name' ),
78
+ 'time-format' => _x( 'h:i A', 'Time format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/time.htm#formats', 'business-profile' ),
79
+ 'date-format' => _x( 'mmmm d, yyyy', 'Date format displayed in the opening hours setting panel in your admin area. Must match formatting rules at http://amsul.ca/pickadate.js/date.htm#formatting-rules', 'business-profile' ),
80
+
81
+ 'contact-card-elements-order' => json_encode(
82
+ array(
83
+ 'name' => __( 'Name', 'business-profile' ),
84
+ 'address' => __( 'Address', 'business-profile' ),
85
+ 'phone' => __( 'Phone', 'business-profile' ),
86
+ 'cell_phone' => __( 'Cell Phone', 'business-profile' ),
87
+ 'whatsapp' => __( 'WhatsApp', 'business-profile' ),
88
+ 'fax_phone' => __( 'Fax', 'business-profile' ),
89
+ 'ordering-link' => __( 'Ordering Link', 'business-profile' ),
90
+ 'contact' => __( 'Contact', 'business-profile' ),
91
+ 'exceptions' => __( 'Exceptions', 'business-profile' ),
92
+ 'opening_hours' => __( 'Opening Hours', 'business-profile' ),
93
+ 'map' => __( 'Maps', 'business-profile' ),
94
+ 'parent_organization' => __( 'Parent Organization', 'business-profile' )
95
+ )
96
+ ),
97
+
98
+ 'label-opening-hours' => __( 'Opening Hours', 'business-profile' ),
99
+ 'label-place-an-order' => __( 'Place an Order', 'business-profile' ),
100
+ 'label-get-directions' => __( 'Get Directions', 'business-profile' ),
101
+ 'label-contact' => __( 'Contact', 'business-profile' ),
102
+
103
+ 'label-monday' => __( 'Monday', 'business-profile' ),
104
+ 'label-tuesday' => __( 'Tuesday', 'business-profile' ),
105
+ 'label-wednesday' => __( 'Wednesday', 'business-profile' ),
106
+ 'label-thursday' => __( 'Thursday', 'business-profile' ),
107
+ 'label-friday' => __( 'Friday', 'business-profile' ),
108
+ 'label-saturday' => __( 'Saturday', 'business-profile' ),
109
+ 'label-sunday' => __( 'Sunday', 'business-profile' ),
110
+
111
+ 'label-monday-abbreviation' => __( 'Mo', 'business-profile' ),
112
+ 'label-tuesday-abbreviation' => __( 'Tu', 'business-profile' ),
113
+ 'label-wednesday-abbreviation' => __( 'We', 'business-profile' ),
114
+ 'label-thursday-abbreviation' => __( 'Th', 'business-profile' ),
115
+ 'label-friday-abbreviation' => __( 'Fr', 'business-profile' ),
116
+ 'label-saturday-abbreviation' => __( 'Sa', 'business-profile' ),
117
+ 'label-sunday-abbreviation' => __( 'Su', 'business-profile' ),
118
+
119
+ 'label-open' => __( 'Open', 'business-profile' ),
120
+ 'label-open-until' => __( 'Open until', 'business-profile' ),
121
+ 'label-open-from' => __( 'Open from', 'business-profile' ),
122
+ 'label-closed' => __( 'Closed', 'business-profile' ),
123
+
124
+ 'label-special-opening-hours' => __( 'Special Opening Hours', 'business-profile' ),
125
+ 'label-holidays' => __( 'Holidays', 'business-profile' ),
126
  );
127
 
128
  $this->defaults = apply_filters( 'bpfwp_defaults', $this->defaults, $this );
153
  'show_address' => true,
154
  'show_get_directions' => true,
155
  'show_phone' => true,
156
+ 'show_cell_phone' => true,
157
+ 'show_whatsapp' => true,
158
+ 'show_fax' => true,
159
  'show_ordering_link' => true,
160
  'show_contact' => true,
161
  'show_opening_hours' => true,
240
  }
241
  break;
242
 
243
+ case 'cell-phone' :
244
+ case 'clickcellphone' :
245
+ case 'whatsapp' :
246
+ case 'whatsapptext' :
247
+ case 'fax' :
248
  case 'exceptions' :
249
  case 'schema_type' :
250
  case 'phone' :
509
  )
510
  );
511
 
512
+ $sap->add_setting(
513
+ 'bpfwp-settings',
514
+ 'bpfwp-contact',
515
+ 'text',
516
+ array(
517
+ 'id' => 'cell-phone',
518
+ 'title' => __( 'Cell Phone', 'business-profile' ),
519
+ 'args' => array(
520
+ 'label_for' => 'bpfwp-settings[phone]',
521
+ 'class' => 'bpfwp-phone'
522
+ )
523
+ )
524
+ );
525
+
526
+ $sap->add_setting(
527
+ 'bpfwp-settings',
528
+ 'bpfwp-contact',
529
+ 'text',
530
+ array(
531
+ 'id' => 'clickcellphone',
532
+ 'title' => __( 'Click-to-Call Cell Phone', 'business-profile' ),
533
+ 'description' => __( 'Use this field to set a different number for when the cell phone number is clicked in the contact card (e.g. if you\'d like it to be just an unformatted string of numbers). If left blank, the click-to-call will use the cell phone number provided in the option above.', 'business-profile' ),
534
+ 'args' => array(
535
+ 'label_for' => 'bpfwp-settings[clickphone]',
536
+ 'class' => 'bpfwp-clickphone'
537
+ )
538
+ )
539
+ );
540
+
541
+ $sap->add_setting(
542
+ 'bpfwp-settings',
543
+ 'bpfwp-contact',
544
+ 'text',
545
+ array(
546
+ 'id' => 'whatsapp',
547
+ 'title' => __( 'Whatsapp', 'business-profile' ),
548
+ 'description' => __( 'This is a full phone number in international format. Omit any zeroes, brackets, or dashes when adding the phone number in international format.<br>Examples:<br>Use: 1XXXXXXXXXX<br>Don\'t use: +001-(XXX)XXXXXXX', 'business-profile' ),
549
+ 'args' => array(
550
+ 'label_for' => 'bpfwp-settings[phone]',
551
+ 'class' => 'bpfwp-phone'
552
+ )
553
+ )
554
+ );
555
+
556
+ $sap->add_setting(
557
+ 'bpfwp-settings',
558
+ 'bpfwp-contact',
559
+ 'text',
560
+ array(
561
+ 'id' => 'whatsapptext',
562
+ 'title' => __( 'Whatsapp Text', 'business-profile' ),
563
+ 'description' => __( 'The pre-filled message will automatically appear in the text field of a chat.', 'business-profile' ),
564
+ 'args' => array(
565
+ 'label_for' => 'bpfwp-settings[clickphone]',
566
+ 'class' => 'bpfwp-clickphone'
567
+ )
568
+ )
569
+ );
570
+
571
+ $sap->add_setting(
572
+ 'bpfwp-settings',
573
+ 'bpfwp-contact',
574
+ 'text',
575
+ array(
576
+ 'id' => 'fax',
577
+ 'title' => __( 'Fax', 'business-profile' ),
578
+ 'args' => array(
579
+ 'label_for' => 'bpfwp-settings[phone]',
580
+ 'class' => 'bpfwp-phone'
581
+ )
582
+ )
583
+ );
584
+
585
  $sap->add_setting(
586
  'bpfwp-settings',
587
  'bpfwp-contact',
658
  'saturday' => _x( 'Sa', 'Saturday abbreviation', 'business-profile' ),
659
  'sunday' => _x( 'Su', 'Sunday abbreviation', 'business-profile' ),
660
  ),
661
+ 'time_format' => $this->get_setting( 'time-format' ),
662
+ 'date_format' => $this->get_setting( 'date-format' ),
663
  'disable_weeks' => true,
664
  'disable_date' => true,
665
  'strings' => array(
701
  'id' => 'exceptions',
702
  'title' => __( 'Exceptions', 'business-profile' ),
703
  'description' => __( '<strong>This feature requires at least version 5.3 of WordPress.</strong> Define special opening hours for holidays, events or other needs. Leave the time empty if you\'re closed all day.', 'business-profile' ),
704
+ 'time_format' => $this->get_setting( 'time-format' ),
705
+ 'date_format' => $this->get_setting( 'date-format' ),
706
  'disable_weekdays' => true,
707
  'disable_weeks' => true,
708
  'strings' => array(
732
  ),
733
  )
734
  );
735
+
736
+ $sap->add_setting(
737
+ 'bpfwp-settings',
738
+ 'bpfwp-schedule',
739
+ 'text',
740
+ array(
741
+ 'id' => 'date-format',
742
+ 'title' => __( 'Date Format', 'business-profile' ),
743
+ 'description' => __( 'Date format displayed in the opening hours setting panel in your admin area. Must match formatting rules at https://amsul.ca/pickadate.js/date/#formats', 'business-profile' ),
744
+ 'placeholder' => $this->defaults['date-format'],
745
+ )
746
+ );
747
+
748
+ $sap->add_setting(
749
+ 'bpfwp-settings',
750
+ 'bpfwp-schedule',
751
+ 'text',
752
+ array(
753
+ 'id' => 'time-format',
754
+ 'title' => __( 'Time Format', 'business-profile' ),
755
+ 'description' => __( 'Time format displayed in the opening hours setting panel in your admin area. Must match formatting rules at https://amsul.ca/pickadate.js/time/#formats. (The time format on the front end uses your WordPress settings.)', 'business-profile' ),
756
+ 'placeholder' => $this->defaults['time-format'],
757
+ )
758
+ );
759
 
760
  $sap->add_section(
761
  'bpfwp-settings',
853
  'callback' => $this->premium_info( 'premium' )
854
  )
855
  );
856
+
857
+ // "Labelling" Tab
858
+ $sap->add_section(
859
+ 'bpfwp-settings',
860
+ array(
861
+ 'id' => 'bpfwp-labelling-tab',
862
+ 'title' => __( 'Labelling', 'business-profile' ),
863
+ 'is_tab' => true,
864
+ 'show_submit_button' => $this->show_submit_button( 'labelling' )
865
+ )
866
+ );
867
+ $sap->add_section(
868
+ 'bpfwp-settings',
869
+ array(
870
+ 'id' => 'bpfwp-labelling-tab-body',
871
+ 'tab' => 'bpfwp-labelling-tab',
872
+ 'callback' => $this->premium_info( 'labelling' )
873
+ )
874
+ );
875
 
876
  $sap = apply_filters( 'bpfwp_settings_page', $sap, $this );
877
 
931
  </div>
932
  ';
933
 
934
+ break;
935
+
936
+ case 'labelling':
937
+
938
+ $content = '
939
+ <div class="bpfwp-settings-preview">
940
+ <h2>' . __( 'Labelling', 'business-profile' ) . '<span>' . __( 'Premium', 'business-profile' ) . '</span></h2>
941
+ <p>' . __( 'The labelling options let you change the wording of the different labels that appear on the front end of the plugin. You can use this to translate them, customize the wording for your purpose, etc.', 'business-profile' ) . '</p>
942
+ <div class="bpfwp-settings-preview-images">
943
+ <img src="' . BPFWP_PLUGIN_URL . '/assets/img/premium-screenshots/labelling1.png" alt="BPFWP labelling screenshot" />
944
+ </div>
945
+ ' . $premium_features . '
946
+ </div>
947
+ ';
948
+
949
  break;
950
  }
951
 
includes/patterns/address.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Address
4
+ */
5
+ return array(
6
+ 'title' => __( 'Address', 'business-profile' ),
7
+ 'description' => _x( 'Displays the address from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-address"} -->
10
+ <div class="wp-block-group bpfwp-pattern-address"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/cell-phone.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Cell Phone
4
+ */
5
+ return array(
6
+ 'title' => __( 'Cell Phone Number', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the (clickable) cell phone number from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-cell-phone"} -->
10
+ <div class="wp-block-group bpfwp-pattern-cell-phone"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/contact-card.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Contact card
4
+ */
5
+ return array(
6
+ 'title' => __( 'Contact Card', 'business-profile' ),
7
+ 'description' => _x( 'Adds a contact card', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-contact-card"} -->
10
+ <div class="wp-block-group bpfwp-pattern-contact-card"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/email.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Email
4
+ */
5
+ return array(
6
+ 'title' => __( 'Email Address', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the email address from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-email"} -->
10
+ <div class="wp-block-group bpfwp-pattern-email"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/fax.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Fax
4
+ */
5
+ return array(
6
+ 'title' => __( 'Fax', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the fax number from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-fax"} -->
10
+ <div class="wp-block-group bpfwp-pattern-fax"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/hours.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Opening Hours
4
+ */
5
+ return array(
6
+ 'title' => __( 'Opening Hours', 'business-profile' ),
7
+ 'description' => _x( 'Displays the opening hours from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-hours"} -->
10
+ <div class="wp-block-group bpfwp-pattern-hours"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/map.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Map
4
+ */
5
+ return array(
6
+ 'title' => __( 'Map', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the map from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-map"} -->
10
+ <div class="wp-block-group bpfwp-pattern-map"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/phone-email.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Phone and Email
4
+ */
5
+ return array(
6
+ 'title' => __( 'Phone and Email', 'business-profile' ),
7
+ 'description' => _x( 'Displays the (clickable) phone number and email address from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-phone-email"} -->
10
+ <div class="wp-block-group bpfwp-pattern-phone-email"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/phone.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Phone
4
+ */
5
+ return array(
6
+ 'title' => __( 'Phone Number', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the (clickable) phone number from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-phone"} -->
10
+ <div class="wp-block-group bpfwp-pattern-phone"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/patterns/whatsapp.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Whatsapp
4
+ */
5
+ return array(
6
+ 'title' => __( 'Whatsapp', 'business-profile' ),
7
+ 'description' => _x( 'Displays just the (clickable) Whatsapp number from your contact card.', 'Block pattern description', 'business-profile' ),
8
+ 'categories' => array( 'bpfwp-block-patterns' ),
9
+ 'content' => '<!-- wp:group {"className":"bpfwp-pattern-whatsapp"} -->
10
+ <div class="wp-block-group bpfwp-pattern-whatsapp"><!-- wp:business-profile/contact-card /--></div>
11
+ <!-- /wp:group -->',
12
+ );
includes/template-functions.php CHANGED
@@ -105,17 +105,7 @@ if ( ! function_exists( 'bpwfwp_print_contact_card' ) ) {
105
  // Setup components and callback functions to render them.
106
  $data = apply_filters(
107
  'bpwfwp_component_callbacks',
108
- array(
109
- 'name' => 'bpwfwp_print_name',
110
- 'address' => 'bpwfwp_print_address',
111
- 'phone' => 'bpwfwp_print_phone',
112
- 'ordering-link' => 'bpfwp_print_ordering_link',
113
- 'contact' => 'bpwfwp_print_contact',
114
- 'exceptions' => 'bpwfwp_print_exceptions',
115
- 'opening_hours' => 'bpwfwp_print_opening_hours', // opening-hours
116
- 'map' => 'bpwfwp_print_map',
117
- 'parent_organization' => 'bpfwp_print_parent_organization'
118
- )
119
  );
120
 
121
  if ( ! $bpfwp_controller->get_theme_support( 'disable_styles' ) ) {
@@ -283,7 +273,14 @@ if ( ! function_exists( 'bpwfwp_print_phone' ) ) {
283
  */
284
  function bpwfwp_print_phone( $location = false ) {
285
 
286
- $return_data = array();
 
 
 
 
 
 
 
287
 
288
  $phone = bpfwp_setting( 'phone', $location );
289
  $click_to_call_phone = bpfwp_setting( 'clickphone', $location );
@@ -299,12 +296,135 @@ if ( ! function_exists( 'bpwfwp_print_phone' ) ) {
299
  if ( bpfwp_get_display( 'show_phone' ) ) : ?>
300
 
301
  <div class="bp-phone">
302
- <a href="tel:<?php echo esc_attr( $click_to_call_phone ); ?>"><?php echo esc_html( bpfwp_setting( 'phone', $location ) ); ?></a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
  </div>
304
 
305
  <?php endif;
306
 
307
- $return_data['telephone'] = bpfwp_setting( 'phone', $location );
308
 
309
  return $return_data;
310
  }
@@ -352,8 +472,10 @@ if ( ! function_exists( 'bpwfwp_print_contact' ) ) {
352
 
353
  <?php
354
  $return_data['ContactPoint'] = array(
355
- 'contactType' => 'customer support',
356
- 'url' => get_permalink( $contact ),
 
 
357
  );
358
 
359
  endif;
@@ -852,6 +974,28 @@ if ( ! function_exists( 'bpfwp_print_parent_organization' ) ) {
852
  }
853
  }
854
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
855
  if ( ! function_exists( 'bpfwp_json_ld_contact_print' ) ) {
856
  /**
857
  * Recursively print out an array of $key => $value pairs of json+ld data
105
  // Setup components and callback functions to render them.
106
  $data = apply_filters(
107
  'bpwfwp_component_callbacks',
108
+ bpfwp_get_contact_card_fields()
 
 
 
 
 
 
 
 
 
 
109
  );
110
 
111
  if ( ! $bpfwp_controller->get_theme_support( 'disable_styles' ) ) {
273
  */
274
  function bpwfwp_print_phone( $location = false ) {
275
 
276
+ $return_data = array(
277
+ 'contactPoint' => array(
278
+ array(
279
+ '@type' => 'ContactPoint',
280
+ 'contactType' => 'Telephone'
281
+ )
282
+ )
283
+ );
284
 
285
  $phone = bpfwp_setting( 'phone', $location );
286
  $click_to_call_phone = bpfwp_setting( 'clickphone', $location );
296
  if ( bpfwp_get_display( 'show_phone' ) ) : ?>
297
 
298
  <div class="bp-phone">
299
+ <a href="tel:<?php echo esc_attr( $click_to_call_phone ); ?>"><?php echo esc_html( $phone ); ?></a>
300
+ </div>
301
+
302
+ <?php endif;
303
+
304
+ $return_data['contactPoint'][0]['telephone'] = $phone;
305
+
306
+ return $return_data;
307
+ }
308
+ }
309
+
310
+ if ( ! function_exists( 'bpwfwp_print_cell_phone' ) ) {
311
+ /**
312
+ * Print the phone number.
313
+ *
314
+ * @since 2.2.3
315
+ * @access public
316
+ * @param string $location The location associated with the phone.
317
+ * @return array
318
+ */
319
+ function bpwfwp_print_cell_phone( $location = false ) {
320
+
321
+ $return_data = array(
322
+ 'contactPoint' => array(
323
+ array(
324
+ '@type' => 'ContactPoint',
325
+ 'contactType' => 'Cell Phone'
326
+ )
327
+ )
328
+ );
329
+
330
+ $cell_phone = bpfwp_setting( 'cell-phone', $location );
331
+ $click_to_call_phone = bpfwp_setting( 'clickcellphone', $location );
332
+
333
+ if ( $click_to_call_phone == '' ) {
334
+ $click_to_call_phone = $cell_phone;
335
+ }
336
+
337
+ if ( empty( $cell_phone ) ) {
338
+ return '';
339
+ }
340
+
341
+ if ( bpfwp_get_display( 'show_cell_phone' ) ) : ?>
342
+
343
+ <div class="bp-cell-phone">
344
+ <a href="tel:<?php echo esc_attr( $click_to_call_phone ); ?>"><?php echo esc_html( $cell_phone ); ?></a>
345
+ </div>
346
+
347
+ <?php endif;
348
+
349
+ $return_data['contactPoint'][0]['telephone'] = $cell_phone;
350
+
351
+ return $return_data;
352
+ }
353
+ }
354
+
355
+ if ( ! function_exists( 'bpwfwp_print_whatsapp_phone' ) ) {
356
+ /**
357
+ * Print the phone number.
358
+ *
359
+ * @since 2.2.3
360
+ * @access public
361
+ * @param string $location The location associated with the whatsapp.
362
+ * @return array
363
+ */
364
+ function bpwfwp_print_whatsapp_phone( $location = false ) {
365
+
366
+ $return_data = array(
367
+ 'contactPoint' => array(
368
+ array(
369
+ '@type' => 'ContactPoint',
370
+ 'contactType' => 'Whatsapp'
371
+ )
372
+ )
373
+ );
374
+
375
+ $whatsapp = bpfwp_setting( 'whatsapp', $location );
376
+ $whatsapp_txt = bpfwp_setting( 'whatsapptext', $location );
377
+
378
+ if ( empty( $whatsapp ) ) {
379
+ return '';
380
+ }
381
+
382
+ if( !empty( $whatsapp_txt ) ) {
383
+ $whatsapp_txt = '?text='.urlencode( $whatsapp_txt );
384
+ }
385
+
386
+ if ( bpfwp_get_display( 'show_whatsapp' ) ) : ?>
387
+
388
+ <div class="bp-whatsapp">
389
+ <a href="https://wa.me/<?php echo esc_attr( $whatsapp . $whatsapp_txt ); ?>"><?php echo esc_html( $whatsapp ); ?></a>
390
+ </div>
391
+
392
+ <?php endif;
393
+
394
+ $return_data['contactPoint'][0]['telephone'] = $whatsapp;
395
+
396
+ return $return_data;
397
+ }
398
+ }
399
+
400
+ if ( ! function_exists( 'bpwfwp_print_fax' ) ) {
401
+ /**
402
+ * Print the phone number.
403
+ *
404
+ * @since 2.2.3
405
+ * @access public
406
+ * @param string $location The location associated with the fax number.
407
+ * @return array
408
+ */
409
+ function bpwfwp_print_fax( $location = false ) {
410
+
411
+ $return_data = array();
412
+
413
+ $fax = bpfwp_setting( 'fax', $location );
414
+
415
+ if ( empty( $fax ) ) {
416
+ return '';
417
+ }
418
+
419
+ if ( bpfwp_get_display( 'show_fax' ) ) : ?>
420
+
421
+ <div class="bp-fax">
422
+ <a href="fax:<?php echo esc_attr( $fax ); ?>"><?php echo esc_html( $fax ); ?></a>
423
  </div>
424
 
425
  <?php endif;
426
 
427
+ $return_data['faxNumber'] = $fax;
428
 
429
  return $return_data;
430
  }
472
 
473
  <?php
474
  $return_data['ContactPoint'] = array(
475
+ array(
476
+ 'contactType' => 'customer support',
477
+ 'url' => get_permalink( $contact ),
478
+ )
479
  );
480
 
481
  endif;
974
  }
975
  }
976
 
977
+ function bpfwp_get_contact_card_fields() {
978
+ global $bpfwp_controller;
979
+
980
+ return array_replace(
981
+ (array) json_decode( $bpfwp_controller->settings->get_setting( 'contact-card-elements-order' ) ),
982
+ array(
983
+ 'name' => 'bpwfwp_print_name',
984
+ 'address' => 'bpwfwp_print_address',
985
+ 'phone' => 'bpwfwp_print_phone',
986
+ 'cell_phone' => 'bpwfwp_print_cell_phone',
987
+ 'whatsapp' => 'bpwfwp_print_whatsapp_phone',
988
+ 'fax_phone' => 'bpwfwp_print_fax',
989
+ 'ordering-link' => 'bpfwp_print_ordering_link',
990
+ 'contact' => 'bpwfwp_print_contact',
991
+ 'exceptions' => 'bpwfwp_print_exceptions',
992
+ 'opening_hours' => 'bpwfwp_print_opening_hours', // opening-hours
993
+ 'map' => 'bpwfwp_print_map',
994
+ 'parent_organization' => 'bpfwp_print_parent_organization'
995
+ )
996
+ );
997
+ }
998
+
999
  if ( ! function_exists( 'bpfwp_json_ld_contact_print' ) ) {
1000
  /**
1001
  * Recursively print out an array of $key => $value pairs of json+ld data
readme.txt CHANGED
@@ -5,7 +5,7 @@ Plugin URL: https://www.fivestarplugins.com/plugins/business-profile/
5
  Requires at Least: 5.3
6
  Tested Up To: 6.0
7
  Tags: business profile, seo, local seo, schema, address, google map, contact, phone, contact card, vcard, contact info, business location, business address, business map, business schema, organization schema, corporation schema, contact schema, address schema, location schema, map schema, business structured data, business microdata, address microdata, location structured data, location microdata, contact shortcode, location shortcode, address shortcode, schema shortcode, gutenberg schema, gutenberg address
8
- Stable tag: 2.2.2
9
  License: GPLv3
10
  License URI:http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -192,6 +192,13 @@ You'll find more help in the [User Guide](http://doc.themeofthecrop.com/plugins/
192
 
193
  == Changelog ==
194
 
 
 
 
 
 
 
 
195
  = 2.2.2 (2022-05-20) =
196
  - Tested with WordPress 6.0.
197
 
5
  Requires at Least: 5.3
6
  Tested Up To: 6.0
7
  Tags: business profile, seo, local seo, schema, address, google map, contact, phone, contact card, vcard, contact info, business location, business address, business map, business schema, organization schema, corporation schema, contact schema, address schema, location schema, map schema, business structured data, business microdata, address microdata, location structured data, location microdata, contact shortcode, location shortcode, address shortcode, schema shortcode, gutenberg schema, gutenberg address
8
+ Stable tag: 2.2.3
9
  License: GPLv3
10
  License URI:http://www.gnu.org/licenses/gpl-3.0.html
11
 
192
 
193
  == Changelog ==
194
 
195
+ = 2.2.3 (2022-08-03) =
196
+ - Introducing new block patterns, which can be used to integrate contact card info directly into your block-based theme templates.
197
+ - Added fields for cell phone, fax and Whatsapp.
198
+ - Added a new (premium) option that lets you re-order the elements in the contact card.
199
+ - Added in date and time formatting options for the scheduler in the admin.
200
+ - Fixed some issues with the layout/styling of the schema meta box on the post and product (WooCommerce) edit screens.
201
+
202
  = 2.2.2 (2022-05-20) =
203
  - Tested with WordPress 6.0.
204