Merged in feature/102-dev-dev01 (pull request #6)

auto-patch  102-dev-dev01-2023-12-11T19_15_32

* auto-patch  102-dev-dev01-2023-12-11T19_15_32
This commit is contained in:
Tony Volpe
2023-12-11 19:17:10 +00:00
parent 725d3043d5
commit b721d2fd4a
23 changed files with 3956 additions and 3887 deletions

View File

@@ -1,258 +1,258 @@
<?php
/**
* BSF analytics stat class file.
*
* @package bsf-analytics
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'BSF_Analytics_Stats' ) ) {
/**
* BSF analytics stat class.
*/
class BSF_Analytics_Stats {
/**
* Active plugins.
*
* Holds the sites active plugins list.
*
* @var array
*/
private $plugins;
/**
* Instance of BSF_Analytics_Stats.
*
* Holds only the first object of class.
*
* @var object
*/
private static $instance = null;
/**
* Create only once instance of a class.
*
* @return object
* @since 1.0.0
*/
public static function instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Get stats.
*
* @return array stats data.
* @since 1.0.0
*/
public function get_stats() {
return apply_filters( 'bsf_core_stats', $this->get_default_stats() );
}
/**
* Retrieve stats for site.
*
* @return array stats data.
* @since 1.0.0
*/
private function get_default_stats() {
return array(
'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false,
'domain_name' => get_site_url(),
'php_os' => PHP_OS,
'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ), FILTER_SANITIZE_STRING ) : '',
'mysql_version' => $this->get_mysql_version(),
'php_version' => $this->get_php_version(),
'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound
'php_post_max_size' => ini_get( 'post_max_size' ),
'php_max_execution_time' => ini_get( 'max_execution_time' ),
'php_memory_limit' => ini_get( 'memory_limit' ),
'zip_installed' => extension_loaded( 'zip' ),
'imagick_availabile' => extension_loaded( 'imagick' ),
'xmlreader_exists' => class_exists( 'XMLReader' ),
'gd_available' => extension_loaded( 'gd' ),
'curl_version' => $this->get_curl_version(),
'curl_ssl_version' => $this->get_curl_ssl_version(),
'is_writable' => $this->is_content_writable(),
'wp_version' => get_bloginfo( 'version' ),
'user_count' => $this->get_user_count(),
'posts_count' => wp_count_posts()->publish,
'page_count' => wp_count_posts( 'page' )->publish,
'site_language' => get_locale(),
'timezone' => wp_timezone_string(),
'is_ssl' => is_ssl(),
'is_multisite' => is_multisite(),
'network_url' => network_site_url(),
'external_object_cache' => (bool) wp_using_ext_object_cache(),
'wp_debug' => WP_DEBUG,
'wp_debug_display' => WP_DEBUG_DISPLAY,
'script_debug' => SCRIPT_DEBUG,
'active_plugins' => $this->get_active_plugins(),
'active_theme' => get_template(),
'active_stylesheet' => get_stylesheet(),
);
}
/**
* Get installed PHP version.
*
* @return float PHP version.
* @since 1.0.0
*/
private function get_php_version() {
if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore
return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
}
return phpversion();
}
/**
* User count on site.
*
* @return int User count.
* @since 1.0.0
*/
private function get_user_count() {
if ( is_multisite() ) {
$user_count = get_user_count();
} else {
$count = count_users();
$user_count = $count['total_users'];
}
return $user_count;
}
/**
* Get active plugin's data.
*
* @return array active plugin's list.
* @since 1.0.0
*/
private function get_active_plugins() {
if ( ! $this->plugins ) {
// Ensure get_plugin_data function is loaded.
if ( ! function_exists( 'get_plugin_data' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$plugins = wp_get_active_and_valid_plugins();
$plugins = array_map( 'get_plugin_data', $plugins );
$this->plugins = array_map( array( $this, 'format_plugin' ), $plugins );
}
return $this->plugins;
}
/**
* Format plugin data.
*
* @param string $plugin plugin.
* @return array formatted plugin data.
* @since 1.0.0
*/
public function format_plugin( $plugin ) {
return array(
'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ),
'url' => $plugin['PluginURI'],
'version' => $plugin['Version'],
'slug' => $plugin['TextDomain'],
'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ),
'author_url' => $plugin['AuthorURI'],
);
}
/**
* Curl SSL version.
*
* @return float SSL version.
* @since 1.0.0
*/
private function get_curl_ssl_version() {
$curl = array();
if ( function_exists( 'curl_version' ) ) {
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
}
return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false;
}
/**
* Get cURL version.
*
* @return float cURL version.
* @since 1.0.0
*/
private function get_curl_version() {
if ( function_exists( 'curl_version' ) ) {
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
}
return isset( $curl['version'] ) ? $curl['version'] : false;
}
/**
* Get MySQL version.
*
* @return float MySQL version.
* @since 1.0.0
*/
private function get_mysql_version() {
global $wpdb;
return $wpdb->db_version();
}
/**
* Check if content directory is writable.
*
* @return bool
* @since 1.0.0
*/
private function is_content_writable() {
$upload_dir = wp_upload_dir();
return wp_is_writable( $upload_dir['basedir'] );
}
}
}
/**
* Polyfill for sites using WP version less than 5.3
*/
if ( ! function_exists( 'wp_timezone_string' ) ) {
/**
* Get timezone string.
*
* @return string timezone string.
* @since 1.0.0
*/
function wp_timezone_string() {
$timezone_string = get_option( 'timezone_string' );
if ( $timezone_string ) {
return $timezone_string;
}
$offset = (float) get_option( 'gmt_offset' );
$hours = (int) $offset;
$minutes = ( $offset - $hours );
$sign = ( $offset < 0 ) ? '-' : '+';
$abs_hour = abs( $hours );
$abs_mins = abs( $minutes * 60 );
$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
return $tz_offset;
}
}
<?php
/**
* BSF analytics stat class file.
*
* @package bsf-analytics
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'BSF_Analytics_Stats' ) ) {
/**
* BSF analytics stat class.
*/
class BSF_Analytics_Stats {
/**
* Active plugins.
*
* Holds the sites active plugins list.
*
* @var array
*/
private $plugins;
/**
* Instance of BSF_Analytics_Stats.
*
* Holds only the first object of class.
*
* @var object
*/
private static $instance = null;
/**
* Create only once instance of a class.
*
* @return object
* @since 1.0.0
*/
public static function instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Get stats.
*
* @return array stats data.
* @since 1.0.0
*/
public function get_stats() {
return apply_filters( 'bsf_core_stats', $this->get_default_stats() );
}
/**
* Retrieve stats for site.
*
* @return array stats data.
* @since 1.0.0
*/
private function get_default_stats() {
return array(
'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false,
'domain_name' => get_site_url(),
'php_os' => PHP_OS,
'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ), FILTER_SANITIZE_STRING ) : '',
'mysql_version' => $this->get_mysql_version(),
'php_version' => $this->get_php_version(),
'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound
'php_post_max_size' => ini_get( 'post_max_size' ),
'php_max_execution_time' => ini_get( 'max_execution_time' ),
'php_memory_limit' => ini_get( 'memory_limit' ),
'zip_installed' => extension_loaded( 'zip' ),
'imagick_availabile' => extension_loaded( 'imagick' ),
'xmlreader_exists' => class_exists( 'XMLReader' ),
'gd_available' => extension_loaded( 'gd' ),
'curl_version' => $this->get_curl_version(),
'curl_ssl_version' => $this->get_curl_ssl_version(),
'is_writable' => $this->is_content_writable(),
'wp_version' => get_bloginfo( 'version' ),
'user_count' => $this->get_user_count(),
'posts_count' => wp_count_posts()->publish,
'page_count' => wp_count_posts( 'page' )->publish,
'site_language' => get_locale(),
'timezone' => wp_timezone_string(),
'is_ssl' => is_ssl(),
'is_multisite' => is_multisite(),
'network_url' => network_site_url(),
'external_object_cache' => (bool) wp_using_ext_object_cache(),
'wp_debug' => WP_DEBUG,
'wp_debug_display' => WP_DEBUG_DISPLAY,
'script_debug' => SCRIPT_DEBUG,
'active_plugins' => $this->get_active_plugins(),
'active_theme' => get_template(),
'active_stylesheet' => get_stylesheet(),
);
}
/**
* Get installed PHP version.
*
* @return float PHP version.
* @since 1.0.0
*/
private function get_php_version() {
if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore
return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
}
return phpversion();
}
/**
* User count on site.
*
* @return int User count.
* @since 1.0.0
*/
private function get_user_count() {
if ( is_multisite() ) {
$user_count = get_user_count();
} else {
$count = count_users();
$user_count = $count['total_users'];
}
return $user_count;
}
/**
* Get active plugin's data.
*
* @return array active plugin's list.
* @since 1.0.0
*/
private function get_active_plugins() {
if ( ! $this->plugins ) {
// Ensure get_plugin_data function is loaded.
if ( ! function_exists( 'get_plugin_data' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$plugins = wp_get_active_and_valid_plugins();
$plugins = array_map( 'get_plugin_data', $plugins );
$this->plugins = array_map( array( $this, 'format_plugin' ), $plugins );
}
return $this->plugins;
}
/**
* Format plugin data.
*
* @param string $plugin plugin.
* @return array formatted plugin data.
* @since 1.0.0
*/
public function format_plugin( $plugin ) {
return array(
'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ),
'url' => $plugin['PluginURI'],
'version' => $plugin['Version'],
'slug' => $plugin['TextDomain'],
'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ),
'author_url' => $plugin['AuthorURI'],
);
}
/**
* Curl SSL version.
*
* @return float SSL version.
* @since 1.0.0
*/
private function get_curl_ssl_version() {
$curl = array();
if ( function_exists( 'curl_version' ) ) {
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
}
return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false;
}
/**
* Get cURL version.
*
* @return float cURL version.
* @since 1.0.0
*/
private function get_curl_version() {
if ( function_exists( 'curl_version' ) ) {
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
}
return isset( $curl['version'] ) ? $curl['version'] : false;
}
/**
* Get MySQL version.
*
* @return float MySQL version.
* @since 1.0.0
*/
private function get_mysql_version() {
global $wpdb;
return $wpdb->db_version();
}
/**
* Check if content directory is writable.
*
* @return bool
* @since 1.0.0
*/
private function is_content_writable() {
$upload_dir = wp_upload_dir();
return wp_is_writable( $upload_dir['basedir'] );
}
}
}
/**
* Polyfill for sites using WP version less than 5.3
*/
if ( ! function_exists( 'wp_timezone_string' ) ) {
/**
* Get timezone string.
*
* @return string timezone string.
* @since 1.0.0
*/
function wp_timezone_string() {
$timezone_string = get_option( 'timezone_string' );
if ( $timezone_string ) {
return $timezone_string;
}
$offset = (float) get_option( 'gmt_offset' );
$hours = (int) $offset;
$minutes = ( $offset - $hours );
$sign = ( $offset < 0 ) ? '-' : '+';
$abs_hour = abs( $hours );
$abs_mins = abs( $minutes * 60 );
$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
return $tz_offset;
}
}

View File

@@ -1,3 +1,7 @@
v2.7.11
# Improvement: Added new required properties in Course Schema - offers, courseWorkload / courseSchedule.
# Fix: Corrected syntax for FAQ schema type.
v2.7.10
# Improvement: Improved codebase for improved security.
# Improvement: Added Clip and SeekToAction fields in Video Object schema.

View File

@@ -605,6 +605,12 @@ if ( ! class_exists( 'BSF_AIOSRS_Pro_Schema' ) ) {
'default' => 'create-field',
'description' => esc_html__( 'The organization that publishes the source content of the course. For example, UC Berkeley.', 'wp-schema-pro' ),
),
'offer-category' => array(
'label' => esc_html__( 'Offer Category', 'wp-schema-pro' ),
'type' => 'text',
'default' => 'none',
'description' => esc_html__( 'The pricing category of the course.(e.g. Free, Partially Free, Subscription, Paid).', 'wp-schema-pro' ),
),
'course-instance' => array(
'label' => esc_html__( 'Course Instance', 'wp-schema-pro' ),
'type' => 'repeater',
@@ -662,6 +668,25 @@ if ( ! class_exists( 'BSF_AIOSRS_Pro_Schema' ) ) {
'type' => 'date',
'default' => 'none',
),
'repeat-count' => array(
'label' => esc_html__( 'Repeat Count', 'wp-schema-pro' ),
'type' => 'number',
'default' => 'none',
'attrs' => array(
'min' => '0',
'step' => 'any',
),
),
'repeat-frequency' => array(
'label' => esc_html__( 'Repeat Frequency', 'wp-schema-pro' ),
'type' => 'text',
'default' => 'none',
),
'course-workload' => array(
'label' => esc_html__( 'Course Workload', 'wp-schema-pro' ),
'type' => 'text',
'default' => 'none',
),
'previous-date' => array(
'label' => esc_html__( 'Course Previous Start Date', 'wp-schema-pro' ),
'type' => 'datetime-local',

View File

@@ -34,6 +34,9 @@ if ( ! class_exists( 'BSF_AIOSRS_Pro_Schema_Course' ) ) {
$schema['description'] = ! empty( $data['description'] ) ? wp_strip_all_tags( (string) $data['description'] ) : null;
$schema['offers']['@type'] = 'Offer';
$schema['offers']['category'] = ! empty( $data['offer-category'] ) ? wp_strip_all_tags( (string) $data['offer-category'] ) : null;;
if ( isset( $data['course-instance'] ) && ! empty( $data['course-instance'] ) ) {
foreach ( $data['course-instance'] as $key => $value ) {
@@ -50,6 +53,25 @@ if ( ! class_exists( 'BSF_AIOSRS_Pro_Schema_Course' ) ) {
$schema['hasCourseInstance'][ $key ]['courseMode'] = ! empty( $value['course-mode'] ) ? wp_strip_all_tags( (string) $value['course-mode'] ) : null;
if ( ! empty( $value['course-workload'] ) ) {
$schema['hasCourseInstance'][ $key ]['courseWorkload'] = ! empty( $value['course-workload'] ) ? wp_strip_all_tags( (string) $value['course-workload'] ) : null;
} else if ( ! empty( $value['repeat-count'] ) && ! empty( $value['repeat-frequency'] ) ) {
$schema['hasCourseInstance'][ $key ]['courseSchedule']['@type'] = 'Schedule';
$schema['hasCourseInstance'][ $key ]['courseSchedule']['repeatCount'] = ! empty( $value['repeat-count'] ) ? wp_strip_all_tags( (string) $value['repeat-count'] ) : null;
$schema['hasCourseInstance'][ $key ]['courseSchedule']['repeatFrequency'] = ! empty( $value['repeat-frequency'] ) ? wp_strip_all_tags( (string) $value['repeat-frequency'] ) : null;
if ( ! empty( $value['start-date'] ) ) {
if ( 'OfflineEventAttendanceMode' !== isset( $value['event-attendance-mode'] ) ) {
$start_date = gmdate( DATE_ISO8601, strtotime( $value['start-date'] ) );
$schema['hasCourseInstance'][ $key ]['courseSchedule']['startDate'] = wp_strip_all_tags( (string) $start_date );
} else {
$schema['hasCourseInstance'][ $key ]['courseSchedule']['startDate'] = wp_strip_all_tags( (string) $value['start-date'] );
}
}
if ( ! empty( $value['end-date'] ) ) {
$schema['hasCourseInstance'][ $key ]['courseSchedule']['endDate'] = ! empty( $value['end-date'] ) ? wp_strip_all_tags( (string) $value['end-date'] ) : null;
}
}
$schema['hasCourseInstance'][ $key ]['eventStatus'] = ! empty( $value['event-status'] ) ? wp_strip_all_tags( (string) $value['event-status'] ) : null;
$schema['hasCourseInstance'][ $key ]['eventAttendanceMode'] = ! empty( $value['event-attendance-mode'] ) ? wp_strip_all_tags( (string) $value['event-attendance-mode'] ) : null;

View File

@@ -28,7 +28,7 @@ if ( ! class_exists( 'BSF_AIOSRS_Pro_Schema_FAQ' ) ) {
if ( isset( $data['question-answer'][0]['question'] ) && ! empty( $data['question-answer'][0]['question'] ) ) {
$schema['@context'] = 'https://schema.org';
$schema['type'] = 'FAQPage';
$schema['@type'] = 'FAQPage';
foreach ( $data['question-answer'] as $key => $value ) {
if ( isset( $value['question'] ) && ! empty( $value['question'] ) ) {
$schema['mainEntity'][ $key ]['@type'] = 'Question';

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
* Author: Brainstorm Force
* Author URI: https://www.brainstormforce.com
* Description: Schema Pro is the go-to plugin to adding Schema Markup on your website with ease. Enables you to display rich snippets on search engines and improve your overall page SEO.
* Version: 2.7.10
* Version: 2.7.11
* Text Domain: wp-schema-pro
* License: GPL2
*
@@ -70,7 +70,7 @@ define( 'BSF_AIOSRS_PRO_FILE', __FILE__ );
define( 'BSF_AIOSRS_PRO_BASE', plugin_basename( BSF_AIOSRS_PRO_FILE ) );
define( 'BSF_AIOSRS_PRO_DIR', plugin_dir_path( BSF_AIOSRS_PRO_FILE ) );
define( 'BSF_AIOSRS_PRO_URI', plugins_url( '/', BSF_AIOSRS_PRO_FILE ) );
define( 'BSF_AIOSRS_PRO_VER', '2.7.10' );
define( 'BSF_AIOSRS_PRO_VER', '2.7.11' );
define( 'BSF_AIOSRS_PRO_CACHE_KEY', 'wp_schema_pro_optimized_structured_data' );
define( 'BSF_AIOSRS_PRO_WEBSITE_URL', 'https://wpschema.com/' );